qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 15/24] bsd-user/arm/target_arch_elf.h: arm get hwcap


From: Kyle Evans
Subject: Re: [PATCH 15/24] bsd-user/arm/target_arch_elf.h: arm get hwcap
Date: Tue, 26 Oct 2021 01:02:04 -0500

On Tue, Oct 19, 2021 at 11:45 AM Warner Losh <imp@bsdimp.com> wrote:
>
> Implement get_elf_hwcap to get the first word of hardware capabilities.
>
> Signed-off-by: Klye Evans <kevans@FreeBSD.org>
> Signed-off-by: Stacey Son <sson@FreeBSD.org>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
>  bsd-user/arm/target_arch_elf.h | 72 +++++++++++++++++++++++++++++++++-
>  1 file changed, 71 insertions(+), 1 deletion(-)
>
> diff --git a/bsd-user/arm/target_arch_elf.h b/bsd-user/arm/target_arch_elf.h
> index 15b5c66511..02d25b8926 100644
> --- a/bsd-user/arm/target_arch_elf.h
> +++ b/bsd-user/arm/target_arch_elf.h
> @@ -31,6 +31,76 @@
>  #define USE_ELF_CORE_DUMP
>  #define ELF_EXEC_PAGESIZE       4096
>
> -#define ELF_HWCAP 0
> +#define ELF_HWCAP get_elf_hwcap()
> +
> +#define GET_FEATURE(feat, hwcap) \
> +    do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0)
> +
> +#define GET_FEATURE_ID(feat, hwcap) \
> +    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)
> +
> +enum {
> +    ARM_HWCAP_ARM_SWP       = 1 << 0,
> +    ARM_HWCAP_ARM_HALF      = 1 << 1,
> +    ARM_HWCAP_ARM_THUMB     = 1 << 2,
> +    ARM_HWCAP_ARM_26BIT     = 1 << 3,
> +    ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
> +    ARM_HWCAP_ARM_FPA       = 1 << 5,
> +    ARM_HWCAP_ARM_VFP       = 1 << 6,
> +    ARM_HWCAP_ARM_EDSP      = 1 << 7,
> +    ARM_HWCAP_ARM_JAVA      = 1 << 8,
> +    ARM_HWCAP_ARM_IWMMXT    = 1 << 9,
> +    ARM_HWCAP_ARM_CRUNCH    = 1 << 10,
> +    ARM_HWCAP_ARM_THUMBEE   = 1 << 11,
> +    ARM_HWCAP_ARM_NEON      = 1 << 12,
> +    ARM_HWCAP_ARM_VFPv3     = 1 << 13,
> +    ARM_HWCAP_ARM_VFPv3D16  = 1 << 14,
> +    ARM_HWCAP_ARM_TLS       = 1 << 15,
> +    ARM_HWCAP_ARM_VFPv4     = 1 << 16,
> +    ARM_HWCAP_ARM_IDIVA     = 1 << 17,
> +    ARM_HWCAP_ARM_IDIVT     = 1 << 18,
> +    ARM_HWCAP_ARM_VFPD32    = 1 << 19,
> +    ARM_HWCAP_ARM_LPAE      = 1 << 20,
> +    ARM_HWCAP_ARM_EVTSTRM   = 1 << 21,
> +};
> +
> +static uint32_t get_elf_hwcap(void)
> +{
> +    ARMCPU *cpu = ARM_CPU(thread_cpu);
> +    uint32_t hwcaps = 0;
> +
> +    hwcaps |= ARM_HWCAP_ARM_SWP;
> +    hwcaps |= ARM_HWCAP_ARM_HALF;
> +    hwcaps |= ARM_HWCAP_ARM_THUMB;
> +    hwcaps |= ARM_HWCAP_ARM_FAST_MULT;
> +
> +    /* probe for the extra features */
> +    /* EDSP is in v5TE and above */
> +    GET_FEATURE(ARM_FEATURE_V5, ARM_HWCAP_ARM_EDSP);
> +    GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT);
> +    GET_FEATURE(ARM_FEATURE_THUMB2EE, ARM_HWCAP_ARM_THUMBEE);
> +    GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON);
> +    GET_FEATURE(ARM_FEATURE_V6K, ARM_HWCAP_ARM_TLS);
> +    GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE);
> +    GET_FEATURE_ID(aa32_arm_div, ARM_HWCAP_ARM_IDIVA);
> +    GET_FEATURE_ID(aa32_thumb_div, ARM_HWCAP_ARM_IDIVT);
> +    GET_FEATURE_ID(aa32_vfp, ARM_HWCAP_ARM_VFP);
> +
> +    if (cpu_isar_feature(aa32_fpsp_v3, cpu) ||
> +        cpu_isar_feature(aa32_fpdp_v3, cpu)) {
> +        hwcaps |= ARM_HWCAP_ARM_VFPv3;
> +        if (cpu_isar_feature(aa32_simd_r32, cpu)) {
> +            hwcaps |= ARM_HWCAP_ARM_VFPD32;
> +        } else {
> +            hwcaps |= ARM_HWCAP_ARM_VFPv3D16;
> +        }
> +    }
> +    GET_FEATURE_ID(aa32_simdfmac, ARM_HWCAP_ARM_VFPv4);
> +
> +    return hwcaps;
> +}
> +
> +#undef GET_FEATURE
> +#undef GET_FEATURE_ID
>
>  #endif /* _TARGET_ARCH_ELF_H_ */
> --
> 2.32.0
>

Reviewed-by: Kyle Evans <kevans@FreeBSD.org>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]