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); |