diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs index 42be266b..b69ce03a 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcMemory.cs @@ -11,6 +11,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return SetHeapSize(size, out position); } + public KernelResult SetHeapSize32([R(1)] uint size, [R(1)] out uint position) + { + ulong temporaryPosition; + + KernelResult result = SetHeapSize(size, out temporaryPosition); + + position = (uint)temporaryPosition; + + return result; + } + private KernelResult SetHeapSize(ulong size, out ulong position) { if ((size & 0xfffffffe001fffff) != 0) @@ -32,6 +43,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return SetMemoryAttribute(position, size, attributeMask, attributeValue); } + public KernelResult SetMemoryAttribute32( + [R(0)] uint position, + [R(1)] uint size, + [R(2)] MemoryAttribute attributeMask, + [R(3)] MemoryAttribute attributeValue) + { + return SetMemoryAttribute(position, size, attributeMask, attributeValue); + } + private KernelResult SetMemoryAttribute( ulong position, ulong size, @@ -70,6 +90,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return MapMemory(dst, src, size); } + public KernelResult MapMemory32([R(0)] uint dst, [R(1)] uint src, [R(2)] uint size) + { + return MapMemory(dst, src, size); + } + private KernelResult MapMemory(ulong dst, ulong src, ulong size) { if (!PageAligned(src | dst)) @@ -109,6 +134,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return UnmapMemory(dst, src, size); } + public KernelResult UnmapMemory32([R(0)] uint dst, [R(1)] uint src, [R(2)] uint size) + { + return UnmapMemory(dst, src, size); + } + private KernelResult UnmapMemory(ulong dst, ulong src, ulong size) { if (!PageAligned(src | dst)) @@ -148,6 +178,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return QueryMemory(infoPtr, position, out pageInfo); } + public KernelResult QueryMemory32([R(0)] uint infoPtr, [R(1)] uint r1, [R(2)] uint position, [R(1)] out uint pageInfo) + { + KernelResult result = QueryMemory(infoPtr, position, out ulong pageInfo64); + + pageInfo = (uint)pageInfo64; + + return result; + } + private KernelResult QueryMemory(ulong infoPtr, ulong position, out ulong pageInfo) { KMemoryInfo blkInfo = _process.MemoryManager.QueryMemory(position); @@ -171,6 +210,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return MapSharedMemory(handle, address, size, permission); } + public KernelResult MapSharedMemory32([R(0)] int handle, [R(1)] uint address, [R(2)] uint size, [R(3)] MemoryPermission permission) + { + return MapSharedMemory(handle, address, size, permission); + } + private KernelResult MapSharedMemory(int handle, ulong address, ulong size, MemoryPermission permission) { if (!PageAligned(address)) @@ -222,6 +266,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return UnmapSharedMemory(handle, address, size); } + public KernelResult UnmapSharedMemory32([R(0)] int handle, [R(1)] uint address, [R(2)] uint size) + { + return UnmapSharedMemory(handle, address, size); + } + private KernelResult UnmapSharedMemory(int handle, ulong address, ulong size) { if (!PageAligned(address)) @@ -271,6 +320,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return CreateTransferMemory(address, size, permission, out handle); } + public KernelResult CreateTransferMemory32( + [R(1)] uint address, + [R(2)] uint size, + [R(3)] MemoryPermission permission, + [R(1)] out int handle) + { + return CreateTransferMemory(address, size, permission, out handle); + } + private KernelResult CreateTransferMemory(ulong address, ulong size, MemoryPermission permission, out int handle) { handle = 0; @@ -312,6 +370,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return MapPhysicalMemory(address, size); } + public KernelResult MapPhysicalMemory32([R(0)] uint address, [R(1)] uint size) + { + return MapPhysicalMemory(address, size); + } + private KernelResult MapPhysicalMemory(ulong address, ulong size) { if (!PageAligned(address)) @@ -350,6 +413,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return UnmapPhysicalMemory(address, size); } + public KernelResult UnmapPhysicalMemory32([R(0)] uint address, [R(1)] uint size) + { + return UnmapPhysicalMemory(address, size); + } + private KernelResult UnmapPhysicalMemory(ulong address, ulong size) { if (!PageAligned(address)) @@ -388,6 +456,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return MapProcessCodeMemory(handle, dst, src, size); } + public KernelResult MapProcessCodeMemory32([R(0)] int handle, [R(1)] uint srcLow, [R(2)] uint dstLow, [R(3)] uint dstHigh, [R(4)] uint srcHigh, [R(5)] uint sizeLow, [R(6)] uint sizeHigh) + { + ulong src = (srcLow | ((ulong)srcHigh << 32)); + ulong dst = (dstLow | ((ulong)dstHigh << 32)); + ulong size = (sizeLow | ((ulong)sizeHigh << 32)); + + return MapProcessCodeMemory(handle, dst, src, size); + } + public KernelResult MapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) { if (!PageAligned(dst) || !PageAligned(src)) @@ -430,6 +507,15 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return UnmapProcessCodeMemory(handle, dst, src, size); } + public KernelResult UnmapProcessCodeMemory32([R(0)] int handle, [R(1)] uint srcLow, [R(2)] uint dstLow, [R(3)] uint dstHigh, [R(4)] uint srcHigh, [R(5)] uint sizeLow, [R(6)] uint sizeHigh) + { + ulong src = (srcLow | ((ulong)srcHigh << 32)); + ulong dst = (dstLow | ((ulong)dstHigh << 32)); + ulong size = (sizeLow | ((ulong)sizeHigh << 32)); + + return UnmapProcessCodeMemory(handle, dst, src, size); + } + public KernelResult UnmapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) { if (!PageAligned(dst) || !PageAligned(src)) @@ -472,6 +558,20 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return SetProcessMemoryPermission(handle, src, size, permission); } + public KernelResult SetProcessMemoryPermission32( + [R(0)] int handle, + [R(1)] uint sizeLow, + [R(2)] uint srcLow, + [R(3)] uint srcHigh, + [R(4)] uint sizeHigh, + [R(5)] MemoryPermission permission) + { + ulong src = (srcLow | ((ulong)srcHigh << 32)); + ulong size = (sizeLow | ((ulong)sizeHigh << 32)); + + return SetProcessMemoryPermission(handle, src, size, permission); + } + public KernelResult SetProcessMemoryPermission(int handle, ulong src, ulong size, MemoryPermission permission) { if (!PageAligned(src)) |