diff options
Diffstat (limited to 'gdbstub.c')
-rw-r--r-- | gdbstub.c | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -359,6 +359,69 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) #endif } +#elif defined (TARGET_PPC) +static void to_le32(uint8_t *p, int v) +{ + p[3] = v; + p[2] = v >> 8; + p[1] = v >> 16; + p[0] = v >> 24; +} + +static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) +{ + uint32_t tmp; + int i; + + /* fill in gprs */ + for(i = 0; i < 8; i++) { + to_le32(mem_buf + i * 4, env->gpr[i]); + } + /* fill in fprs */ + for (i = 0; i < 32; i++) { + to_le32(mem_buf + (i * 2) + 32, *((uint32_t *)&env->fpr[i])); + to_le32(mem_buf + (i * 2) + 33, *((uint32_t *)&env->fpr[i] + 1)); + } + /* nip, msr, ccr, lnk, ctr, xer, mq */ + to_le32(mem_buf + 96, tswapl(env->nip)); + to_le32(mem_buf + 97, tswapl(_load_msr())); + to_le32(mem_buf + 98, 0); + tmp = 0; + for (i = 0; i < 8; i++) + tmp |= env->crf[i] << (32 - (i * 4)); + to_le32(mem_buf + 98, tmp); + to_le32(mem_buf + 99, tswapl(env->lr)); + to_le32(mem_buf + 100, tswapl(env->ctr)); + to_le32(mem_buf + 101, tswapl(_load_xer())); + to_le32(mem_buf + 102, 0); + + return 102; +} + +static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) +{ + uint32_t *registers = (uint32_t *)mem_buf; + int i; + + /* fill in gprs */ + for (i = 0; i < 32; i++) { + env->gpr[i] = tswapl(registers[i]); + } + /* fill in fprs */ + for (i = 0; i < 32; i++) { + *((uint32_t *)&env->fpr[i]) = tswapl(registers[(i * 2) + 32]); + *((uint32_t *)&env->fpr[i] + 1) = tswapl(registers[(i * 2) + 33]); + } + /* nip, msr, ccr, lnk, ctr, xer, mq */ + env->nip = tswapl(registers[96]); + _store_msr(tswapl(registers[97])); + registers[98] = tswapl(registers[98]); + for (i = 0; i < 8; i++) + env->crf[i] = (registers[98] >> (32 - (i * 4))) & 0xF; + env->lr = tswapl(registers[99]); + env->ctr = tswapl(registers[100]); + _store_xer(tswapl(registers[101])); +} #else static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |