From 84996ccd36a5fa13892c1f02acb1c79031c35aa5 Mon Sep 17 00:00:00 2001
From: Starlet <gpyron@mail.com>
Date: Tue, 22 May 2018 16:40:46 -0400
Subject: [PATCH] [SvcSystem/SvcMemory] Implement SvcGetInfo 16,
 SvcMapPhysicalMemory & SvcUnmapPhysicalMemory (#126)

* [SvcSystem] Implement SvcGetInfo 16

SvcGetInfo 16 always should be 1(?)

* Implement SvcMapPhysicalMemory &  SvcUnmapPhysicalMemory

* Adjusted to review.
---
 Ryujinx.Core/OsHle/Kernel/SvcHandler.cs |  2 ++
 Ryujinx.Core/OsHle/Kernel/SvcMemory.cs  | 20 ++++++++++++++++++++
 Ryujinx.Core/OsHle/Kernel/SvcSystem.cs  |  6 ++++++
 3 files changed, 28 insertions(+)

diff --git a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs b/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs
index 9771bc1e55..3a9166e4e8 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs
+++ b/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             }
             };
 
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcMemory.cs b/Ryujinx.Core/OsHle/Kernel/SvcMemory.cs
index 6609d14aad..3e3cfab58e 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcMemory.cs
+++ b/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 &&
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs b/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs
index 24317bdf05..77f35c199c 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcSystem.cs
+++ b/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);