diff options
author | bunnei <bunneidev@gmail.com> | 2021-12-28 08:33:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-28 08:33:11 +0100 |
commit | 9a0648ff0ad38195d7211b8c65d82b93fe123949 (patch) | |
tree | 65389f6208ea88028e095dc65e881b733c7402de /src/core/hle/kernel/svc.cpp | |
parent | Merge pull request #7630 from ameerj/glasm-get-int (diff) | |
parent | core: hle: kernel: Implement SetMemoryPermission. (diff) | |
download | yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar.gz yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar.bz2 yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar.lz yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar.xz yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.tar.zst yuzu-9a0648ff0ad38195d7211b8c65d82b93fe123949.zip |
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r-- | src/core/hle/kernel/svc.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 37d67b72e..68cb47211 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -164,6 +164,36 @@ static ResultCode SetHeapSize32(Core::System& system, u32* heap_addr, u32 heap_s return result; } +constexpr bool IsValidSetMemoryPermission(MemoryPermission perm) { + switch (perm) { + case MemoryPermission::None: + case MemoryPermission::Read: + case MemoryPermission::ReadWrite: + return true; + default: + return false; + } +} + +static ResultCode SetMemoryPermission(Core::System& system, VAddr address, u64 size, + MemoryPermission perm) { + // Validate address / size. + R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress); + R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize); + R_UNLESS(size > 0, ResultInvalidSize); + R_UNLESS((address < address + size), ResultInvalidCurrentMemory); + + // Validate the permission. + R_UNLESS(IsValidSetMemoryPermission(perm), ResultInvalidNewMemoryPermission); + + // Validate that the region is in range for the current process. + auto& page_table = system.Kernel().CurrentProcess()->PageTable(); + R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory); + + // Set the memory attribute. + return page_table.SetMemoryPermission(address, size, perm); +} + static ResultCode SetMemoryAttribute(Core::System& system, VAddr address, u64 size, u32 mask, u32 attribute) { LOG_DEBUG(Kernel_SVC, @@ -2724,7 +2754,7 @@ static const FunctionDef SVC_Table_32[] = { static const FunctionDef SVC_Table_64[] = { {0x00, nullptr, "Unknown"}, {0x01, SvcWrap64<SetHeapSize>, "SetHeapSize"}, - {0x02, nullptr, "SetMemoryPermission"}, + {0x02, SvcWrap64<SetMemoryPermission>, "SetMemoryPermission"}, {0x03, SvcWrap64<SetMemoryAttribute>, "SetMemoryAttribute"}, {0x04, SvcWrap64<MapMemory>, "MapMemory"}, {0x05, SvcWrap64<UnmapMemory>, "UnmapMemory"}, |