aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-07-30 10:16:41 -0300
committerGitHub <noreply@github.com>2020-07-30 23:16:41 +1000
commit57bb0abda3dc277dc7575250fdb080edb83abcbc (patch)
tree21fd7e3cdea856037c4794e2de0b68ff80be4b63 /Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
parent636542d817b3403ae44b46a48a67cedc0c7b42c5 (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.cs25
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);
}