From 57bb0abda3dc277dc7575250fdb080edb83abcbc Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Thu, 30 Jul 2020 10:16:41 -0300
Subject:  Print guest stack trace on invalid memory access  (#1407)

* Print guest stack trace on invalid memory access

* Improve XML docs
---
 Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

(limited to 'Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs')

diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index 0fa22837..5d004694 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -1,5 +1,6 @@
 using ARMeilleure.State;
 using Ryujinx.Common;
+using Ryujinx.Common.Logging;
 using Ryujinx.Cpu;
 using Ryujinx.HLE.Exceptions;
 using Ryujinx.HLE.HOS.Kernel.Common;
@@ -1071,18 +1072,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
             return result;
         }
 
-        public void StopAllThreads()
-        {
-            lock (_threadingLock)
-            {
-                foreach (KThread thread in _threads)
-                {
-                    KernelContext.Scheduler.ExitThread(thread);
-                    KernelContext.Scheduler.CoreManager.Set(thread.HostThread);
-                }
-            }
-        }
-
         private void InitializeMemoryManager(AddressSpaceType addrSpaceType, MemoryRegion memRegion)
         {
             int addrSpaceBits = addrSpaceType switch
@@ -1094,7 +1083,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
                 _ => throw new ArgumentException(nameof(addrSpaceType))
             };
 
-            CpuMemory = new MemoryManager(KernelContext.Memory, 1UL << addrSpaceBits);
+            CpuMemory = new MemoryManager(KernelContext.Memory, 1UL << addrSpaceBits, InvalidAccessHandler);
             CpuContext = new CpuContext(CpuMemory);
 
             // TODO: This should eventually be removed.
@@ -1104,13 +1093,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
             MemoryManager = new KMemoryManager(KernelContext, CpuMemory);
         }
 
-        public void PrintCurrentThreadStackTrace()
+        private bool InvalidAccessHandler(ulong va)
         {
-            KernelContext.Scheduler.GetCurrentThread().PrintGuestStackTrace();
+            KernelContext.Scheduler.GetCurrentThreadOrNull()?.PrintGuestStackTrace();
+
+            Logger.PrintError(LogClass.Cpu, $"Invalid memory access at virtual address 0x{va:X16}.");
+
+            return false;
         }
 
         private void UndefinedInstructionHandler(object sender, InstUndefinedEventArgs e)
         {
+            KernelContext.Scheduler.GetCurrentThreadOrNull()?.PrintGuestStackTrace();
+
             throw new UndefinedInstructionException(e.Address, e.OpCode);
         }
 
-- 
cgit v1.2.3-70-g09d2