Debugger: Track reason for entering stepping.
This commit is contained in:
parent
067f45d560
commit
2bd13c5d9d
16 changed files with 75 additions and 63 deletions
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue