[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] tcg-i386: Remove abort from GETPC_LDST
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH] tcg-i386: Remove abort from GETPC_LDST |
Date: |
Thu, 29 Aug 2013 08:21:37 -0700 |
Indeed, remove it entirely and remove the is_tcg_gen_code check
from GETPC_EXT.
Fixes https://bugs.launchpad.net/qemu/+bug/1218098 wherein a call
to a "normal" helper function performed a sequence of tail calls
all the way into the memory helper functions, leading to a stack
frame in which the memory helper function appeared to be called
directly from tcg.
Signed-off-by: Richard Henderson <address@hidden>
---
include/exec/exec-all.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
This is actually conclusive proof that using is_tcg_gen_code, and
thus any scheme that requires GETPC_LDST, is fundamentally flawed.
Thankfully, the follow-up patch sets that I've already posted give
a framework for properly fixing this. I've already posted a cleanup
for ARM to fix this. I have pending but unposted patch sets for
AArch64 and PowerPC.
In the meantime, please apply this fix for x86_64 asap.
r~
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index b70028a..ffb69a4 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -326,9 +326,7 @@ extern uintptr_t tci_tb_ptr;
(6) jump to corresponding code of the next of fast path
*/
# if defined(__i386__) || defined(__x86_64__)
-# define GETRA() ((uintptr_t)__builtin_return_address(0))
-/* The return address argument for ldst is passed directly. */
-# define GETPC_LDST() (abort(), 0)
+# define GETPC_EXT() GETPC()
# elif defined (_ARCH_PPC) && !defined (_ARCH_PPC64)
# define GETRA() ((uintptr_t)__builtin_return_address(0))
# define GETPC_LDST() ((uintptr_t) ((*(int32_t *)(GETRA() - 4)) - 1))
@@ -349,7 +347,7 @@ static inline uintptr_t tcg_getpc_ldst(uintptr_t ra)
not the start of the next opcode */
return ra;
}
-#elif defined(__aarch64__)
+# elif defined(__aarch64__)
# define GETRA() ((uintptr_t)__builtin_return_address(0))
# define GETPC_LDST() tcg_getpc_ldst(GETRA())
static inline uintptr_t tcg_getpc_ldst(uintptr_t ra)
@@ -367,7 +365,9 @@ static inline uintptr_t tcg_getpc_ldst(uintptr_t ra)
# error "CONFIG_QEMU_LDST_OPTIMIZATION needs GETPC_LDST() implementation!"
# endif
bool is_tcg_gen_code(uintptr_t pc_ptr);
-# define GETPC_EXT() (is_tcg_gen_code(GETRA()) ? GETPC_LDST() : GETPC())
+# ifndef GETPC_EXT
+# define GETPC_EXT() (is_tcg_gen_code(GETRA()) ? GETPC_LDST() : GETPC())
+# endif
#else
# define GETPC_EXT() GETPC()
#endif
--
1.8.1.4
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, (continued)
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Richard Henderson, 2013/08/26
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Aurelien Jarno, 2013/08/27
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Richard Henderson, 2013/08/27
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Aurelien Jarno, 2013/08/27
- Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Richard Henderson, 2013/08/27
Re: [Qemu-devel] [PULL 5/7] tcg: Add mmu helpers that take a return address argument, Peter Maydell, 2013/08/26
[Qemu-devel] [PULL 6/7] tcg: Tidy softmmu_template.h, Richard Henderson, 2013/08/26
[Qemu-devel] [PULL 7/7] tcg-i386: Use new return-argument ld/st helpers, Richard Henderson, 2013/08/26
Re: [Qemu-devel] [PULL 0/7] Improve tcg ldst optimization, Aurelien Jarno, 2013/08/27