Skip to content

Commit c9e1e94

Browse files
authored
core: kernel: Allow shared page on MapProcessMemoryEx (azahar-emu#2641)
1 parent cd3af46 commit c9e1e94

3 files changed

Lines changed: 32 additions & 13 deletions

File tree

‎src/core/hle/kernel/kernel.cpp‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright 2014-2026 Citra Emulator Project / Azahar Emulator Project
2-
// Licensed under GPLv2 or any later version
3-
// Refer to the misc/licenses/gplv2.txt file included.
2+
// Licensed under GPLv3 or any later version
3+
// Refer to the LICENSE.txt file included.
44

55
#include <boost/serialization/shared_ptr.hpp>
66
#include <boost/serialization/unordered_map.hpp>
@@ -139,10 +139,18 @@ const SharedPage::Handler& KernelSystem::GetSharedPageHandler() const {
139139
return *shared_page_handler;
140140
}
141141

142+
MemoryRef KernelSystem::GetSharedPageMemoryRef(u64 offset) {
143+
return MemoryRef(shared_page_handler, offset);
144+
}
145+
142146
ConfigMem::Handler& KernelSystem::GetConfigMemHandler() {
143147
return *config_mem_handler;
144148
}
145149

150+
MemoryRef KernelSystem::GetConfigMemMemoryRef(u64 offset) {
151+
return MemoryRef{config_mem_handler, offset};
152+
}
153+
146154
IPCDebugger::Recorder& KernelSystem::GetIPCRecorder() {
147155
return *ipc_recorder;
148156
}

‎src/core/hle/kernel/kernel.h‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright 2014-2026 Citra Emulator Project / Azahar Emulator Project
2-
// Licensed under GPLv2 or any later version
3-
// Refer to the misc/licenses/gplv2.txt file included.
2+
// Licensed under GPLv3 or any later version
3+
// Refer to the LICENSE.txt file included.
44

55
// PPSSPP Project
66
// Licensed under GPLv2 or any later version
@@ -339,8 +339,10 @@ class KernelSystem {
339339

340340
SharedPage::Handler& GetSharedPageHandler();
341341
const SharedPage::Handler& GetSharedPageHandler() const;
342+
MemoryRef GetSharedPageMemoryRef(u64 offset);
342343

343344
ConfigMem::Handler& GetConfigMemHandler();
345+
MemoryRef GetConfigMemMemoryRef(u64 offset);
344346

345347
IPCDebugger::Recorder& GetIPCRecorder();
346348
const IPCDebugger::Recorder& GetIPCRecorder() const;

‎src/core/hle/kernel/svc.cpp‎

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright 2014-2026 Citra Emulator Project / Azahar Emulator Project
2-
// Licensed under GPLv2 or any later version
3-
// Refer to the misc/licenses/gplv2.txt file included.
2+
// Licensed under GPLv3 or any later version
3+
// Refer to the LICENSE.txt file included.
44

55
#include <algorithm>
66
#include <array>
@@ -36,6 +36,7 @@
3636
#include "core/hle/kernel/server_session.h"
3737
#include "core/hle/kernel/session.h"
3838
#include "core/hle/kernel/shared_memory.h"
39+
#include "core/hle/kernel/shared_page.h"
3940
#include "core/hle/kernel/svc.h"
4041
#include "core/hle/kernel/svc_wrapper.h"
4142
#include "core/hle/kernel/thread.h"
@@ -2109,7 +2110,7 @@ Result SVC::MapProcessMemoryEx(Handle dst_process_handle, u32 dst_address,
21092110

21102111
// TODO(PabloMK7) Fix-up this svc.
21112112

2112-
// Only linear memory supported
2113+
// Only FCRAM and kernel shared pages supported
21132114
auto vma = src_process->vm_manager.FindVMA(src_address);
21142115
R_UNLESS(vma != src_process->vm_manager.vma_map.end() &&
21152116
vma->second.type == VMAType::BackingMemory,
@@ -2118,11 +2119,20 @@ Result SVC::MapProcessMemoryEx(Handle dst_process_handle, u32 dst_address,
21182119
const u32 offset = src_address - vma->second.base;
21192120
R_UNLESS(offset + size <= vma->second.size, ResultInvalidAddress);
21202121

2121-
auto vma_res = dst_process->vm_manager.MapBackingMemory(
2122-
dst_address,
2123-
memory.GetFCRAMRef(vma->second.backing_memory.GetPtr() + offset -
2124-
kernel.memory.GetFCRAMPointer(0)),
2125-
size, map_as_private ? MemoryState::Private : MemoryState::Shared);
2122+
MemoryRef src_memory_ref;
2123+
// TODO(PabloMK7): This is hacky, make a proper fix
2124+
if (vma->second.backing_memory.GetPtr() == kernel.GetSharedPageHandler().GetPtr()) {
2125+
src_memory_ref = kernel.GetSharedPageMemoryRef(offset);
2126+
} else if (vma->second.backing_memory.GetPtr() == kernel.GetConfigMemHandler().GetPtr()) {
2127+
src_memory_ref = kernel.GetConfigMemMemoryRef(offset);
2128+
} else {
2129+
src_memory_ref = memory.GetFCRAMRef(vma->second.backing_memory.GetPtr() + offset -
2130+
kernel.memory.GetFCRAMPointer(0));
2131+
}
2132+
2133+
auto vma_res = dst_process->vm_manager.MapBackingMemory(dst_address, src_memory_ref, size,
2134+
map_as_private ? MemoryState::Private
2135+
: MemoryState::Shared);
21262136

21272137
if (!vma_res.Succeeded()) {
21282138
return ResultInvalidAddressState;
@@ -2141,7 +2151,6 @@ Result SVC::UnmapProcessMemoryEx(Handle process, u32 dst_address, u32 size) {
21412151
size = (size & ~0xFFF) + Memory::CITRA_PAGE_SIZE;
21422152
}
21432153

2144-
// Only linear memory supported
21452154
auto vma = dst_process->vm_manager.FindVMA(dst_address);
21462155
R_UNLESS(vma != dst_process->vm_manager.vma_map.end() &&
21472156
vma->second.type == VMAType::BackingMemory,

0 commit comments

Comments
 (0)