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>
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