gdb rsp: minor changes

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2024-06-16 20:55:33 +05:30
parent 951fc40134
commit c55f2937f7
3 changed files with 38 additions and 46 deletions

View File

@@ -129,14 +129,6 @@ Cpu::step() {
// word align // word align
rst_bit(pc, 1); rst_bit(pc, 1);
#ifdef GDB_DEBUG
if (breakpoints.contains(pc - 2 * arm::INSTRUCTION_SIZE)) {
glogger.info_bold("CPU halted");
halted = true;
return;
}
#endif
arm::Instruction instruction(opcodes[0]); arm::Instruction instruction(opcodes[0]);
opcodes[0] = opcodes[1]; opcodes[0] = opcodes[1];
@@ -156,15 +148,6 @@ Cpu::step() {
} else } else
advance_pc_arm(); advance_pc_arm();
} else { } else {
#ifdef GDB_DEBUG
if (breakpoints.contains(pc - 2 * thumb::INSTRUCTION_SIZE)) {
glogger.info_bold("CPU halted");
halted = true;
return;
}
#endif
thumb::Instruction instruction(opcodes[0]); thumb::Instruction instruction(opcodes[0]);
opcodes[0] = opcodes[1]; opcodes[0] = opcodes[1];

View File

@@ -46,8 +46,20 @@ GdbRsp::start(const uint port) {
server.start(port); server.start(port);
server.run(); server.run();
attach();
// attaching is not enough, we continue, until the last GDB communication
// happens for ARMv4t i.e, fetching of the CPSR
std::string msg; std::string msg;
while (msg != "$p19") {
msg = receive();
step(msg); // 25th (0x19) register is cpsr
}
}
void
GdbRsp::attach() {
while (!attached) { while (!attached) {
step(); step();
} }
@@ -63,7 +75,11 @@ GdbRsp::satisfy_client() {
void void
GdbRsp::step() { GdbRsp::step() {
std::string msg = receive(); std::string msg = receive();
step(msg);
}
void
GdbRsp::step(std::string msg) {
switch (msg[0]) { switch (msg[0]) {
case '+': case '+':
break; break;
@@ -81,49 +97,39 @@ GdbRsp::step() {
acknowledge(); acknowledge();
cmd_attached(); cmd_attached();
} else { } else {
acknowledge();
switch (msg[1]) { switch (msg[1]) {
case '?': case '?':
acknowledge();
cmd_halted(); cmd_halted();
break; break;
case 'g': case 'g':
acknowledge();
cmd_read_registers(); cmd_read_registers();
break; break;
case 'G': case 'G':
acknowledge();
cmd_write_registers(msg); cmd_write_registers(msg);
break; break;
case 'p': case 'p':
acknowledge();
cmd_read_register(msg); cmd_read_register(msg);
break; break;
case 'P': case 'P':
acknowledge();
cmd_write_register(msg); cmd_write_register(msg);
break; break;
case 'm': case 'm':
acknowledge();
cmd_read_memory(msg); cmd_read_memory(msg);
break; break;
case 'M': case 'M':
acknowledge();
cmd_write_memory(msg); cmd_write_memory(msg);
break; break;
case 'z': case 'z':
acknowledge();
cmd_rm_breakpoint(msg); cmd_rm_breakpoint(msg);
break; break;
case 'Z': case 'Z':
acknowledge();
cmd_add_breakpoint(msg); cmd_add_breakpoint(msg);
break; break;
case 'c': case 'c':
acknowledge();
cmd_continue(); cmd_continue();
break; break;
case 'D': case 'D':
acknowledge();
cmd_detach(); cmd_detach();
break; break;
default: default:
@@ -177,10 +183,15 @@ GdbRsp::acknowledge() {
void void
GdbRsp::send_empty() { GdbRsp::send_empty() {
acknowledge();
server.send(make_packet("")); server.send(make_packet(""));
} }
void
GdbRsp::send_ok() {
acknowledge();
server.send(make_packet("OK"));
}
void void
GdbRsp::notify_breakpoint_reached() { GdbRsp::notify_breakpoint_reached() {
gdb_log("reached breakpoint, sending signal"); gdb_log("reached breakpoint, sending signal");
@@ -252,7 +263,7 @@ GdbRsp::cmd_write_registers(std::string msg) {
} }
gdb_log("register values written"); gdb_log("register values written");
server.send(OK_MSG); send_ok();
} catch (const std::exception& e) { } catch (const std::exception& e) {
gdb_log("{}", e.what()); gdb_log("{}", e.what());
send_empty(); send_empty();
@@ -305,7 +316,7 @@ GdbRsp::cmd_write_register(std::string msg) {
cpu->gpr[reg] = value; cpu->gpr[reg] = value;
gdb_log("single register value written"); gdb_log("single register value written");
server.send(OK_MSG); send_ok();
} catch (const std::exception& e) { } catch (const std::exception& e) {
gdb_log("{}", e.what()); gdb_log("{}", e.what());
send_empty(); send_empty();
@@ -380,7 +391,7 @@ GdbRsp::cmd_write_memory(std::string msg) {
cpu->sequential = false; cpu->sequential = false;
gdb_log("register values written"); gdb_log("register values written");
server.send(OK_MSG); send_ok();
} catch (const std::exception& e) { } catch (const std::exception& e) {
gdb_log("{}", e.what()); gdb_log("{}", e.what());
send_empty(); send_empty();
@@ -416,7 +427,7 @@ GdbRsp::cmd_rm_breakpoint(std::string msg) {
cpu->breakpoints.erase(address); cpu->breakpoints.erase(address);
gdb_log("breakpoint {:#08x} removed", address); gdb_log("breakpoint {:#08x} removed", address);
server.send(OK_MSG); send_ok();
} catch (const std::exception& e) { } catch (const std::exception& e) {
gdb_log("{}", e.what()); gdb_log("{}", e.what());
send_empty(); send_empty();
@@ -454,7 +465,7 @@ GdbRsp::cmd_add_breakpoint(std::string msg) {
cpu->breakpoints.insert(address); cpu->breakpoints.insert(address);
gdb_log("breakpoint {:#08x} added", address); gdb_log("breakpoint {:#08x} added", address);
server.send(OK_MSG); send_ok();
} catch (const std::exception& e) { } catch (const std::exception& e) {
gdb_log("{}", e.what()); gdb_log("{}", e.what());
send_empty(); send_empty();
@@ -464,18 +475,14 @@ GdbRsp::cmd_add_breakpoint(std::string msg) {
void void
GdbRsp::cmd_detach() { GdbRsp::cmd_detach() {
attached = false; attached = false;
cpu->resume();
gdb_log("detached"); gdb_log("detached");
server.send(OK_MSG); send_ok();
} }
void void
GdbRsp::cmd_continue() { GdbRsp::cmd_continue() {
cpu->resume(); // what to do?
gdb_log("continued"); gdb_log("cpu continued");
server.send(OK_MSG); send_ok();
while (true) {
cpu->step();
}
} }
} }

View File

@@ -5,9 +5,14 @@ namespace matar {
class GdbRsp { class GdbRsp {
public: public:
GdbRsp(std::shared_ptr<Cpu> cpu); GdbRsp(std::shared_ptr<Cpu> cpu);
~GdbRsp() = default;
void start(const uint port); void start(const uint port);
void attach();
void satisfy_client(); void satisfy_client();
void step(); void step();
void step(std::string msg);
void notify_breakpoint_reached();
inline bool is_attached() { return attached; }
private: private:
bool attached = false; bool attached = false;
@@ -18,7 +23,7 @@ class GdbRsp {
std::string make_packet(std::string raw); std::string make_packet(std::string raw);
void acknowledge(); void acknowledge();
void send_empty(); void send_empty();
void notify_breakpoint_reached(); void send_ok();
// Commands // Commands
void cmd_attached(); void cmd_attached();
@@ -35,9 +40,6 @@ class GdbRsp {
void cmd_detach(); void cmd_detach();
void cmd_continue(); void cmd_continue();
static constexpr std::string ATTACHED_MSG = "$qAttached#8f";
static constexpr std::string OK_MSG = "+$OK#9a";
static constexpr uint MAX_MSG_LEN = 4096; static constexpr uint MAX_MSG_LEN = 4096;
}; };
} }