void gdb_send_stop_reason(uint8_t reason) { size_t rlen; uint32_t s_rip; uint64_t mode = (uint64_t)cpu_addr_sz(); if(mode == 64) { s_rip = 0x3a36313b; rlen = sizeof(uint64_t)*2; } else /* XXX: gdb seems to wait for 32 bits regs at least */ { s_rip = 0x3a38303b; rlen = sizeof(uint32_t)*2; } gdb_add_str("T", 1); gdb_add_byte(reason); gdb_add_str("md:", 3); gdb_add_number(mode, 2, 0); gdb_add_str(";04:", 4); gdb_add_number(info->vm.cpu.gpr->rsp.raw, rlen, 1); gdb_add_str(";05:", 4); gdb_add_number(info->vm.cpu.gpr->rbp.raw, rlen, 1); gdb_add_str((char*)&s_rip, 4); gdb_add_number(__rip.raw, rlen, 1); gdb_add_str(";", 1); gdb_send_packet(); }
static void gdb_cmd_rd_mem(uint8_t *data, size_t len) { offset_t addr; size_t size, need, i; uint8_t store[128]; if(!__gdb_setup_mem_op(data, len, &addr, &size, 0)) return; debug(GDBSTUB_CMD, "read mem: addr 0x%X size %D\n", addr, size); if(size > ((GDB_ANSWER_SZ - GDB_ACKPKT_SZ)/2)) { debug(GDBSTUB_CMD, "gdb buffer too small for cmd_rd_mem\n"); gdb_unsupported(); } while(size) { need = min(size, sizeof(store)); if(!gdb_mem_read(addr, store, need)) { debug(GDBSTUB_CMD, "access failure\n"); gdb_err_mem(); return; } for(i=0 ; i<need ; i++) gdb_add_byte(store[i]); addr += need; size -= need; } gdb_send_packet(); }