ppc support (Jocelyn Mayer)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 5 Jan 2004 22:49:06 +0000 (22:49 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 5 Jan 2004 22:49:06 +0000 (22:49 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@546 c046a42c-6fe2-441c-8c8c-71466251a162

gdbstub.c

index 9471d8c..469a159 100644 (file)
--- 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)