aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Svc
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/OsHle/Svc')
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcHandler.cs3
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcMemory.cs65
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcSystem.cs128
3 files changed, 114 insertions, 82 deletions
diff --git a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
index ec53f47f..212d30a6 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
@@ -17,6 +17,8 @@ namespace Ryujinx.Core.OsHle.Svc
private AMemory Memory;
private static Random Rng;
+
+ private ulong CurrentHeapSize;
public SvcHandler(Switch Ns, Process Process)
{
@@ -25,6 +27,7 @@ namespace Ryujinx.Core.OsHle.Svc
{ 0x01, SvcSetHeapSize },
{ 0x03, SvcSetMemoryAttribute },
{ 0x04, SvcMapMemory },
+ { 0x05, SvcUnmapMemory },
{ 0x06, SvcQueryMemory },
{ 0x07, SvcExitProcess },
{ 0x08, SvcCreateThread },
diff --git a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
index 6ca27f16..e7559a14 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
@@ -10,10 +10,21 @@ namespace Ryujinx.Core.OsHle.Svc
{
uint Size = (uint)ThreadState.X1;
- Memory.Manager.SetHeapSize(Size, (int)MemoryType.Heap);
+ long Position = MemoryRegions.HeapRegionAddress;
+
+ if (Size > CurrentHeapSize)
+ {
+ Memory.Manager.Map(Position, Size, (int)MemoryType.Heap, AMemoryPerm.RW);
+ }
+ else
+ {
+ Memory.Manager.Unmap(Position + Size, (long)CurrentHeapSize - Size);
+ }
+
+ CurrentHeapSize = Size;
ThreadState.X0 = (int)SvcResult.Success;
- ThreadState.X1 = (ulong)Memory.Manager.HeapAddr;
+ ThreadState.X1 = (ulong)Position;
}
private void SvcSetMemoryAttribute(AThreadState ThreadState)
@@ -42,7 +53,30 @@ namespace Ryujinx.Core.OsHle.Svc
long Src = (long)ThreadState.X1;
long Size = (long)ThreadState.X2;
- Memory.Manager.MapMirror(Src, Dst, Size, (int)MemoryType.MappedMemory);
+ AMemoryMapInfo SrcInfo = Memory.Manager.GetMapInfo(Src);
+
+ Memory.Manager.Map(Dst, Size, (int)MemoryType.MappedMemory, SrcInfo.Perm);
+
+ Memory.Manager.Reprotect(Src, Size, AMemoryPerm.None);
+
+ Memory.Manager.SetAttrBit(Src, Size, 0);
+
+ ThreadState.X0 = (int)SvcResult.Success;
+ }
+
+ private void SvcUnmapMemory(AThreadState ThreadState)
+ {
+ long Dst = (long)ThreadState.X0;
+ long Src = (long)ThreadState.X1;
+ long Size = (long)ThreadState.X2;
+
+ AMemoryMapInfo DstInfo = Memory.Manager.GetMapInfo(Dst);
+
+ Memory.Manager.Unmap(Dst, Size, (int)MemoryType.MappedMemory);
+
+ Memory.Manager.Reprotect(Src, Size, DstInfo.Perm);
+
+ Memory.Manager.ClearAttrBit(Src, Size, 0);
ThreadState.X0 = (int)SvcResult.Success;
}
@@ -54,17 +88,22 @@ namespace Ryujinx.Core.OsHle.Svc
AMemoryMapInfo MapInfo = Memory.Manager.GetMapInfo(Position);
- MemoryInfo Info = new MemoryInfo(MapInfo);
+ if (MapInfo == null)
+ {
+ //TODO: Correct error code.
+ ThreadState.X0 = ulong.MaxValue;
- 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);
+ return;
+ }
+ Memory.WriteInt64(InfoPtr + 0x00, MapInfo.Position);
+ Memory.WriteInt64(InfoPtr + 0x08, MapInfo.Size);
+ Memory.WriteInt32(InfoPtr + 0x10, MapInfo.Type);
+ Memory.WriteInt32(InfoPtr + 0x14, MapInfo.Attr);
+ Memory.WriteInt32(InfoPtr + 0x18, (int)MapInfo.Perm);
+ Memory.WriteInt32(InfoPtr + 0x1c, 0);
+ Memory.WriteInt32(InfoPtr + 0x20, 0);
+ Memory.WriteInt32(InfoPtr + 0x24, 0);
//TODO: X1.
ThreadState.X0 = (int)SvcResult.Success;
@@ -84,7 +123,7 @@ namespace Ryujinx.Core.OsHle.Svc
{
SharedMem.AddVirtualPosition(Src);
- Memory.Manager.MapPhys(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);
+ Memory.Manager.Map(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);
ThreadState.X0 = (int)SvcResult.Success;
}
diff --git a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
index 3b9142c7..51b2e26c 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs
@@ -11,7 +11,14 @@ namespace Ryujinx.Core.OsHle.Svc
{
partial class SvcHandler
{
- private void SvcExitProcess(AThreadState ThreadState) => Ns.Os.ExitProcess(ThreadState.ProcessId);
+ private const int AllowedCpuIdBitmask = 0b1111;
+
+ private const bool EnableProcessDebugging = false;
+
+ private void SvcExitProcess(AThreadState ThreadState)
+ {
+ Ns.Os.ExitProcess(ThreadState.ProcessId);
+ }
private void SvcCloseHandle(AThreadState ThreadState)
{
@@ -162,79 +169,62 @@ namespace Ryujinx.Core.OsHle.Svc
switch (InfoType)
{
- case 0: ThreadState.X1 = AllowedCpuIdBitmask(); break;
- case 2: ThreadState.X1 = GetMapRegionBaseAddr(); break;
- case 3: ThreadState.X1 = GetMapRegionSize(); break;
- case 4: ThreadState.X1 = GetHeapRegionBaseAddr(); break;
- case 5: ThreadState.X1 = GetHeapRegionSize(); break;
- case 6: ThreadState.X1 = GetTotalMem(); break;
- case 7: ThreadState.X1 = GetUsedMem(); break;
- case 8: ThreadState.X1 = IsCurrentProcessBeingDebugged(); break;
- case 11: ThreadState.X1 = GetRnd64(); break;
- case 12: ThreadState.X1 = GetAddrSpaceBaseAddr(); break;
- case 13: ThreadState.X1 = GetAddrSpaceSize(); break;
- case 14: ThreadState.X1 = GetMapRegionBaseAddr(); break;
- case 15: ThreadState.X1 = GetMapRegionSize(); break;
+ case 0:
+ ThreadState.X1 = AllowedCpuIdBitmask;
+ break;
+
+ case 2:
+ ThreadState.X1 = MemoryRegions.MapRegionAddress;
+ break;
+
+ case 3:
+ ThreadState.X1 = MemoryRegions.MapRegionSize;
+ break;
+
+ case 4:
+ ThreadState.X1 = MemoryRegions.HeapRegionAddress;
+ break;
+
+ case 5:
+ ThreadState.X1 = CurrentHeapSize;
+ break;
+
+ case 6:
+ ThreadState.X1 = MemoryRegions.TotalMemoryAvailable;
+ break;
+
+ case 7:
+ ThreadState.X1 = MemoryRegions.TotalMemoryUsed + CurrentHeapSize;
+ break;
+
+ case 8:
+ ThreadState.X1 = EnableProcessDebugging ? 1 : 0;
+ break;
+
+ case 11:
+ ThreadState.X1 = (ulong)Rng.Next() + ((ulong)Rng.Next() << 32);
+ break;
+
+ case 12:
+ ThreadState.X1 = MemoryRegions.AddrSpaceStart;
+ break;
+
+ case 13:
+ ThreadState.X1 = MemoryRegions.AddrSpaceSize;
+ break;
+
+ case 14:
+ ThreadState.X1 = MemoryRegions.MapRegionAddress;
+ break;
+
+ case 15:
+ ThreadState.X1 = MemoryRegions.MapRegionSize;
+ break;
default: throw new NotImplementedException($"SvcGetInfo: {InfoType} {Handle} {InfoId}");
}
ThreadState.X0 = (int)SvcResult.Success;
}
-
- private ulong AllowedCpuIdBitmask()
- {
- return 0xF; //Mephisto value.
- }
-
- private ulong GetMapRegionBaseAddr()
- {
- return MemoryRegions.MapRegionAddress;
- }
-
- private ulong GetMapRegionSize()
- {
- return MemoryRegions.MapRegionSize;
- }
-
- private ulong GetHeapRegionBaseAddr()
- {
- return MemoryRegions.HeapRegionAddress;
- }
-
- private ulong GetHeapRegionSize()
- {
- return MemoryRegions.HeapRegionSize;
- }
-
- private ulong GetTotalMem()
- {
- return (ulong)Memory.Manager.GetTotalMemorySize();
- }
-
- private ulong GetUsedMem()
- {
- return (ulong)Memory.Manager.GetUsedMemorySize();
- }
-
- private ulong IsCurrentProcessBeingDebugged()
- {
- return (ulong)0;
- }
-
- private ulong GetRnd64()
- {
- return (ulong)Rng.Next() + ((ulong)Rng.Next() << 32);
- }
-
- private ulong GetAddrSpaceBaseAddr()
- {
- return 0x08000000;
- }
-
- private ulong GetAddrSpaceSize()
- {
- return AMemoryMgr.AddrSize - GetAddrSpaceBaseAddr();
- }
}
}