static void gdb_vmm_wr_sysreg(uint8_t *data, size_t len) { raw64_t *reg, value; size_t size; if(!__gdb_setup_reg_op(data, len, ®, &size, &value, 1, 1)) { debug(GDBSTUB_CMD, "write sysreg failed\n"); return; } if(reg == (raw64_t*)&__cr0 && __resolve_cr0_wr((cr0_reg_t*)&value) == VM_FAIL) goto __err; else if(reg == (raw64_t*)&__cr3 && __resolve_cr3_wr((cr3_reg_t*)&value) == VM_FAIL) goto __err; else if(reg == (raw64_t*)&__cr4 && __resolve_cr4_wr((cr4_reg_t*)&value) == VM_FAIL) goto __err; else reg->raw = value.raw; gdb_ok(); return; __err: debug(GDBSTUB_CMD, "invalid wr to control register\n"); gdb_err_inv(); }
static void gdb_cmd_rd_reg(uint8_t *data, size_t len) { raw64_t *reg; size_t size; if(!__gdb_setup_reg_op(data, len, ®, &size, 0, 0, 0)) return; size *= 2; /* to nibbles */ gdb_add_number(reg->raw, size, 1); gdb_send_packet(); }
static void gdb_vmm_rd_sysreg(uint8_t *data, size_t len) { raw64_t *reg; size_t size; if(!__gdb_setup_reg_op(data, len, ®, &size, 0, 0, 1)) { debug(GDBSTUB_CMD, "read sysreg failed\n"); return; } size *= 2; /* to nibbles */ gdb_add_number(reg->raw, size, 1); gdb_send_packet(); }
static void gdb_cmd_wr_reg(uint8_t *data, size_t len) { raw64_t *reg, value; size_t size; if(!__gdb_setup_reg_op(data, len, ®, &size, &value, 1, 0)) return; switch(size) { case 2: reg->wlow = value.wlow; break; case 4: reg->low = value.low; break; case 8: reg->raw = value.raw; break; } gdb_ok(); }