Message ID | 20231030174000.3792225-3-peter.maydell@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/arm: Fix various FEAT_MOPS bugs | expand |
On 30/10/23 18:39, Peter Maydell wrote: > The AArch64 ELF hwcap2 field is 64 bits, but our get_elf_hwcap2() > works with uint32_t, so it accidentally fails to report any hwcaps > over bit 31. Use uint64_t here. > > The Arm hwcap2 is only 32 bits (because the ELF format makes these > fields be the size of "long" in the ABI), but since it shares the > prototype declaration for get_elf_hwcap2() it is easier to also > expand it to 64 bits. > > The only hwcap fields we implement already that are affected by this > are the HBC and MOPS ones, neither of which were implemented in a > previous release, so this doesn't need backporting to older stable > branches. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > linux-user/loader.h | 2 +- > linux-user/elfload.c | 8 ++++---- > 2 files changed, 5 insertions(+), 5 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff --git a/linux-user/loader.h b/linux-user/loader.h index 324e5c872af..9be00da40a4 100644 --- a/linux-user/loader.h +++ b/linux-user/loader.h @@ -61,7 +61,7 @@ uint32_t get_elf_hwcap(void); const char *elf_hwcap_str(uint32_t bit); #endif #if defined(TARGET_AARCH64) || defined(TARGET_ARM) -uint32_t get_elf_hwcap2(void); +uint64_t get_elf_hwcap2(void); const char *elf_hwcap2_str(uint32_t bit); #endif diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 2e3809f03c4..6fb44206fab 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -520,10 +520,10 @@ uint32_t get_elf_hwcap(void) return hwcaps; } -uint32_t get_elf_hwcap2(void) +uint64_t get_elf_hwcap2(void) { ARMCPU *cpu = ARM_CPU(thread_cpu); - uint32_t hwcaps = 0; + uint64_t hwcaps = 0; GET_FEATURE_ID(aa32_aes, ARM_HWCAP2_ARM_AES); GET_FEATURE_ID(aa32_pmull, ARM_HWCAP2_ARM_PMULL); @@ -784,10 +784,10 @@ uint32_t get_elf_hwcap(void) return hwcaps; } -uint32_t get_elf_hwcap2(void) +uint64_t get_elf_hwcap2(void) { ARMCPU *cpu = ARM_CPU(thread_cpu); - uint32_t hwcaps = 0; + uint64_t hwcaps = 0; GET_FEATURE_ID(aa64_dcpodp, ARM_HWCAP2_A64_DCPODP); GET_FEATURE_ID(aa64_sve2, ARM_HWCAP2_A64_SVE2);
The AArch64 ELF hwcap2 field is 64 bits, but our get_elf_hwcap2() works with uint32_t, so it accidentally fails to report any hwcaps over bit 31. Use uint64_t here. The Arm hwcap2 is only 32 bits (because the ELF format makes these fields be the size of "long" in the ABI), but since it shares the prototype declaration for get_elf_hwcap2() it is easier to also expand it to 64 bits. The only hwcap fields we implement already that are affected by this are the HBC and MOPS ones, neither of which were implemented in a previous release, so this doesn't need backporting to older stable branches. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- linux-user/loader.h | 2 +- linux-user/elfload.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)