qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] powerpc hang


From: Fabrice Bellard
Subject: Re: [Qemu-devel] powerpc hang
Date: Sat, 09 Aug 2003 12:51:58 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.1) Gecko/20020828

It should be safe. I am going to merge your patch. Thank you!

Fabrice.

Jon Nall wrote:
On Fri, Aug 08, 2003 at 08:13:35AM -0500, Jon Nall wrote:

 Question: is it safe to replace all of these with ESP since ESP should
 default to env->regs[R_ESP] if there is no AREG defined for the
 architecture? (or more generally, is it safe to replace env->regs[XXX]
 with XXX?)


i replaced all instances of env->regs[R_ESP] in helper-i386.c with ESP
(see below). this allowed me to run test-i386 to completion with no
errors! i'm attaching a full patch to get qemu working on ppc/gcc3,
which includes this change and the changes i posted previously.

NOTE: there was one instance of env->regs[E_ESP] in helper-i386.c that
went unchanged -- the one in cpu_loop_exit(), since this was setting the
register to ESP anyway.


nall.


------------------------------------------------------------------------

--- dyngen.c    11 Jul 2003 15:16:56 -0000      1.26
+++ dyngen.c    9 Aug 2003 02:52:25 -0000
@@ -687,7 +687,11 @@
if (val >= start_offset && val < start_offset + copy_size) {
                         n = strtol(p, NULL, 10);
+#if ( __GNUC__ == 3) && defined(__powerpc__)
+                        fprintf(outfile, "    label_offsets[%d] = %d + 
(gen_code_ptr - gen_code_buf);\n", n, val - start_offset + 4);
+#else
                         fprintf(outfile, "    label_offsets[%d] = %d + 
(gen_code_ptr - gen_code_buf);\n", n, val - start_offset);
+#endif
                     }
                 }
             }
--- exec.h      26 Jul 2003 12:06:08 -0000      1.13
+++ exec.h      9 Aug 2003 02:52:26 -0000
@@ -210,6 +210,7 @@
 label ## n:\
     T0 = (long)(tbparam) + (n);\
     EIP = eip;\
+    EXIT_TB();\
 } while (0)
#else
--- helper-i386.c       29 Jul 2003 20:53:01 -0000      1.11
+++ helper-i386.c       9 Aug 2003 02:52:27 -0000
@@ -285,13 +285,13 @@
/* XXX: check that enough room is available */
     if (new_stack) {
-        old_esp = env->regs[R_ESP];
+        old_esp = ESP;
         old_ss = env->segs[R_SS].selector;
         load_seg(R_SS, ss, env->eip);
     } else {
         old_esp = 0;
         old_ss = 0;
-        esp = env->regs[R_ESP];
+        esp = ESP;
     }
     if (is_int)
         old_eip = next_eip;
@@ -300,7 +300,7 @@
     old_cs = env->segs[R_CS].selector;
     load_seg(R_CS, selector, env->eip);
     env->eip = offset;
-    env->regs[R_ESP] = esp - push_size;
+    ESP = esp - push_size;
     ssp = env->segs[R_SS].base + esp;
     if (shift == 1) {
         int old_eflags;
@@ -374,7 +374,7 @@
     ptr = dt->base + intno * 4;
     offset = lduw(ptr);
     selector = lduw(ptr + 2);
-    esp = env->regs[R_ESP];
+    esp = ESP;
     ssp = env->segs[R_SS].base;
     if (is_int)
         old_eip = next_eip;
@@ -389,7 +389,7 @@
     stw(ssp + (esp & 0xffff), old_eip);
/* update processor state */
-    env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff);
+    ESP = (ESP & ~0xffff) | (esp & 0xffff);
     env->eip = offset;
     env->segs[R_CS].selector = selector;
     env->segs[R_CS].base = (uint8_t *)(selector << 4);
@@ -784,7 +784,7 @@
new_cs = T0;
     new_eip = T1;
-    esp = env->regs[R_ESP];
+    esp = ESP;
     esp_mask = 0xffffffff;
     if (!(env->segs[R_SS].flags & DESC_B_MASK))
         esp_mask = 0xffff;
