Index: head/sys/arm/arm/elf_machdep.c =================================================================== --- head/sys/arm/arm/elf_machdep.c +++ head/sys/arm/arm/elf_machdep.c @@ -48,6 +48,8 @@ static boolean_t elf32_arm_abi_supported(struct image_params *); +u_long elf_hwcap; + struct sysentvec elf32_freebsd_sysvec = { .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, @@ -86,6 +88,7 @@ .sv_schedtail = NULL, .sv_thread_detach = NULL, .sv_trap = NULL, + .sv_hwcap = &elf_hwcap, }; INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); Index: head/sys/arm/arm/vfp.c =================================================================== --- head/sys/arm/arm/vfp.c +++ head/sys/arm/arm/vfp.c @@ -33,9 +33,11 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -115,6 +117,7 @@ vfp_exists = 1; is_d32 = 0; PCPU_SET(vfpsid, fpsid); /* save the fpsid */ + elf_hwcap |= HWCAP_VFP; vfp_arch = (fpsid & VFPSID_SUBVERSION2_MASK) >> VFPSID_SUBVERSION_OFF; @@ -122,9 +125,13 @@ if (vfp_arch >= VFP_ARCH3) { tmp = fmrx(mvfr0); PCPU_SET(vfpmvfr0, tmp); + elf_hwcap |= HWCAP_VFPv3; - if ((tmp & VMVFR0_RB_MASK) == 2) + if ((tmp & VMVFR0_RB_MASK) == 2) { + elf_hwcap |= HWCAP_VFPD32; is_d32 = 1; + } else + elf_hwcap |= HWCAP_VFPv3D16; tmp = fmrx(mvfr1); PCPU_SET(vfpmvfr1, tmp); Index: head/sys/arm/include/elf.h =================================================================== --- head/sys/arm/include/elf.h +++ head/sys/arm/include/elf.h @@ -115,4 +115,10 @@ #define ET_DYN_LOAD_ADDR 0x12000 +/* Flags passed in AT_HWCAP. */ +#define HWCAP_VFP 0x00000040 +#define HWCAP_VFPv3 0x00000200 +#define HWCAP_VFPv3D16 0x00000400 +#define HWCAP_VFPD32 0x00080000 + #endif /* !_MACHINE_ELF_H_ */ Index: head/sys/arm/include/md_var.h =================================================================== --- head/sys/arm/include/md_var.h +++ head/sys/arm/include/md_var.h @@ -38,6 +38,7 @@ extern int szsigcode; extern uint32_t *vm_page_dump; extern int vm_page_dump_size; +extern u_long elf_hwcap; extern int (*_arm_memcpy)(void *, void *, int, int); extern int (*_arm_bzero)(void *, int, int);