Răsfoiți Sursa

[SvcSystem/SvcMemory] Implement SvcGetInfo 16, SvcMapPhysicalMemory & SvcUnmapPhysicalMemory (#126)

* [SvcSystem] Implement SvcGetInfo 16

SvcGetInfo 16 always should be 1(?)

* Implement SvcMapPhysicalMemory &  SvcUnmapPhysicalMemory

* Adjusted to review.
Starlet 8 ani în urmă
părinte
comite
84996ccd36

+ 2 - 0
Ryujinx.Core/OsHle/Kernel/SvcHandler.cs

@@ -69,6 +69,8 @@ namespace Ryujinx.Core.OsHle.Kernel
                 { 0x26, SvcBreak                         },
                 { 0x27, SvcOutputDebugString             },
                 { 0x29, SvcGetInfo                       },
+                { 0x2c, SvcMapPhysicalMemory             },
+                { 0x2d, SvcUnmapPhysicalMemory           },
                 { 0x32, SvcSetThreadActivity             }
             };
 

+ 20 - 0
Ryujinx.Core/OsHle/Kernel/SvcMemory.cs

@@ -250,6 +250,26 @@ namespace Ryujinx.Core.OsHle.Kernel
             ThreadState.X1 = Handle;
         }
 
+        private void SvcMapPhysicalMemory(AThreadState ThreadState)
+        {
+            long Position = (long)ThreadState.X0;
+            uint Size     = (uint)ThreadState.X1;
+
+            Memory.Manager.Map(Position, Size, (int)MemoryType.Heap, AMemoryPerm.RW);
+
+            ThreadState.X0 = 0;
+        }
+
+        private void SvcUnmapPhysicalMemory(AThreadState ThreadState)
+        {
+            long Position = (long)ThreadState.X0;
+            uint Size     = (uint)ThreadState.X1;
+
+            Memory.Manager.Unmap(Position, Size);
+
+            ThreadState.X0 = 0;
+        }
+
         private static bool IsValidPosition(long Position)
         {
             return Position >= MemoryRegions.AddrSpaceStart &&

+ 6 - 0
Ryujinx.Core/OsHle/Kernel/SvcSystem.cs

@@ -18,6 +18,8 @@ namespace Ryujinx.Core.OsHle.Kernel
 
         private const bool EnableProcessDebugging = false;
 
+        private const bool IsVirtualMemoryEnabled = true; //This is always true(?)
+
         private void SvcExitProcess(AThreadState ThreadState)
         {
             Ns.Os.ExitProcess(ThreadState.ProcessId);
@@ -350,6 +352,10 @@ namespace Ryujinx.Core.OsHle.Kernel
                 case 15:
                     ThreadState.X1 = MemoryRegions.MapRegionSize;
                     break;
+                    
+                case 16:
+                    ThreadState.X1 = IsVirtualMemoryEnabled ? 1 : 0;
+                    break;
 
                 default:
                     Process.PrintStackTrace(ThreadState);