Fix watchpoints handling (huge thanks to @Nanquitas)

This commit is contained in:
TuxSH
2017-11-22 01:24:35 +01:00
parent 44b5e10323
commit 506b16db37
4 changed files with 227 additions and 92 deletions

View File

@@ -27,6 +27,7 @@
#include "svc/KernelSetState.h"
#include "synchronization.h"
#include "ipc.h"
#include "debug.h"
#include "memory.h"
#define MAX_DEBUG 3
@@ -142,7 +143,41 @@ Result KernelSetStateHook(u32 type, u32 varg1, u32 varg2, u32 varg3)
res = SetSyscallDebugEventMask(varg1, (bool)varg2, (const u32 *)varg3);
break;
}
case 0x10003:
{
executeFunctionOnCores(enableMonitorModeDebugging, 0xF, 0);
break;
}
case 0x10004:
{
KRecursiveLock__Lock(&dbgParamsLock);
dbgParamWatchpointId = varg1;
executeFunctionOnCores(disableWatchpoint, 0xF, 0);
KRecursiveLock__Unlock(&dbgParamsLock);
break;
}
case 0x10005:
{
KRecursiveLock__Lock(&dbgParamsLock);
dbgParamWatchpointId = 0;
dbgParamDVA = varg1;
dbgParamWCR = varg2;
dbgParamContextId = varg3;
executeFunctionOnCores(setWatchpointWithContextId, 0xF, 0);
KRecursiveLock__Unlock(&dbgParamsLock);
break;
}
case 0x10006:
{
KRecursiveLock__Lock(&dbgParamsLock);
dbgParamWatchpointId = 1;
dbgParamDVA = varg1;
dbgParamWCR = varg2;
dbgParamContextId = varg3;
executeFunctionOnCores(setWatchpointWithContextId, 0xF, 0);
KRecursiveLock__Unlock(&dbgParamsLock);
break;
}
default:
{
res = KernelSetState(type, varg1, varg2, varg3);