diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-07-30 10:16:41 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-30 23:16:41 +1000 |
commit | 57bb0abda3dc277dc7575250fdb080edb83abcbc (patch) | |
tree | 21fd7e3cdea856037c4794e2de0b68ff80be4b63 /Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | |
parent | 636542d817b3403ae44b46a48a67cedc0c7b42c5 (diff) |
Print guest stack trace on invalid memory access (#1407)
* Print guest stack trace on invalid memory access
* Improve XML docs
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 25 |
1 files changed, 10 insertions, 15 deletions
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); } |