From f6dc86c6a097f305701af32e77a2d8995a4385cc Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Sun, 25 Feb 2018 22:53:01 -0300
Subject: [PATCH] Implement SvcSetMemoryAttribute

---
 ChocolArm64/Memory/AMemoryMgr.cs              | 30 +++++++++++++++++++
 .../Services/Am/IApplicationFunctions.cs      |  1 -
 Ryujinx.Core/OsHle/Svc/SvcMemory.cs           | 10 ++++++-
 3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/ChocolArm64/Memory/AMemoryMgr.cs b/ChocolArm64/Memory/AMemoryMgr.cs
index 05284059..c8869e03 100644
--- a/ChocolArm64/Memory/AMemoryMgr.cs
+++ b/ChocolArm64/Memory/AMemoryMgr.cs
@@ -234,6 +234,36 @@ namespace ChocolArm64.Memory
                 BaseEntry.Perm);
         }
 
+        public void ClearAttrBit(long Position, long Size, int Bit)
+        {
+            while (Size > 0)
+            {
+                PTEntry Entry = GetPTEntry(Position);
+
+                Entry.Attr &= ~(1 << Bit);
+
+                SetPTEntry(Position, Entry);
+
+                Position += PageSize;
+                Size     -= PageSize;
+            }
+        }
+
+        public void SetAttrBit(long Position, long Size, int Bit)
+        {
+            while (Size > 0)
+            {
+                PTEntry Entry = GetPTEntry(Position);
+
+                Entry.Attr |= (1 << Bit);
+
+                SetPTEntry(Position, Entry);
+
+                Position += PageSize;
+                Size     -= PageSize;
+            }
+        }
+
         public bool HasPermission(long Position, AMemoryPerm Perm)
         {
             return GetPTEntry(Position).Perm.HasFlag(Perm);
diff --git a/Ryujinx.Core/OsHle/Services/Am/IApplicationFunctions.cs b/Ryujinx.Core/OsHle/Services/Am/IApplicationFunctions.cs
index 6c5beeb3..c989cdd4 100644
--- a/Ryujinx.Core/OsHle/Services/Am/IApplicationFunctions.cs
+++ b/Ryujinx.Core/OsHle/Services/Am/IApplicationFunctions.cs
@@ -1,5 +1,4 @@
 using Ryujinx.Core.OsHle.Ipc;
-using System;
 using System.Collections.Generic;
 using System.IO;
 
diff --git a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
index 7528f4e0..6ca27f16 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcMemory.cs
@@ -23,7 +23,15 @@ namespace Ryujinx.Core.OsHle.Svc
             int  State0   =  (int)ThreadState.X2;
             int  State1   =  (int)ThreadState.X3;
 
-            //TODO
+            if ((State0 == 0 && State1 == 0) ||
+                (State0 == 8 && State1 == 0))
+            {
+                Memory.Manager.ClearAttrBit(Position, Size, 3);
+            }
+            else if (State0 == 8 && State1 == 8)
+            {
+                Memory.Manager.SetAttrBit(Position, Size, 3);
+            }
 
             ThreadState.X0 = (int)SvcResult.Success;
         }