[PATCH v9 18/20] target/arm/tcg/translate.c: replace translator_ldl_swap with translator_ldl_end

Pierrick Bouvier posted 20 patches 4 days, 16 hours ago
Maintainers: Richard Henderson <richard.henderson@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, Michael Rolnik <mrolnik@gmail.com>, Brian Cain <brian.cain@oss.qualcomm.com>, Helge Deller <deller@gmx.de>, Song Gao <gaosong@loongson.cn>, Laurent Vivier <laurent@vivier.eu>, "Edgar E. Iglesias" <edgar.iglesias@gmail.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Aurelien Jarno <aurelien@aurel32.net>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Aleksandar Rikalo <arikalo@gmail.com>, Stafford Horne <shorne@gmail.com>, Nicholas Piggin <npiggin@gmail.com>, Chinmay Rath <rathc@linux.ibm.com>, Glenn Miles <milesg@linux.ibm.com>, Palmer Dabbelt <palmer@dabbelt.com>, Alistair Francis <alistair.francis@wdc.com>, Weiwei Li <liwei1518@gmail.com>, Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>, Liu Zhiwei <zhiwei_liu@linux.alibaba.com>, Chao Liu <chao.liu.zevorn@gmail.com>, Yoshinori Sato <yoshinori.sato@nifty.com>, Ilya Leoshkevich <iii@linux.ibm.com>, David Hildenbrand <david@kernel.org>, Cornelia Huck <cohuck@redhat.com>, Eric Farman <farman@linux.ibm.com>, Matthew Rosato <mjrosato@linux.ibm.com>, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>, Artyom Tarasenko <atar4qemu@gmail.com>, Bastian Koppelmann <kbastian@rumtueddeln.de>, Max Filippov <jcmvbkbc@gmail.com>
There is a newer version of this series
[PATCH v9 18/20] target/arm/tcg/translate.c: replace translator_ldl_swap with translator_ldl_end
Posted by Pierrick Bouvier 4 days, 16 hours ago
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 target/arm/cpu.c           |  6 +-----
 target/arm/tcg/translate.c | 11 +++++------
 2 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index ccc47c8a9ad..b62de8addff 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -828,15 +828,11 @@ static void arm_disas_set_info(const 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->flags &= ~INSN_ARM_BE32;
-#ifndef CONFIG_USER_ONLY
     if (sctlr_b) {
+        info->endian |= BFD_ENDIAN_BIG;
         info->flags |= INSN_ARM_BE32;
     }
-#endif
 }
 
 static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
index 1fbe41ec643..5b6a80930af 100644
--- a/target/arm/tcg/translate.c
+++ b/target/arm/tcg/translate.c
@@ -6283,14 +6283,13 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
 static uint16_t arm_lduw_code(CPUARMState *env, DisasContextBase* s,
                               target_ulong addr, bool sctlr_b)
 {
-#ifndef CONFIG_USER_ONLY
-    /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
-       within each word.  Undo that now.  */
+    MemOp end = MO_LE;
     if (sctlr_b) {
+        /* In BE32 mode, adjacent Thumb instructions are swapped. */
         addr ^= 2;
+        end = MO_BE;
     }
-#endif
-    return translator_lduw_swap(env, s, addr, bswap_code(sctlr_b));
+    return translator_lduw_end(env, s, addr, end);
 }
 
 static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
@@ -6531,7 +6530,7 @@ static void arm_post_translate_insn(DisasContext *dc)
 static uint32_t arm_ldl_code(CPUARMState *env, DisasContextBase *s,
                              target_ulong addr, bool sctlr_b)
 {
-    return translator_ldl_swap(env, s, addr, bswap_code(sctlr_b));
+    return translator_ldl_end(env, s, addr, sctlr_b ? MO_BE : MO_LE);
 }
 
 static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
-- 
2.47.3
Re: [PATCH v9 18/20] target/arm/tcg/translate.c: replace translator_ldl_swap with translator_ldl_end
Posted by Richard Henderson 4 days, 11 hours ago
On 4/7/26 12:27, Pierrick Bouvier wrote:
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> ---
>   target/arm/cpu.c           |  6 +-----
>   target/arm/tcg/translate.c | 11 +++++------
>   2 files changed, 6 insertions(+), 11 deletions(-)
> 
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index ccc47c8a9ad..b62de8addff 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -828,15 +828,11 @@ static void arm_disas_set_info(const 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->flags &= ~INSN_ARM_BE32;
> -#ifndef CONFIG_USER_ONLY
>       if (sctlr_b) {
> +        info->endian |= BFD_ENDIAN_BIG;
>           info->flags |= INSN_ARM_BE32;
>       }
> -#endif
>   }
>   
>   static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)

