From a3419946222624b0addc5b3296643460645d4d6b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 15 Apr 2018 15:53:36 -0700 Subject: [PATCH] Debugger: Add cpu.stepping and cpu.resume. --- Core/Debugger/WebSocket/CPUCoreSubscriber.cpp | 32 +++++++++++++++++++ Core/Debugger/WebSocket/CPUCoreSubscriber.h | 2 ++ .../WebSocket/SteppingBroadcaster.cpp | 9 ++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp index 4e5fab8a59..8f7fd07e78 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp @@ -24,6 +24,8 @@ void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map) { // No need to bind or alloc state, these are all global. + map["cpu.stepping"] = &WebSocketCPUStepping; + map["cpu.resume"] = &WebSocketCPUResume; map["cpu.getAllRegs"] = &WebSocketCPUGetAllRegs; map["cpu.getReg"] = &WebSocketCPUGetReg; map["cpu.setReg"] = &WebSocketCPUSetReg; @@ -39,6 +41,36 @@ static std::string RegValueAsFloat(uint32_t u) { return StringFromFormat("%f", bits.f); } +// Begin stepping and pause the CPU (cpu.stepping) +// +// No parameters. +// +// No immediate response. Once CPU is stepping, a "cpu.stepping" event will be sent. +void WebSocketCPUStepping(DebuggerRequest &req) { + if (!currentDebugMIPS->isAlive()) { + return req.Fail("CPU not started"); + } + if (!Core_IsStepping() && Core_IsActive()) { + Core_EnableStepping(true); + } +} + +// Stop stepping and resume the CPU (cpu.resume) +// +// No parameters. +// +// No immediate response. Once CPU is stepping, a "cpu.resume" event will be sent. +void WebSocketCPUResume(DebuggerRequest &req) { + if (!currentDebugMIPS->isAlive()) { + return req.Fail("CPU not started"); + } + if (!Core_IsStepping() || coreState == CORE_POWERDOWN) { + return req.Fail("CPU not stepping"); + } + + Core_EnableStepping(false); +} + // Retrieve all regs and their values (cpu.getAllRegs) // // No parameters. diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.h b/Core/Debugger/WebSocket/CPUCoreSubscriber.h index 78c3173174..4998d9af0b 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.h +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.h @@ -21,6 +21,8 @@ void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map); +void WebSocketCPUStepping(DebuggerRequest &req); +void WebSocketCPUResume(DebuggerRequest &req); void WebSocketCPUGetAllRegs(DebuggerRequest &req); void WebSocketCPUGetReg(DebuggerRequest &req); void WebSocketCPUSetReg(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/SteppingBroadcaster.cpp b/Core/Debugger/WebSocket/SteppingBroadcaster.cpp index 7be39bd798..89e91bc63d 100644 --- a/Core/Debugger/WebSocket/SteppingBroadcaster.cpp +++ b/Core/Debugger/WebSocket/SteppingBroadcaster.cpp @@ -22,11 +22,14 @@ void SteppingBroadcaster::Broadcast(net::WebSocketServer *ws) { // TODO: This is somewhat primitive. It'd be nice to register a callback with Core instead? - if (coreState != prevState_) { - if (Core_IsStepping() && PSP_IsInited()) { + if (coreState != prevState_ && PSP_IsInited()) { + // We ignore CORE_POWERDOWN. + if (coreState == CORE_STEPPING) { // TODO: Should send more data proactively. ws->Send(R"({"event":"cpu.stepping"})"); + } else if (prevState_ == CORE_STEPPING && Core_IsActive()) { + ws->Send(R"({"event":"cpu.resume"})"); } - prevState_ = coreState; } + prevState_ = coreState; }