Commit 9b7b85d26006af61b69dbabe2354d73a8c67cc6c
1 parent
8bba5c81
Fix off-by-one unwinding error.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4570 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
11 changed files
with
12 additions
and
49 deletions
dyngen-exec.h
| @@ -287,4 +287,16 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; | @@ -287,4 +287,16 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; | ||
| 287 | #error unsupported CPU | 287 | #error unsupported CPU |
| 288 | #endif | 288 | #endif |
| 289 | 289 | ||
| 290 | +/* The return address may point to the start of the next instruction. | ||
| 291 | + Subtracting one gets us the call instruction itself. */ | ||
| 292 | +#if defined(__s390__) | ||
| 293 | +# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1)) | ||
| 294 | +#elif defined(__arm__) | ||
| 295 | +/* Thumb return addresses have the low bit set, so we need to subtract two. | ||
| 296 | + This is still safe in ARM mode because instructions are 4 bytes. */ | ||
| 297 | +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2)) | ||
| 298 | +#else | ||
| 299 | +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1)) | ||
| 300 | +#endif | ||
| 301 | + | ||
| 290 | #endif /* !defined(__DYNGEN_EXEC_H__) */ | 302 | #endif /* !defined(__DYNGEN_EXEC_H__) */ |
target-alpha/op_helper.c
| @@ -1093,12 +1093,6 @@ void helper_reset_FT2 (void) | @@ -1093,12 +1093,6 @@ void helper_reset_FT2 (void) | ||
| 1093 | /* Softmmu support */ | 1093 | /* Softmmu support */ |
| 1094 | #if !defined (CONFIG_USER_ONLY) | 1094 | #if !defined (CONFIG_USER_ONLY) |
| 1095 | 1095 | ||
| 1096 | -#ifdef __s390__ | ||
| 1097 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 1098 | -#else | ||
| 1099 | -# define GETPC() (__builtin_return_address(0)) | ||
| 1100 | -#endif | ||
| 1101 | - | ||
| 1102 | /* XXX: the two following helpers are pure hacks. | 1096 | /* XXX: the two following helpers are pure hacks. |
| 1103 | * Hopefully, we emulate the PALcode, then we should never see | 1097 | * Hopefully, we emulate the PALcode, then we should never see |
| 1104 | * HW_LD / HW_ST instructions. | 1098 | * HW_LD / HW_ST instructions. |
target-arm/op_helper.c
| @@ -68,11 +68,6 @@ uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, | @@ -68,11 +68,6 @@ uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, | ||
| 68 | #if !defined(CONFIG_USER_ONLY) | 68 | #if !defined(CONFIG_USER_ONLY) |
| 69 | 69 | ||
| 70 | #define MMUSUFFIX _mmu | 70 | #define MMUSUFFIX _mmu |
| 71 | -#ifdef __s390__ | ||
| 72 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 73 | -#else | ||
| 74 | -# define GETPC() (__builtin_return_address(0)) | ||
| 75 | -#endif | ||
| 76 | 71 | ||
| 77 | #define SHIFT 0 | 72 | #define SHIFT 0 |
| 78 | #include "softmmu_template.h" | 73 | #include "softmmu_template.h" |
target-cris/op_helper.c
| @@ -24,11 +24,6 @@ | @@ -24,11 +24,6 @@ | ||
| 24 | #include "mmu.h" | 24 | #include "mmu.h" |
| 25 | 25 | ||
| 26 | #define MMUSUFFIX _mmu | 26 | #define MMUSUFFIX _mmu |
| 27 | -#ifdef __s390__ | ||
| 28 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 29 | -#else | ||
| 30 | -# define GETPC() (__builtin_return_address(0)) | ||
| 31 | -#endif | ||
| 32 | 27 | ||
| 33 | #define SHIFT 0 | 28 | #define SHIFT 0 |
| 34 | #include "softmmu_template.h" | 29 | #include "softmmu_template.h" |
target-i386/helper.c
| @@ -4663,11 +4663,6 @@ static float approx_rcp(float a) | @@ -4663,11 +4663,6 @@ static float approx_rcp(float a) | ||
| 4663 | #if !defined(CONFIG_USER_ONLY) | 4663 | #if !defined(CONFIG_USER_ONLY) |
| 4664 | 4664 | ||
| 4665 | #define MMUSUFFIX _mmu | 4665 | #define MMUSUFFIX _mmu |
| 4666 | -#ifdef __s390__ | ||
| 4667 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 4668 | -#else | ||
| 4669 | -# define GETPC() (__builtin_return_address(0)) | ||
| 4670 | -#endif | ||
| 4671 | 4666 | ||
| 4672 | #define SHIFT 0 | 4667 | #define SHIFT 0 |
| 4673 | #include "softmmu_template.h" | 4668 | #include "softmmu_template.h" |
target-m68k/op_helper.c
| @@ -32,11 +32,6 @@ void do_interrupt(int is_hw) | @@ -32,11 +32,6 @@ void do_interrupt(int is_hw) | ||
| 32 | extern int semihosting_enabled; | 32 | extern int semihosting_enabled; |
| 33 | 33 | ||
| 34 | #define MMUSUFFIX _mmu | 34 | #define MMUSUFFIX _mmu |
| 35 | -#ifdef __s390__ | ||
| 36 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 37 | -#else | ||
| 38 | -# define GETPC() (__builtin_return_address(0)) | ||
| 39 | -#endif | ||
| 40 | 35 | ||
| 41 | #define SHIFT 0 | 36 | #define SHIFT 0 |
| 42 | #include "softmmu_template.h" | 37 | #include "softmmu_template.h" |
target-mips/op_helper.c
| @@ -22,12 +22,6 @@ | @@ -22,12 +22,6 @@ | ||
| 22 | 22 | ||
| 23 | #include "host-utils.h" | 23 | #include "host-utils.h" |
| 24 | 24 | ||
| 25 | -#ifdef __s390__ | ||
| 26 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 27 | -#else | ||
| 28 | -# define GETPC() (__builtin_return_address(0)) | ||
| 29 | -#endif | ||
| 30 | - | ||
| 31 | /*****************************************************************************/ | 25 | /*****************************************************************************/ |
| 32 | /* Exceptions processing helpers */ | 26 | /* Exceptions processing helpers */ |
| 33 | 27 |
target-ppc/op_helper.c
| @@ -2612,11 +2612,6 @@ DO_SPE_OP1(fsctuf); | @@ -2612,11 +2612,6 @@ DO_SPE_OP1(fsctuf); | ||
| 2612 | #if !defined (CONFIG_USER_ONLY) | 2612 | #if !defined (CONFIG_USER_ONLY) |
| 2613 | 2613 | ||
| 2614 | #define MMUSUFFIX _mmu | 2614 | #define MMUSUFFIX _mmu |
| 2615 | -#ifdef __s390__ | ||
| 2616 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 2617 | -#else | ||
| 2618 | -# define GETPC() (__builtin_return_address(0)) | ||
| 2619 | -#endif | ||
| 2620 | 2615 | ||
| 2621 | #define SHIFT 0 | 2616 | #define SHIFT 0 |
| 2622 | #include "softmmu_template.h" | 2617 | #include "softmmu_template.h" |
target-sh4/op_helper.c
| @@ -28,11 +28,6 @@ void do_raise_exception(void) | @@ -28,11 +28,6 @@ void do_raise_exception(void) | ||
| 28 | #ifndef CONFIG_USER_ONLY | 28 | #ifndef CONFIG_USER_ONLY |
| 29 | 29 | ||
| 30 | #define MMUSUFFIX _mmu | 30 | #define MMUSUFFIX _mmu |
| 31 | -#ifdef __s390__ | ||
| 32 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL)) | ||
| 33 | -#else | ||
| 34 | -# define GETPC() (__builtin_return_address(0)) | ||
| 35 | -#endif | ||
| 36 | 31 | ||
| 37 | #define SHIFT 0 | 32 | #define SHIFT 0 |
| 38 | #include "softmmu_template.h" | 33 | #include "softmmu_template.h" |
target-sparc/op_helper.c
| @@ -2871,12 +2871,6 @@ static void do_unaligned_access(target_ulong addr, int is_write, int is_user, | @@ -2871,12 +2871,6 @@ static void do_unaligned_access(target_ulong addr, int is_write, int is_user, | ||
| 2871 | 2871 | ||
| 2872 | #define MMUSUFFIX _mmu | 2872 | #define MMUSUFFIX _mmu |
| 2873 | #define ALIGNED_ONLY | 2873 | #define ALIGNED_ONLY |
| 2874 | -#ifdef __s390__ | ||
| 2875 | -# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & \ | ||
| 2876 | - 0x7fffffffUL)) | ||
| 2877 | -#else | ||
| 2878 | -# define GETPC() (__builtin_return_address(0)) | ||
| 2879 | -#endif | ||
| 2880 | 2874 | ||
| 2881 | #define SHIFT 0 | 2875 | #define SHIFT 0 |
| 2882 | #include "softmmu_template.h" | 2876 | #include "softmmu_template.h" |
tcg/arm/tcg-target.c
| @@ -1180,7 +1180,6 @@ static inline void tcg_out_qemu_st(TCGContext *s, int cond, | @@ -1180,7 +1180,6 @@ static inline void tcg_out_qemu_st(TCGContext *s, int cond, | ||
| 1180 | 1180 | ||
| 1181 | tcg_out_bl(s, cond, (tcg_target_long) qemu_st_helpers[s_bits] - | 1181 | tcg_out_bl(s, cond, (tcg_target_long) qemu_st_helpers[s_bits] - |
| 1182 | (tcg_target_long) s->code_ptr); | 1182 | (tcg_target_long) s->code_ptr); |
| 1183 | - | ||
| 1184 | # if TARGET_LONG_BITS == 64 | 1183 | # if TARGET_LONG_BITS == 64 |
| 1185 | if (opc == 3) | 1184 | if (opc == 3) |
| 1186 | tcg_out_dat_imm(s, cond, ARITH_ADD, 13, 13, 0x10); | 1185 | tcg_out_dat_imm(s, cond, ARITH_ADD, 13, 13, 0x10); |