On Mon, Mar 15, 2010 at 12:26:27PM +0000, Paul Brook wrote: > > +static uint32_t get_elf_hwcap(void) > > +{ > > + return thread_env->features; > > +} > > No. These values are not the same. > > Paul >
Yes, these values are indeed not the same. Below is an updated patch with a function similar to the PPC get_elf_hwcap function. I am unsure if I have too many or too few features as I do not know the details on all the capability flags, so comments are more than welcome. Signed-off-by: Lars Munch <l...@segv.dk> --- linux-user/elfload.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 91eea62..6364176 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -333,10 +333,26 @@ enum ARM_HWCAP_ARM_VFPv3D16 = 1 << 13, }; -#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF \ - | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT \ - | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP \ - | ARM_HWCAP_ARM_NEON | ARM_HWCAP_ARM_VFPv3 ) +#define ELF_HWCAP get_elf_hwcap() + +static uint32_t get_elf_hwcap(void) +{ + CPUARMState *e = thread_env; + uint32_t features = ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF + | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT + | ARM_HWCAP_ARM_FPA; + +#define GET_FEATURE(flag, feature) \ + do {if (e->features & flag) features |= feature; } while(0) + GET_FEATURE(ARM_FEATURE_VFP, ARM_HWCAP_ARM_VFP); + GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT); + GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON); + GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPv3); + GET_FEATURE(ARM_FEATURE_VFP_FP16, ARM_HWCAP_ARM_VFPv3D16); +#undef GET_FEATURE + + return features; +} #endif -- 1.7.0