On Tue, Oct 19, 2021 at 11:45 AM Warner Losh <i...@bsdimp.com> wrote: > > Implement get_elf_hwcap to get the first word of hardware capabilities. > > Signed-off-by: Klye Evans <kev...@freebsd.org> > Signed-off-by: Stacey Son <s...@freebsd.org> > Signed-off-by: Warner Losh <i...@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 <kev...@freebsd.org>