On 3/7/25 10:56, Richard Henderson wrote:
> Split out GETPC and GETPC_ADJ to a target-independent header.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> 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 */
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>