gdb rsp: minor changes
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
@@ -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];
|
||||||
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user