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