On 29/04/25, Pierrick Bouvier wrote:
> Remove TARGET_BIG_ENDIAN dependency.
>
> Signed-off-by: Pierrick Bouvier <[email protected]>
> ---
> target/arm/cpu.c | 22 +++++++++++-----------
> 1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index e7a15ade8b4..85e886944f6 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -67,6 +67,15 @@ static void arm_cpu_set_pc(CPUState *cs, vaddr value)
> }
> }
>
> +static bool arm_cpu_is_big_endian(CPUState *cs)
> +{
> + ARMCPU *cpu = ARM_CPU(cs);
> + CPUARMState *env = &cpu->env;
> +
> + cpu_synchronize_state(cs);
> + return arm_cpu_data_is_big_endian(env);
> +}
> +
> static vaddr arm_cpu_get_pc(CPUState *cs)
> {
> ARMCPU *cpu = ARM_CPU(cs);
> @@ -1130,15 +1139,6 @@ static void arm_cpu_kvm_set_irq(void *opaque, int irq,
> int level)
> #endif
> }
>
> -static bool arm_cpu_virtio_is_big_endian(CPUState *cs)
> -{
> - ARMCPU *cpu = ARM_CPU(cs);
> - CPUARMState *env = &cpu->env;
> -
> - cpu_synchronize_state(cs);
> - return arm_cpu_data_is_big_endian(env);
> -}
> -
> #ifdef CONFIG_TCG
> bool arm_cpu_exec_halt(CPUState *cs)
> {
> @@ -1203,7 +1203,7 @@ static void arm_disas_set_info(CPUState *cpu,
> disassemble_info *info)
>
> info->endian = BFD_ENDIAN_LITTLE;
> if (bswap_code(sctlr_b)) {
> - info->endian = TARGET_BIG_ENDIAN ? BFD_ENDIAN_LITTLE :
> BFD_ENDIAN_BIG;
> + info->endian = arm_cpu_is_big_endian(cpu) ? BFD_ENDIAN_LITTLE :
> BFD_ENDIAN_BIG;
> }
I'm not the most familiar with arm but as far as I can tell these are
not equivalent. My understanding is that arm_cpu_is_big_endian() models
data endianness, and TARGET_BIG_ENDIAN instruction endianness.
Also, for user mode where this branch is relevant, bswap_code() still
depends on TARGET_BIG_ENDIAN anyway and the above branch would reduce to
(on arm32)
if (TARGET_BIG_ENDIAN ^ sctlr_b) {
info->endian = sctlr_b ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
}
giving the opposite result to the original code.
--
Anton Johansson
rev.ng Labs Srl.