From 3917149d96cfa5f619de770af6059f37b6e1df77 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Wed, 21 Sep 2011 18:13:16 +0000 Subject: Move GETPC from dyngen-exec.h to exec-all.h GETPC() can be used even from outside of helper code. Move the macro to a more accessible location. Avoid a compile warning from redefining it in exec.c. Signed-off-by: Blue Swirl --- exec-all.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'exec-all.h') diff --git a/exec-all.h b/exec-all.h index b1dfe109d2..1120f84661 100644 --- a/exec-all.h +++ b/exec-all.h @@ -267,6 +267,18 @@ extern spinlock_t tb_lock; extern int tb_invalidated_flag; +/* The return address may point to the start of the next instruction. + Subtracting one gets us the call instruction itself. */ +#if defined(__s390__) && !defined(__s390x__) +# 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 + #if !defined(CONFIG_USER_ONLY) extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; -- cgit v1.2.3