Commit 9b7b85d26006af61b69dbabe2354d73a8c67cc6c

Authored by pbrook
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
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);