aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
diff options
context:
space:
mode:
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);
}