From 9b7b85d26006af61b69dbabe2354d73a8c67cc6c Mon Sep 17 00:00:00 2001 From: pbrook Date: Sun, 25 May 2008 00:36:06 +0000 Subject: 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 | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'dyngen-exec.h') diff --git a/dyngen-exec.h b/dyngen-exec.h index 52cb779de6..f51d363287 100644 --- a/dyngen-exec.h +++ b/dyngen-exec.h @@ -287,4 +287,16 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; #error unsupported CPU #endif +/* The return address may point to the start of the next instruction. + Subtracting one gets us the call instruction itself. */ +#if defined(__s390__) +# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1)) +#elif defined(__arm__) +/* Thumb return addresses have the low bit set, so we need to subtract two. + This is still safe in ARM mode because instructions are 4 bytes. */ +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2)) +#else +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1)) +#endif + #endif /* !defined(__DYNGEN_EXEC_H__) */ -- cgit v1.2.3