Split out GETPC and GETPC_ADJ to a target-independent header. Signed-off-by: Richard Henderson <[email protected]> --- include/exec/exec-all.h | 19 +------------------ include/exec/helper-getpc.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 include/exec/helper-getpc.h
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index a758b7a843..22a99ca502 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -26,6 +26,7 @@ #endif #include "exec/mmu-access-type.h" #include "exec/translation-block.h" +#include "exec/helper-getpc.h" #if defined(CONFIG_TCG) @@ -177,24 +178,6 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t last); void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); -/* GETPC is the true target of the return instruction that we'll execute. */ -#if defined(CONFIG_TCG_INTERPRETER) -extern __thread uintptr_t tci_tb_ptr; -# define GETPC() tci_tb_ptr -#else -# define GETPC() \ - ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) -#endif - -/* The true return address will often point to a host insn that is part of - the next translated guest insn. Adjust the address backward to point to - the middle of the call insn. Subtracting one would do the job except for - several compressed mode architectures (arm, mips) which set the low bit - to indicate the compressed mode; subtracting two works around that. It - is also the case that there are no host isas that contain a call insn - smaller than 4 bytes, so we don't worry about special-casing this. */ -#define GETPC_ADJ 2 - #if !defined(CONFIG_USER_ONLY) /** diff --git a/include/exec/helper-getpc.h b/include/exec/helper-getpc.h new file mode 100644 index 0000000000..1c8bd72c11 --- /dev/null +++ b/include/exec/helper-getpc.h @@ -0,0 +1,31 @@ +/* + * Get host pc for helper unwinding. + * + * Copyright (c) 2003 Fabrice Bellard + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef HELPER_GETPC_H +#define HELPER_GETPC_H + +/* GETPC is the true target of the return instruction that we'll execute. */ +#if defined(CONFIG_TCG_INTERPRETER) +extern __thread uintptr_t tci_tb_ptr; +# define GETPC() tci_tb_ptr +#else +# define GETPC() \ + ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) +#endif + +/* + * The true return address will often point to a host insn that is part of + * the next translated guest insn. Adjust the address backward to point to + * the middle of the call insn. Subtracting one would do the job except for + * several compressed mode architectures (arm, mips) which set the low bit + * to indicate the compressed mode; subtracting two works around that. It + * is also the case that there are no host isas that contain a call insn + * smaller than 4 bytes, so we don't worry about special-casing this. + */ +#define GETPC_ADJ 2 + +#endif /* HELPER_GETPC_H */ -- 2.43.0