@@ -802,9 +802,9 @@
     }
if (!(env->segs[R_SS].flags & DESC_B_MASK))
-        env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff);
+        ESP = (ESP & ~0xffff) | (esp & 0xffff);
     else
-        env->regs[R_ESP] = esp;
+        ESP = esp;
     env->eip = new_eip;
     env->segs[R_CS].selector = new_cs;
     env->segs[R_CS].base = (uint8_t *)(new_cs << 4);
@@ -846,7 +846,7 @@
         if (!(e2 & DESC_P_MASK))
             raise_exception_err(EXCP0B_NOSEG, new_cs & 0xfffc);
- sp = env->regs[R_ESP];
+        sp = ESP;
         if (!(env->segs[R_SS].flags & DESC_B_MASK))
             sp &= 0xffff;
         ssp = env->segs[R_SS].base + sp;
@@ -868,9 +868,9 @@
             raise_exception_err(EXCP0D_GPF, new_cs & 0xfffc);
         /* from this point, not restartable */
         if (!(env->segs[R_SS].flags & DESC_B_MASK))
-            env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff);
+            ESP = (ESP & 0xffff0000) | (sp & 0xffff);
         else
-            env->regs[R_ESP] = sp;
+            ESP = sp;
         env->segs[R_CS].base = sc1.base;
         env->segs[R_CS].limit = sc1.limit;
         env->segs[R_CS].flags = sc1.flags;
@@ -938,7 +938,7 @@
             param_count = e2 & 0x1f;
             push_size = ((param_count * 2) + 8) << shift;
- old_esp = env->regs[R_ESP];
+            old_esp = ESP;
             old_ss = env->segs[R_SS].selector;
             if (!(env->segs[R_SS].flags & DESC_B_MASK))
                 old_esp &= 0xffff;
@@ -995,11 +995,12 @@
         load_seg(R_CS, selector, env->eip);
         /* from this point, not restartable if same priviledge */
         if (!(env->segs[R_SS].flags & DESC_B_MASK))
-            env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | (sp & 0xffff);
+            ESP = (ESP & 0xffff0000) | (sp & 0xffff);
         else
-            env->regs[R_ESP] = sp;
+            ESP = sp;
         EIP = offset;
     }
+
 }
/* init the segment cache in vm86 mode */
@@ -1020,7 +1021,7 @@
     uint8_t *ssp;
     int eflags_mask;
- sp = env->regs[R_ESP] & 0xffff;
+    sp = ESP & 0xffff;
     ssp = env->segs[R_SS].base + sp;
     if (shift == 1) {
         /* 32 bits */
@@ -1034,7 +1035,7 @@
         new_eip = lduw(ssp);
     }
     new_esp = sp + (6 << shift);
- env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | + ESP = (ESP & 0xffff0000) | (new_esp & 0xffff);
     load_seg_vm(R_CS, new_cs);
     env->eip = new_eip;
@@ -1053,7 +1054,7 @@
     int cpl, dpl, rpl, eflags_mask;
     uint8_t *ssp;
- sp = env->regs[R_ESP];
+    sp = ESP;
     if (!(env->segs[R_SS].flags & DESC_B_MASK))
         sp &= 0xffff;
     ssp = env->segs[R_SS].base + sp;
@@ -1129,9 +1130,9 @@
         load_seg(R_SS, new_ss, env->eip);
     }
     if (env->segs[R_SS].flags & DESC_B_MASK)
-        env->regs[R_ESP] = new_esp;
+        ESP = new_esp;
     else
- env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | + ESP = (ESP & 0xffff0000) | (new_esp & 0xffff);
     env->eip = new_eip;
     if (is_iret) {
@@ -1164,7 +1165,7 @@
     load_seg_vm(R_GS, new_gs);
env->eip = new_eip;
-    env->regs[R_ESP] = new_esp;
+    ESP = new_esp;
 }
void helper_iret_protected(int shift)


------------------------------------------------------------------------

_______________________________________________
Qemu-devel mailing list
address@hidden
http://mail.nongnu.org/mailman/listinfo/qemu-devel


--
Fabrice.





reply via email to

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