Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167006092
D17137.id47959.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D17137.id47959.diff
View Options
Index: sys/arm64/arm64/elf_machdep.c
===================================================================
--- sys/arm64/arm64/elf_machdep.c
+++ sys/arm64/arm64/elf_machdep.c
@@ -55,6 +55,8 @@
#include "linker_if.h"
+u_long elf_hwcap;
+
static struct sysentvec elf64_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
@@ -89,6 +91,7 @@
.sv_schedtail = NULL,
.sv_thread_detach = NULL,
.sv_trap = NULL,
+ .sv_hwcap = &elf_hwcap,
};
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
Index: sys/arm64/arm64/identcpu.c
===================================================================
--- sys/arm64/arm64/identcpu.c
+++ sys/arm64/arm64/identcpu.c
@@ -43,6 +43,7 @@
#include <machine/atomic.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
+#include <machine/elf.h>
static int ident_lock;
@@ -162,6 +163,9 @@
CPU_IMPLEMENTER_NONE,
};
+/* HWCAP */
+extern u_long elf_hwcap;
+
static void
identify_cpu_sysinit(void *dummy __unused)
{
@@ -242,6 +246,7 @@
break;
case ID_AA64ISAR0_RDM_IMPL:
sbuf_printf(sb, "%sRDM", SEP_STR);
+ elf_hwcap |= HWCAP_ASIMDRDM;
break;
default:
sbuf_printf(sb, "%sUnknown RDM", SEP_STR);
@@ -252,6 +257,7 @@
break;
case ID_AA64ISAR0_ATOMIC_IMPL:
sbuf_printf(sb, "%sAtomic", SEP_STR);
+ elf_hwcap |= HWCAP_ATOMICS;
break;
default:
sbuf_printf(sb, "%sUnknown Atomic", SEP_STR);
@@ -262,9 +268,11 @@
break;
case ID_AA64ISAR0_AES_BASE:
sbuf_printf(sb, "%sAES", SEP_STR);
+ elf_hwcap |= HWCAP_AES;
break;
case ID_AA64ISAR0_AES_PMULL:
sbuf_printf(sb, "%sAES+PMULL", SEP_STR);
+ elf_hwcap |= HWCAP_PMULL | HWCAP_AES;
break;
default:
sbuf_printf(sb, "%sUnknown AES", SEP_STR);
@@ -276,6 +284,7 @@
break;
case ID_AA64ISAR0_SHA1_BASE:
sbuf_printf(sb, "%sSHA1", SEP_STR);
+ elf_hwcap |= HWCAP_SHA1;
break;
default:
sbuf_printf(sb, "%sUnknown SHA1", SEP_STR);
@@ -287,9 +296,11 @@
break;
case ID_AA64ISAR0_SHA2_BASE:
sbuf_printf(sb, "%sSHA2", SEP_STR);
+ elf_hwcap |= HWCAP_SHA2;
break;
case ID_AA64ISAR0_SHA2_512:
sbuf_printf(sb, "%sSHA2+SHA512", SEP_STR);
+ elf_hwcap |= HWCAP_SHA2 | HWCAP_SHA512;
break;
default:
sbuf_printf(sb, "%sUnknown SHA2", SEP_STR);
@@ -301,6 +312,7 @@
break;
case ID_AA64ISAR0_CRC32_BASE:
sbuf_printf(sb, "%sCRC32", SEP_STR);
+ elf_hwcap |= HWCAP_CRC32;
break;
default:
sbuf_printf(sb, "%sUnknown CRC32", SEP_STR);
@@ -323,6 +335,7 @@
break;
case ID_AA64ISAR0_SM3_IMPL:
sbuf_printf(sb, "%sSM3", SEP_STR);
+ elf_hwcap |= HWCAP_SM3;
break;
default:
sbuf_printf(sb, "%sUnknown SM3", SEP_STR);
@@ -334,6 +347,7 @@
break;
case ID_AA64ISAR0_SM4_IMPL:
sbuf_printf(sb, "%sSM4", SEP_STR);
+ elf_hwcap |= HWCAP_SM4;
break;
default:
sbuf_printf(sb, "%sUnknown SM4", SEP_STR);
@@ -345,6 +359,7 @@
break;
case ID_AA64ISAR0_DP_IMPL:
sbuf_printf(sb, "%sDotProd", SEP_STR);
+ elf_hwcap |= HWCAP_ASIMDDP;
break;
default:
sbuf_printf(sb, "%sUnknown DP", SEP_STR);
@@ -392,6 +407,7 @@
break;
case ID_AA64ISAR1_LRCPC_IMPL:
sbuf_printf(sb, "%sRCpc", SEP_STR);
+ elf_hwcap |= HWCAP_LRCPC;
break;
default:
sbuf_printf(sb, "%sUnknown RCpc", SEP_STR);
@@ -403,6 +419,7 @@
break;
case ID_AA64ISAR1_FCMA_IMPL:
sbuf_printf(sb, "%sFCMA", SEP_STR);
+ elf_hwcap |= HWCAP_FCMA;
break;
default:
sbuf_printf(sb, "%sUnknown FCMA", SEP_STR);
@@ -414,6 +431,7 @@
break;
case ID_AA64ISAR1_JSCVT_IMPL:
sbuf_printf(sb, "%sJS Conv", SEP_STR);
+ elf_hwcap |= HWCAP_JSCVT;
break;
default:
sbuf_printf(sb, "%sUnknown JS Conv", SEP_STR);
@@ -447,6 +465,7 @@
break;
case ID_AA64ISAR1_DPB_IMPL:
sbuf_printf(sb, "%sDC CVAP", SEP_STR);
+ elf_hwcap |= HWCAP_DCPOP;
break;
default:
sbuf_printf(sb, "%sUnknown DC CVAP", SEP_STR);
@@ -471,6 +490,7 @@
break;
case ID_AA64PFR0_SVE_IMPL:
sbuf_printf(sb, "%sSVE", SEP_STR);
+ elf_hwcap |= HWCAP_SVE;
break;
default:
sbuf_printf(sb, "%sUnknown SVE", SEP_STR);
@@ -504,9 +524,11 @@
break;
case ID_AA64PFR0_ADV_SIMD_IMPL:
sbuf_printf(sb, "%sAdvSIMD", SEP_STR);
+ elf_hwcap |= HWCAP_ASIMD;
break;
case ID_AA64PFR0_ADV_SIMD_HP:
sbuf_printf(sb, "%sAdvSIMD+HP", SEP_STR);
+ elf_hwcap |= HWCAP_ASIMD | HWCAP_ASIMDDP;
break;
default:
sbuf_printf(sb, "%sUnknown AdvSIMD", SEP_STR);
@@ -518,9 +540,11 @@
break;
case ID_AA64PFR0_FP_IMPL:
sbuf_printf(sb, "%sFloat", SEP_STR);
+ elf_hwcap |= HWCAP_FP;
break;
case ID_AA64PFR0_FP_HP:
sbuf_printf(sb, "%sFloat+HP", SEP_STR);
+ elf_hwcap |= HWCAP_FP | HWCAP_FPHP;
break;
default:
sbuf_printf(sb, "%sUnknown Float", SEP_STR);
Index: sys/arm64/include/elf.h
===================================================================
--- sys/arm64/include/elf.h
+++ sys/arm64/include/elf.h
@@ -114,4 +114,34 @@
#define ET_DYN_LOAD_ADDR 0x100000
+/* HWCAP */
+
+#define HWCAP_FP 0x00000001
+#define HWCAP_ASIMD 0x00000002
+#define HWCAP_EVTSTRM 0x00000004
+#define HWCAP_AES 0x00000008
+#define HWCAP_PMULL 0x00000010
+#define HWCAP_SHA1 0x00000020
+#define HWCAP_SHA2 0x00000040
+#define HWCAP_CRC32 0x00000080
+#define HWCAP_ATOMICS 0x00000100
+#define HWCAP_FPHP 0x00000200
+#define HWCAP_CPUID 0x00000400
+#define HWCAP_ASIMDRDM 0x00000800
+#define HWCAP_JSCVT 0x00001000
+#define HWCAP_FCMA 0x00002000
+#define HWCAP_LRCPC 0x00004000
+#define HWCAP_DCPOP 0x00008000
+#define HWCAP_SHA3 0x00010000
+#define HWCAP_SM3 0x00020000
+#define HWCAP_SM4 0x00040000
+#define HWCAP_ASIMDDP 0x00080000
+#define HWCAP_SHA512 0x00100000
+#define HWCAP_SVE 0x00200000
+#define HWCAP_ASIMDFHM 0x00400000
+#define HWCAP_DIT 0x00800000
+#define HWCAP_USCAT 0x01000000
+#define HWCAP_ILRCPC 0x02000000
+#define HWCAP_FLAGM 0x04000000
+
#endif /* !_MACHINE_ELF_H_ */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 19, 1:05 PM (15 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36871950
Default Alt Text
D17137.id47959.diff (5 KB)
Attached To
Mode
D17137: arm64: Add HWCAP support
Attached
Detach File
Event Timeline
Log In to Comment