Index: qemu/gdbstub.c =================================================================== --- qemu.orig/gdbstub.c +++ qemu/gdbstub.c @@ -184,9 +184,70 @@ static int put_packet(GDBState *s, char } return 0; } +#if defined(TARGET_X86_64) +/* Defines from GDB register struct numbers */ +#define _RAX 0 +#define _RDX 1 +#define _RCX 2 +#define _RBX 3 +#define _RSI 4 +#define _RDI 5 +#define _RBP 6 +#define _RSP 7 +#define _R8 8 +#define _R9 9 +#define _R10 10 +#define _R11 11 +#define _R12 12 +#define _R13 13 +#define _R14 14 +#define _R15 15 +#define _PC 16 +#define _PS 17 -#if defined(TARGET_I386) +static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) +{ + uint64_t *registers = (uint64_t *)mem_buf; + int i; + + registers[_RAX] = env->regs[R_EAX]; + registers[_RBX] = env->regs[R_EBX]; + registers[_RCX] = env->regs[R_ECX]; + registers[_RDX] = env->regs[R_EDX]; + registers[_RSI] = env->regs[R_ESI]; + registers[_RDI] = env->regs[R_EDI]; + registers[_RBP] = env->regs[R_EBP]; + registers[_RSP] = env->regs[R_ESP]; + for (i = 8; i < 16; i++) + registers[i] = env->regs[i]; + registers[_PC] = env->eip; + registers[_PS] = env->eflags; + for(i = 0; i < 18; i++) + tswapl(registers[i]); + + return 18 * 8; +} + +static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) +{ + uint32_t *registers = (uint32_t *)mem_buf; + int i; + + env->regs[R_EAX] = tswapl(registers[_RAX]); + env->regs[R_EBX] = tswapl(registers[_RBX]); + env->regs[R_ECX] = tswapl(registers[_RCX]); + env->regs[R_EDX] = tswapl(registers[_RDX]); + env->regs[R_ESI] = tswapl(registers[_RSI]); + env->regs[R_EDI] = tswapl(registers[_RDI]); + env->regs[R_EBP] = tswapl(registers[_RBP]); + env->regs[R_ESP] = tswapl(registers[_RSP]); + for (i = 8; i < 16; i++) + env->regs[i] = tswapl(registers[i]); + env->eip = tswapl(registers[_PC]); + env->eflags = tswapl(registers[_PS]); +} +#elif defined(TARGET_I386) static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) { uint32_t *registers = (uint32_t *)mem_buf;