With $subject, this should be split to its own patch.

With that,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~

> diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
> index 1fbe41ec643..5b6a80930af 100644
> --- a/target/arm/tcg/translate.c
> +++ b/target/arm/tcg/translate.c
> @@ -6283,14 +6283,13 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
>   static uint16_t arm_lduw_code(CPUARMState *env, DisasContextBase* s,
>                                 target_ulong addr, bool sctlr_b)
>   {
> -#ifndef CONFIG_USER_ONLY
> -    /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
> -       within each word.  Undo that now.  */
> +    MemOp end = MO_LE;
>       if (sctlr_b) {
> +        /* In BE32 mode, adjacent Thumb instructions are swapped. */
>           addr ^= 2;
> +        end = MO_BE;
>       }
> -#endif
> -    return translator_lduw_swap(env, s, addr, bswap_code(sctlr_b));
> +    return translator_lduw_end(env, s, addr, end);
>   }
>   
>   static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
> @@ -6531,7 +6530,7 @@ static void arm_post_translate_insn(DisasContext *dc)
>   static uint32_t arm_ldl_code(CPUARMState *env, DisasContextBase *s,
>                                target_ulong addr, bool sctlr_b)
>   {
> -    return translator_ldl_swap(env, s, addr, bswap_code(sctlr_b));
> +    return translator_ldl_end(env, s, addr, sctlr_b ? MO_BE : MO_LE);
>   }
>   
>   static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
Re: [PATCH v9 18/20] target/arm/tcg/translate.c: replace translator_ldl_swap with translator_ldl_end
Posted by Pierrick Bouvier 4 days, 3 hours ago
On 4/6/26 11:59 PM, Richard Henderson wrote:
> On 4/7/26 12:27, Pierrick Bouvier wrote:
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>> ---
>>    target/arm/cpu.c           |  6 +-----
>>    target/arm/tcg/translate.c | 11 +++++------
>>    2 files changed, 6 insertions(+), 11 deletions(-)
>>
>> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
>> index ccc47c8a9ad..b62de8addff 100644
>> --- a/target/arm/cpu.c
>> +++ b/target/arm/cpu.c
>> @@ -828,15 +828,11 @@ static void arm_disas_set_info(const 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->flags &= ~INSN_ARM_BE32;
>> -#ifndef CONFIG_USER_ONLY
>>        if (sctlr_b) {
>> +        info->endian |= BFD_ENDIAN_BIG;
>>            info->flags |= INSN_ARM_BE32;
>>        }
>> -#endif
>>    }
>>    
>>    static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
> 
> With $subject, this should be split to its own patch.
>

Sure, will split it.

> With that,
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> 
> 
> r~
> 
>> diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
>> index 1fbe41ec643..5b6a80930af 100644
>> --- a/target/arm/tcg/translate.c
>> +++ b/target/arm/tcg/translate.c
>> @@ -6283,14 +6283,13 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
>>    static uint16_t arm_lduw_code(CPUARMState *env, DisasContextBase* s,
>>                                  target_ulong addr, bool sctlr_b)
>>    {
>> -#ifndef CONFIG_USER_ONLY
>> -    /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
>> -       within each word.  Undo that now.  */
>> +    MemOp end = MO_LE;
>>        if (sctlr_b) {
>> +        /* In BE32 mode, adjacent Thumb instructions are swapped. */
>>            addr ^= 2;
>> +        end = MO_BE;
>>        }
>> -#endif
>> -    return translator_lduw_swap(env, s, addr, bswap_code(sctlr_b));
>> +    return translator_lduw_end(env, s, addr, end);
>>    }
>>    
>>    static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
>> @@ -6531,7 +6530,7 @@ static void arm_post_translate_insn(DisasContext *dc)
>>    static uint32_t arm_ldl_code(CPUARMState *env, DisasContextBase *s,
>>                                 target_ulong addr, bool sctlr_b)
>>    {
>> -    return translator_ldl_swap(env, s, addr, bswap_code(sctlr_b));
>> +    return translator_ldl_end(env, s, addr, sctlr_b ? MO_BE : MO_LE);
>>    }
>>    
>>    static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
>