aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/OsHle/Svc/SvcMemory.cs')
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcMemory.cs121
1 files changed, 121 insertions, 0 deletions
diff --git a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
new file mode 100644
index 00000000..7528f4e0
--- /dev/null
+++ b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
@@ -0,0 +1,121 @@
+using ChocolArm64.Memory;
+using ChocolArm64.State;
+using Ryujinx.Core.OsHle.Handles;
+
+namespace Ryujinx.Core.OsHle.Svc
+{
+ partial class SvcHandler
+ {
+ private void SvcSetHeapSize(AThreadState ThreadState)
+ {
+ uint Size = (uint)ThreadState.X1;
+
+ Memory.Manager.SetHeapSize(Size, (int)MemoryType.Heap);
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ ThreadState.X1 = (ulong)Memory.Manager.HeapAddr;
+ }
+
+ private void SvcSetMemoryAttribute(AThreadState ThreadState)
+ {
+ long Position = (long)ThreadState.X0;
+ long Size = (long)ThreadState.X1;
+ int State0 = (int)ThreadState.X2;
+ int State1 = (int)ThreadState.X3;
+
+ //TODO
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ private void SvcMapMemory(AThreadState ThreadState)
+ {
+ long Dst = (long)ThreadState.X0;
+ long Src = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+
+ Memory.Manager.MapMirror(Src, Dst, Size, (int)MemoryType.MappedMemory);
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ private void SvcQueryMemory(AThreadState ThreadState)
+ {
+ long InfoPtr = (long)ThreadState.X0;
+ long Position = (long)ThreadState.X2;
+
+ AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position);
+
+ MemoryInfo Info = new MemoryInfo(MapInfo);
+
+ Memory.WriteInt64(InfoPtr + 0x00, Info.BaseAddress);
+ Memory.WriteInt64(InfoPtr + 0x08, Info.Size);
+ Memory.WriteInt32(InfoPtr + 0x10, Info.MemType);
+ Memory.WriteInt32(InfoPtr + 0x14, Info.MemAttr);
+ Memory.WriteInt32(InfoPtr + 0x18, Info.MemPerm);
+ Memory.WriteInt32(InfoPtr + 0x1c, Info.IpcRefCount);
+ Memory.WriteInt32(InfoPtr + 0x20, Info.DeviceRefCount);
+ Memory.WriteInt32(InfoPtr + 0x24, Info.Padding);
+
+ //TODO: X1.
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ ThreadState.X1 = 0;
+ }
+
+ private void SvcMapSharedMemory(AThreadState ThreadState)
+ {
+ int Handle = (int)ThreadState.X0;
+ long Src = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+ int Perm = (int)ThreadState.X3;
+
+ HSharedMem SharedMem = Ns.Os.Handles.GetData<HSharedMem>(Handle);
+
+ if (SharedMem != null)
+ {
+ SharedMem.AddVirtualPosition(Src);
+
+ Memory.Manager.MapPhys(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ //TODO: Error codes.
+ }
+
+ private void SvcUnmapSharedMemory(AThreadState ThreadState)
+ {
+ int Handle = (int)ThreadState.X0;
+ long Position = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+
+ HSharedMem HndData = Ns.Os.Handles.GetData<HSharedMem>(Handle);
+
+ if (HndData != null)
+ {
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ //TODO: Error codes.
+ }
+
+ private void SvcCreateTransferMemory(AThreadState ThreadState)
+ {
+ long Position = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+ int Perm = (int)ThreadState.X3;
+
+ AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position);
+
+ Memory.Manager.Reprotect(Position, Size, (AMemoryPerm)Perm);
+
+ HTransferMem HndData = new HTransferMem(Memory, MapInfo.Perm, Position, Size);
+
+ int Handle = Ns.Os.Handles.GenerateId(HndData);
+
+ ThreadState.X1 = (ulong)Handle;
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+ }
+} \ No newline at end of file