Author: jhb
Date: Thu Sep 14 14:30:43 2017
New Revision: 323580
URL: https://svnweb.freebsd.org/changeset/base/323580

Log:
  Add AT_HWCAP flags for VFP settings for FreeBSD/arm.
  
  These flags match the meaning and value of flags in Linux, though
  Linux has many more flags.
  
  Reviewed by:  stevek, Michal Meloun <meloun-miracle-cz> (earlier version)
  MFC after:    1 month
  Differential Revision:        https://reviews.freebsd.org/D12291

Modified:
  head/sys/arm/arm/elf_machdep.c
  head/sys/arm/arm/vfp.c
  head/sys/arm/include/elf.h
  head/sys/arm/include/md_var.h

Modified: head/sys/arm/arm/elf_machdep.c
==============================================================================
--- head/sys/arm/arm/elf_machdep.c      Thu Sep 14 14:26:55 2017        
(r323579)
+++ head/sys/arm/arm/elf_machdep.c      Thu Sep 14 14:30:43 2017        
(r323580)
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
 
 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 @@ struct sysentvec elf32_freebsd_sysvec = {
        .sv_schedtail   = NULL,
        .sv_thread_detach = NULL,
        .sv_trap        = NULL,
+       .sv_hwcap       = &elf_hwcap,
 };
 INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec);
 

Modified: head/sys/arm/arm/vfp.c
==============================================================================
--- head/sys/arm/arm/vfp.c      Thu Sep 14 14:26:55 2017        (r323579)
+++ head/sys/arm/arm/vfp.c      Thu Sep 14 14:30:43 2017        (r323580)
@@ -33,9 +33,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
+#include <sys/imgact_elf.h>
 #include <sys/kernel.h>
 
 #include <machine/armreg.h>
+#include <machine/elf.h>
 #include <machine/frame.h>
 #include <machine/md_var.h>
 #include <machine/pcb.h>
@@ -115,6 +117,7 @@ vfp_init(void)
                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 @@ vfp_init(void)
                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);

Modified: head/sys/arm/include/elf.h
==============================================================================
--- head/sys/arm/include/elf.h  Thu Sep 14 14:26:55 2017        (r323579)
+++ head/sys/arm/include/elf.h  Thu Sep 14 14:30:43 2017        (r323580)
@@ -115,4 +115,10 @@ __ElfType(Auxinfo);
 
 #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_ */

Modified: head/sys/arm/include/md_var.h
==============================================================================
--- head/sys/arm/include/md_var.h       Thu Sep 14 14:26:55 2017        
(r323579)
+++ head/sys/arm/include/md_var.h       Thu Sep 14 14:30:43 2017        
(r323580)
@@ -38,6 +38,7 @@ extern char sigcode[];
 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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to