Commit 572a9d4a880bdcc71c1880ee7416308259bda0d9

Authored by blueswir1
1 parent 79c63858

Improved workaround for the annoying glibc global register mangling bug

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4465 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 47 deletions
cpu-exec.c
... ... @@ -37,53 +37,18 @@
37 37 #include <sys/ucontext.h>
38 38 #endif
39 39  
  40 +#if defined(__sparc__) && !defined(HOST_SOLARIS)
  41 +// Work around ugly bugs in glibc that mangle global register contents
  42 +#undef env
  43 +#define env cpu_single_env
  44 +#endif
  45 +
40 46 int tb_invalidated_flag;
41 47 static unsigned long next_tb;
42 48  
43 49 //#define DEBUG_EXEC
44 50 //#define DEBUG_SIGNAL
45 51  
46   -#define SAVE_GLOBALS()
47   -#define RESTORE_GLOBALS()
48   -
49   -#if defined(__sparc__) && !defined(HOST_SOLARIS)
50   -#include <features.h>
51   -#if defined(__GLIBC__) && ((__GLIBC__ < 2) || \
52   - ((__GLIBC__ == 2) && (__GLIBC_MINOR__ <= 90)))
53   -// Work around ugly bugs in glibc that mangle global register contents
54   -
55   -static volatile void *saved_env;
56   -#undef SAVE_GLOBALS
57   -#define SAVE_GLOBALS() do { \
58   - saved_env = env; \
59   - } while(0)
60   -
61   -#undef RESTORE_GLOBALS
62   -#define RESTORE_GLOBALS() do { \
63   - env = (void *)saved_env; \
64   - } while(0)
65   -
66   -static int sparc_setjmp(jmp_buf buf)
67   -{
68   - int ret;
69   -
70   - SAVE_GLOBALS();
71   - ret = setjmp(buf);
72   - RESTORE_GLOBALS();
73   - return ret;
74   -}
75   -#undef setjmp
76   -#define setjmp(jmp_buf) sparc_setjmp(jmp_buf)
77   -
78   -static void sparc_longjmp(jmp_buf buf, int val)
79   -{
80   - SAVE_GLOBALS();
81   - longjmp(buf, val);
82   -}
83   -#define longjmp(jmp_buf, val) sparc_longjmp(jmp_buf, val)
84   -#endif
85   -#endif
86   -
87 52 void cpu_loop_exit(void)
88 53 {
89 54 /* NOTE: the register at this point must be saved by hand because
... ... @@ -176,9 +141,7 @@ static TranslationBlock *tb_find_slow(target_ulong pc,
176 141 tb->tc_ptr = tc_ptr;
177 142 tb->cs_base = cs_base;
178 143 tb->flags = flags;
179   - SAVE_GLOBALS();
180 144 cpu_gen_code(env, tb, &code_gen_size);
181   - RESTORE_GLOBALS();
182 145 code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
183 146  
184 147 /* check next page if needed */
... ... @@ -302,7 +265,6 @@ int cpu_exec(CPUState *env1)
302 265 #define SAVE_HOST_REGS 1
303 266 #include "hostregs_helper.h"
304 267 env = env1;
305   - SAVE_GLOBALS();
306 268  
307 269 env_to_regs();
308 270 #if defined(TARGET_I386)
... ... @@ -414,7 +376,6 @@ int cpu_exec(CPUState *env1)
414 376  
415 377 next_tb = 0; /* force lookup of first TB */
416 378 for(;;) {
417   - SAVE_GLOBALS();
418 379 interrupt_request = env->interrupt_request;
419 380 if (__builtin_expect(interrupt_request, 0)
420 381 #if defined(TARGET_I386)
... ... @@ -633,7 +594,6 @@ int cpu_exec(CPUState *env1)
633 594 lookup_symbol(tb->pc));
634 595 }
635 596 #endif
636   - RESTORE_GLOBALS();
637 597 /* see if we can patch the calling TB. When the TB
638 598 spans two pages, we cannot safely do a direct
639 599 jump. */
... ... @@ -651,6 +611,11 @@ int cpu_exec(CPUState *env1)
651 611 tc_ptr = tb->tc_ptr;
652 612 env->current_tb = tb;
653 613 /* execute the generated code */
  614 +#if defined(__sparc__) && !defined(HOST_SOLARIS)
  615 +#undef env
  616 + env = cpu_single_env;
  617 +#define env cpu_single_env
  618 +#endif
654 619 next_tb = tcg_qemu_tb_exec(tc_ptr);
655 620 env->current_tb = NULL;
656 621 /* reset soft MMU for next block (it can currently
... ... @@ -701,7 +666,6 @@ int cpu_exec(CPUState *env1)
701 666 #endif
702 667  
703 668 /* restore global registers */
704   - RESTORE_GLOBALS();
705 669 #include "hostregs_helper.h"
706 670  
707 671 /* fail safe : never use cpu_single_env outside cpu_exec() */
... ...