Debugger: Track reason for entering stepping.

This commit is contained in:
Unknown W. Brackets 2021-10-23 16:56:15 -07:00
parent 067f45d560
commit 2bd13c5d9d
16 changed files with 75 additions and 63 deletions

View file

@ -53,12 +53,12 @@ struct AutoDisabledReplacements {
};
// Important: Only use keepReplacements when reading, not writing.
static AutoDisabledReplacements LockMemoryAndCPU(bool keepReplacements) {
static AutoDisabledReplacements LockMemoryAndCPU(uint32_t addr, bool keepReplacements) {
AutoDisabledReplacements result;
if (Core_IsStepping()) {
result.wasStepping = true;
} else {
Core_EnableStepping(true);
Core_EnableStepping(true, "memory.access", addr);
Core_WaitInactive();
}
@ -92,15 +92,15 @@ AutoDisabledReplacements::~AutoDisabledReplacements() {
// Response (same event name):
// - value: unsigned integer
void WebSocketMemoryReadU8(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr;
if (!req.ParamU32("address", &addr, false)) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -118,15 +118,15 @@ void WebSocketMemoryReadU8(DebuggerRequest &req) {
// Response (same event name):
// - value: unsigned integer
void WebSocketMemoryReadU16(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr;
if (!req.ParamU32("address", &addr, false)) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -144,15 +144,15 @@ void WebSocketMemoryReadU16(DebuggerRequest &req) {
// Response (same event name):
// - value: unsigned integer
void WebSocketMemoryReadU32(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr;
if (!req.ParamU32("address", &addr, false)) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -182,7 +182,7 @@ void WebSocketMemoryRead(DebuggerRequest &req) {
if (!req.ParamBool("replacements", &replacements, DebuggerParamType::OPTIONAL))
return;
auto memLock = LockMemoryAndCPU(replacements);
auto memLock = LockMemoryAndCPU(addr, replacements);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
@ -219,13 +219,14 @@ void WebSocketMemoryRead(DebuggerRequest &req) {
// Response (same event name) for 'base64':
// - base64: base64 encode of binary data, not including NUL.
void WebSocketMemoryReadString(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr;
if (!req.ParamU32("address", &addr))
return;
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
std::string type = "utf-8";
if (!req.ParamString("type", &type, DebuggerParamType::OPTIONAL))
return;
@ -257,10 +258,6 @@ void WebSocketMemoryReadString(DebuggerRequest &req) {
// Response (same event name):
// - value: new value, unsigned integer
void WebSocketMemoryWriteU8(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr, val;
if (!req.ParamU32("address", &addr, false)) {
return;
@ -269,6 +266,10 @@ void WebSocketMemoryWriteU8(DebuggerRequest &req) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -289,10 +290,6 @@ void WebSocketMemoryWriteU8(DebuggerRequest &req) {
// Response (same event name):
// - value: new value, unsigned integer
void WebSocketMemoryWriteU16(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr, val;
if (!req.ParamU32("address", &addr, false)) {
return;
@ -301,6 +298,10 @@ void WebSocketMemoryWriteU16(DebuggerRequest &req) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -321,10 +322,6 @@ void WebSocketMemoryWriteU16(DebuggerRequest &req) {
// Response (same event name):
// - value: new value, unsigned integer
void WebSocketMemoryWriteU32(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr, val;
if (!req.ParamU32("address", &addr, false)) {
return;
@ -333,6 +330,10 @@ void WebSocketMemoryWriteU32(DebuggerRequest &req) {
return;
}
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
if (!Memory::IsValidAddress(addr)) {
req.Fail("Invalid address");
return;
@ -352,10 +353,6 @@ void WebSocketMemoryWriteU32(DebuggerRequest &req) {
//
// Response (same event name) with no extra data.
void WebSocketMemoryWrite(DebuggerRequest &req) {
auto memLock = LockMemoryAndCPU(true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
uint32_t addr;
if (!req.ParamU32("address", &addr))
return;
@ -363,6 +360,10 @@ void WebSocketMemoryWrite(DebuggerRequest &req) {
if (!req.ParamString("base64", &encoded))
return;
auto memLock = LockMemoryAndCPU(addr, true);
if (!currentDebugMIPS->isAlive() || !Memory::IsActive())
return req.Fail("CPU not started");
std::vector<uint8_t> value = Base64Decode(&encoded[0], encoded.size());
uint32_t size = (uint32_t)value.size();