aboutsummaryrefslogtreecommitdiff
path: root/gdbstub.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-01-05 22:49:06 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2004-01-05 22:49:06 +0000
commit9e62fd7f26d522f77f2a56bda6033c73bf286e07 (patch)
tree8c22015c2715a7f60a40bebefcb24ff687b98730 /gdbstub.c
parent8977f3c107efa48edc19ea45f513f204bfe9d8e7 (diff)
ppc support (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@546 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'gdbstub.c')
-rw-r--r--gdbstub.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/gdbstub.c b/gdbstub.c
index 9471d8c16a..469a15962f 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -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)