Patchwork Re: gcc 4.4 miscompiling cpu_exec() ?

login
register
mail settings
Submitter Paolo Bonzini
Date Feb. 23, 2010, 5:58 p.m.
Message ID <4B841757.3070808@redhat.com>
Download mbox | patch
Permalink /patch/46084/
State New
Headers show

Comments

Paolo Bonzini - Feb. 23, 2010, 5:58 p.m.
On 02/23/2010 03:50 PM, Jay Foad wrote:
> I'm building QEMU mipsel-linux-user with Ubuntu's GCC 4.4 on an x86
> host. Whenever I try to run a trivial MIPS executable, QEMU segfaults
> in cpu_loop() shortly after the call to cpu_mips_exec().
>
> The problem seems to be that cpu_exec() doesn't preserve ebp. It tries to:
>
>      saved_env_reg = (host_reg_t) env;
>
> where env is a global variable decorated with asm("ebp"). This saves
> ebp to the stack, but later on, in some function inlined into
> cpu_exec(), the value on the stack gets overwritten with something
> else.

Can you try this patch:


and if it works, possibly only each hunk of it?

Paolo
Jay Foad - Feb. 23, 2010, 6:17 p.m.
> Can you try this patch:

It works! Thanks.

> and if it works, possibly only each hunk of it?

Just the first hunk: works!
Just the second hunk: doesn't work

Can you explain why the volatile is necessary? Or is it working around
a problem with the compiler?

Thanks,
Jay.
Paolo Bonzini - Feb. 23, 2010, 6:18 p.m.
On 02/23/2010 07:17 PM, Jay Foad wrote:
>> Can you try this patch:
>
> It works! Thanks.
>
>> and if it works, possibly only each hunk of it?
>
> Just the first hunk: works!
> Just the second hunk: doesn't work
>
> Can you explain why the volatile is necessary? Or is it working around
> a problem with the compiler?

I don't know exactly without checking, but these were the main changes 
introduced by my 24ebf5f31a178051cff1a4aab5ba621037191577 patch.  I'll 
send it out shortly.

Paolo

Patch

diff --git a/cpu-exec.c b/cpu-exec.c
index 51aa416..bfaf908 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -215,7 +215,7 @@  static void cpu_handle_debug_exception(CPUState *env)

  int cpu_exec(CPUState *env1)
  {
-    host_reg_t saved_env_reg;
+    volatile host_reg_t saved_env_reg;
      int ret, interrupt_request;
      TranslationBlock *tb;
      uint8_t *tc_ptr;
@@ -230,8 +230,8 @@  int cpu_exec(CPUState *env1)
         value, so that files not including target-xyz/exec.h are free to
         use it.  */
      QEMU_BUILD_BUG_ON (sizeof (saved_env_reg) != sizeof (env));
-    saved_env_reg = (host_reg_t) env;
      asm("");
+    saved_env_reg = (host_reg_t) env;
      env = env1;

  #if defined(TARGET_I386)