forked from moonpower/azahar-UWP
Match changes to svcMapProcessMemoryEx from latest Luma3DS (#264)
This commit is contained in:
@@ -179,6 +179,8 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map(
|
||||
4 * 1024 * 1024 // 4 MiB
|
||||
};
|
||||
|
||||
const bool is_mem_private = header.infos.flags.use_private_memory != 0;
|
||||
|
||||
// Map memory block. This behaviour mimics how plugins are loaded on 3DS as much as possible.
|
||||
// Calculate the sizes of the different memory regions
|
||||
const u32 block_size = mem_region_sizes[header.infos.flags.memory_region_size.Value()];
|
||||
@@ -199,7 +201,8 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map(
|
||||
std::fill(backing_memory_fb.GetPtr(), backing_memory_fb.GetPtr() + _3GX_fb_size, 0);
|
||||
|
||||
auto vma_heap_fb = process.vm_manager.MapBackingMemory(
|
||||
_3GX_heap_load_addr, backing_memory_fb, _3GX_fb_size, Kernel::MemoryState::Continuous);
|
||||
_3GX_heap_load_addr, backing_memory_fb, _3GX_fb_size,
|
||||
is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared);
|
||||
ASSERT(vma_heap_fb.Succeeded());
|
||||
process.vm_manager.Reprotect(vma_heap_fb.Unwrap(), Kernel::VMAPermission::ReadWrite);
|
||||
|
||||
@@ -217,7 +220,8 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map(
|
||||
|
||||
// Then we map part of the memory, which contains the executable
|
||||
auto vma = process.vm_manager.MapBackingMemory(_3GX_exe_load_addr, backing_memory, exe_size,
|
||||
Kernel::MemoryState::Continuous);
|
||||
is_mem_private ? Kernel::MemoryState::Private
|
||||
: Kernel::MemoryState::Shared);
|
||||
ASSERT(vma.Succeeded());
|
||||
process.vm_manager.Reprotect(vma.Unwrap(), Kernel::VMAPermission::ReadWriteExecute);
|
||||
|
||||
@@ -256,7 +260,8 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map(
|
||||
// Map the rest of the memory at the heap location
|
||||
auto vma_heap = process.vm_manager.MapBackingMemory(
|
||||
_3GX_heap_load_addr + _3GX_fb_size, backing_memory_heap,
|
||||
block_size - exe_size - _3GX_fb_size, Kernel::MemoryState::Continuous);
|
||||
block_size - exe_size - _3GX_fb_size,
|
||||
is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared);
|
||||
ASSERT(vma_heap.Succeeded());
|
||||
process.vm_manager.Reprotect(vma_heap.Unwrap(), Kernel::VMAPermission::ReadWriteExecute);
|
||||
|
||||
|
||||
@@ -94,6 +94,9 @@ private:
|
||||
BitField<1, 1, u32_le> embedded_swap_func;
|
||||
BitField<2, 2, u32_le> memory_region_size;
|
||||
BitField<4, 2, u32_le> compatibility;
|
||||
BitField<6, 1, u32_le> events_self_managed;
|
||||
BitField<7, 1, u32_le> swap_not_needed;
|
||||
BitField<8, 1, u32_le> use_private_memory;
|
||||
} flags;
|
||||
u32_le exe_load_checksum;
|
||||
u32_le builtin_load_exe_args[4];
|
||||
|
||||
Reference in New Issue
Block a user