qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Could any body fix the bug in gdbstub.c for x86_64?


From: MingyanGuo
Subject: [Qemu-devel] Could any body fix the bug in gdbstub.c for x86_64?
Date: Wed, 9 May 2007 21:11:53 +0800

Hi,
The -s option for qemu-system-x86_64 is not useable.
I've already post a patch, but it is ignored.
http://lists.gnu.org/archive/html/qemu-devel/2007-05/msg00062.html
This patch is for version 0.9.0, could some body merge it
in the cvs tree?

-----------------------------------><--------------------------------------
--- qemu-0.9.0/gdbstub.c    Tue Feb  6 07:01:54 2007
+++ gdbstub.c    Sat May  5 02:22:39 2007
@@ -223,63 +223,83 @@
 
 #if defined(TARGET_I386)
 
+#if defined(TARGET_X86_64)
+/*
+ * XXX
+ * This is a ugly hack (in my opinion...), is it better to redefine R_EXX
+ * in target-i386/cpu.h to match 'amd64_regnum' in gdb (gdb/amd64- tdep.h)?
+ */
+static int regnames[CPU_NB_REGS] = { R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI,
+        R_EBP, R_ESP, 8, 9, 10, 11, 12, 13, 14, 15 };
+#endif
 static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
 {
-    uint32_t *registers = (uint32_t *)mem_buf;
-    int i, fpus;
+    target_ulong *registers = (target_ulong *)mem_buf;
+    int i, fpus, regno0, regno1, regno2;
 
-    for(i = 0; i < 8; i++) {
+    for(i = 0; i < CPU_NB_REGS; i++) {
+#if defined(TARGET_X86_64)
+        registers[i] = env->regs[regnames[i]];
+#else
         registers[i] = env->regs[i];
+#endif
     }
-    registers[8] = env->eip;
-    registers[9] = env->eflags;
-    registers[10] = env->segs[R_CS].selector;
-    registers[11] = env->segs[R_SS].selector;
-    registers[12] = env->segs[R_DS].selector;
-    registers[13] = env->segs[R_ES].selector;
-    registers[14] = env->segs[R_FS].selector;
-    registers[15] = env->segs[R_GS].selector;
+    registers[i++] = env->eip;
+    registers[i++] = env->eflags;
+    registers[i++] = env->segs[R_CS].selector;
+    registers[i++] = env->segs[R_SS].selector;
+    registers[i++] = env->segs[R_DS].selector;
+    registers[i++] = env->segs[R_ES].selector;
+    registers[i++] = env->segs[R_FS].selector;
+    registers[i++] = env->segs[R_GS].selector;
+    regno0 = i;
     /* XXX: convert floats */
     for(i = 0; i < 8; i++) {
-        memcpy(mem_buf + 16 * 4 + i * 10, &env->fpregs[i], 10);
+        memcpy(mem_buf + regno0 * sizeof(target_ulong) + i * 10, &env->fpregs[i], 10);
     }
-    registers[36] = env->fpuc;
+    regno1 = regno0 + (i * 10)/sizeof(target_ulong);
+    i = regno1;
+    registers[i++] = env->fpuc;
     fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
-    registers[37] = fpus;
-    registers[38] = 0; /* XXX: convert tags */
-    registers[39] = 0; /* fiseg */
-    registers[40] = 0; /* fioff */
-    registers[41] = 0; /* foseg */
-    registers[42] = 0; /* fooff */
-    registers[43] = 0; /* fop */
-   
-    for(i = 0; i < 16; i++)
+    registers[i++] = fpus;
+    registers[i++] = 0; /* XXX: convert tags */
+    registers[i++] = 0; /* fiseg */
+    registers[i++] = 0; /* fioff */
+    registers[i++] = 0; /* foseg */
+    registers[i++] = 0; /* fooff */
+    registers[i++] = 0; /* fop */
+    regno2 = i;
+    for(i = 0; i < regno0; i++)
         tswapls(&registers[i]);
-    for(i = 36; i < 44; i++)
+    for(i = regno1; i < regno2; i++)
         tswapls(&registers[i]);
-    return 44 * 4;
+    return (regno2 * sizeof(target_ulong));
 }
 
 static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
 {
-    uint32_t *registers = (uint32_t *)mem_buf;
+    target_ulong *registers = (target_ulong *)mem_buf;
     int i;
 
-    for(i = 0; i < 8; i++) {
+    for(i = 0; i < CPU_NB_REGS; i++) {
+#if defined(TARGET_X86_64)
+        env->regs[regnames[i]] = tswapl(registers[i]);
+#else
         env->regs[i] = tswapl(registers[i]);
+#endif
     }
-    env->eip = tswapl(registers[8]);
-    env->eflags = tswapl(registers[9]);
+    env->eip = tswapl(registers[CPU_NB_REGS]);
+    env->eflags = tswapl(registers[CPU_NB_REGS + 1]);
 #if defined(CONFIG_USER_ONLY)
 #define LOAD_SEG(index, sreg)\
             if (tswapl(registers[index]) != env->segs[sreg].selector)\
                 cpu_x86_load_seg(env, sreg, tswapl(registers[index]));
-            LOAD_SEG(10, R_CS);
-            LOAD_SEG(11, R_SS);
-            LOAD_SEG(12, R_DS);
-            LOAD_SEG(13, R_ES);
-            LOAD_SEG(14, R_FS);
-            LOAD_SEG(15, R_GS);
+            LOAD_SEG(CPU_NB_REGS + 2, R_CS);
+            LOAD_SEG(CPU_NB_REGS + 3, R_SS);
+            LOAD_SEG(CPU_NB_REGS + 4, R_DS);
+            LOAD_SEG(CPU_NB_REGS + 5, R_ES);
+            LOAD_SEG(CPU_NB_REGS + 6, R_FS);
+            LOAD_SEG(CPU_NB_REGS + 7, R_GS);
 #endif
 }
 

---------------------------------------------><-----------------------------------

Regards,
MingyanGuo
--
Three passions, simple but overwhelmingly strong, have governed my life:
the longing for love, the search for knowledge, and unbearable pity for
the suffering of mankind.
                         ---------Bertrand Russell

reply via email to

[Prev in Thread] Current Thread [Next in Thread]