diff --git a/source/cpu/cpuid_arm.go b/source/cpu/cpuid_arm.go index 6a142e913..a193d9367 100644 --- a/source/cpu/cpuid_arm.go +++ b/source/cpu/cpuid_arm.go @@ -26,7 +26,10 @@ unsigned long gethwcap() { */ import "C" -/* all special features for arm should be defined here */ +/* +all special features for arm should be defined here; canonical list: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/uapi/asm/hwcap.h +*/ const ( /* extension instructions */ CPU_ARM_FEATURE_SWP = 1 << iota diff --git a/source/cpu/cpuid_arm64.go b/source/cpu/cpuid_arm64.go index e4175ae49..ce4472ae2 100644 --- a/source/cpu/cpuid_arm64.go +++ b/source/cpu/cpuid_arm64.go @@ -23,10 +23,16 @@ package cpu unsigned long gethwcap() { return getauxval(AT_HWCAP); } +unsigned long gethwcap2() { + return getauxval(AT_HWCAP2); +} */ import "C" -/* all special features for arm64 should be defined here */ +/* +all special features for arm64 should be defined here; canonical list: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/include/uapi/asm/hwcap.h +*/ const ( /* extension instructions */ CPU_ARM64_FEATURE_FP = 1 << iota @@ -52,6 +58,53 @@ const ( CPU_ARM64_FEATURE_ASIMDDP CPU_ARM64_FEATURE_SHA512 CPU_ARM64_FEATURE_SVE + CPU_ARM64_FEATURE_ASIMDFHM + CPU_ARM64_FEATURE_DIT + CPU_ARM64_FEATURE_USCAT + CPU_ARM64_FEATURE_ILRCPC + CPU_ARM64_FEATURE_FLAGM + CPU_ARM64_FEATURE_SSBS + CPU_ARM64_FEATURE_SB + CPU_ARM64_FEATURE_PACA + CPU_ARM64_FEATURE_PACG +) + +const ( + /* extension instructions */ + CPU_ARM64_FEATURE2_DCPODP = 1 << iota + CPU_ARM64_FEATURE2_SVE2 + CPU_ARM64_FEATURE2_SVEAES + CPU_ARM64_FEATURE2_SVEPMULL + CPU_ARM64_FEATURE2_SVEBITPERM + CPU_ARM64_FEATURE2_SVESHA3 + CPU_ARM64_FEATURE2_SVESM4 + CPU_ARM64_FEATURE2_FLAGM2 + CPU_ARM64_FEATURE2_FRINT + CPU_ARM64_FEATURE2_SVEI8MM + CPU_ARM64_FEATURE2_SVEF32MM + CPU_ARM64_FEATURE2_SVEF64MM + CPU_ARM64_FEATURE2_SVEBF16 + CPU_ARM64_FEATURE2_I8MM + CPU_ARM64_FEATURE2_BF16 + CPU_ARM64_FEATURE2_DGH + CPU_ARM64_FEATURE2_RNG + CPU_ARM64_FEATURE2_BTI + CPU_ARM64_FEATURE2_MTE + CPU_ARM64_FEATURE2_ECV + CPU_ARM64_FEATURE2_AFP + CPU_ARM64_FEATURE2_RPRES + CPU_ARM64_FEATURE2_MTE3 + CPU_ARM64_FEATURE2_SME + CPU_ARM64_FEATURE2_SME_I16I64 + CPU_ARM64_FEATURE2_SME_F64F64 + CPU_ARM64_FEATURE2_SME_I8I32 + CPU_ARM64_FEATURE2_SME_F16F32 + CPU_ARM64_FEATURE2_SME_B16F32 + CPU_ARM64_FEATURE2_SME_F32F32 + CPU_ARM64_FEATURE2_SME_FA64 + CPU_ARM64_FEATURE2_WFXT + CPU_ARM64_FEATURE2_EBF16 + CPU_ARM64_FEATURE2_SVE_EBF16 ) var flagNames_arm64 = map[uint64]string{ @@ -78,11 +131,58 @@ var flagNames_arm64 = map[uint64]string{ CPU_ARM64_FEATURE_ASIMDDP: "ASIMDDP", CPU_ARM64_FEATURE_SHA512: "SHA512", CPU_ARM64_FEATURE_SVE: "SVE", + CPU_ARM64_FEATURE_ASIMDFHM: "ASIMDFHM", + CPU_ARM64_FEATURE_DIT: "DIT", + CPU_ARM64_FEATURE_USCAT: "USCAT", + CPU_ARM64_FEATURE_ILRCPC: "ILRCPC", + CPU_ARM64_FEATURE_FLAGM: "FLAGM", + CPU_ARM64_FEATURE_SSBS: "SSBS", + CPU_ARM64_FEATURE_SB: "SB", + CPU_ARM64_FEATURE_PACA: "PACA", + CPU_ARM64_FEATURE_PACG: "PACG", +} + +var flag2Names_arm64 = map[uint64]string{ + CPU_ARM64_FEATURE2_DCPODP: "DCPODP", + CPU_ARM64_FEATURE2_SVE2: "SVE2", + CPU_ARM64_FEATURE2_SVEAES: "SVEAES", + CPU_ARM64_FEATURE2_SVEPMULL: "SVEPMULL", + CPU_ARM64_FEATURE2_SVEBITPERM: "SVEBITPERM", + CPU_ARM64_FEATURE2_SVESHA3: "SVESHA3", + CPU_ARM64_FEATURE2_SVESM4: "SVESM4", + CPU_ARM64_FEATURE2_FLAGM2: "FLAGM2", + CPU_ARM64_FEATURE2_FRINT: "FRINT", + CPU_ARM64_FEATURE2_SVEI8MM: "SVEI8MM", + CPU_ARM64_FEATURE2_SVEF32MM: "SVEF32MM", + CPU_ARM64_FEATURE2_SVEF64MM: "SVEF64MM", + CPU_ARM64_FEATURE2_SVEBF16: "SVEBF16", + CPU_ARM64_FEATURE2_I8MM: "I8MM", + CPU_ARM64_FEATURE2_BF16: "BF16", + CPU_ARM64_FEATURE2_DGH: "DGH", + CPU_ARM64_FEATURE2_RNG: "RNG", + CPU_ARM64_FEATURE2_BTI: "BTI", + CPU_ARM64_FEATURE2_MTE: "MTE", + CPU_ARM64_FEATURE2_ECV: "ECV", + CPU_ARM64_FEATURE2_AFP: "AFP", + CPU_ARM64_FEATURE2_RPRES: "RPRES", + CPU_ARM64_FEATURE2_MTE3: "MTE3", + CPU_ARM64_FEATURE2_SME: "SME", + CPU_ARM64_FEATURE2_SME_I16I64: "SMEI16I64", + CPU_ARM64_FEATURE2_SME_F64F64: "SMEF64F64", + CPU_ARM64_FEATURE2_SME_I8I32: "SMEI8I32", + CPU_ARM64_FEATURE2_SME_F16F32: "SMEF16F32", + CPU_ARM64_FEATURE2_SME_B16F32: "SMEB16F32", + CPU_ARM64_FEATURE2_SME_F32F32: "SMEF32F32", + CPU_ARM64_FEATURE2_SME_FA64: "SMEFA64", + CPU_ARM64_FEATURE2_WFXT: "WFXT", + CPU_ARM64_FEATURE2_EBF16: "EBF16", + CPU_ARM64_FEATURE2_SVE_EBF16: "SVEEBF16", } func getCpuidFlags() []string { r := make([]string, 0, 20) hwcap := uint64(C.gethwcap()) + hwcap2 := uint64(C.gethwcap2()) for i := uint(0); i < 64; i++ { key := uint64(1 << i) val := flagNames_arm64[key] @@ -90,5 +190,12 @@ func getCpuidFlags() []string { r = append(r, val) } } + for i := uint(0); i < 64; i++ { + key := uint64(1 << i) + val := flag2Names_arm64[key] + if hwcap2&key != 0 { + r = append(r, val) + } + } return r } diff --git a/source/cpu/cpuid_ppc64le.go b/source/cpu/cpuid_ppc64le.go index 307739717..89e49ea17 100644 --- a/source/cpu/cpuid_ppc64le.go +++ b/source/cpu/cpuid_ppc64le.go @@ -28,7 +28,10 @@ unsigned long gethwcap2() { */ import "C" -/* all special features for ppc64le should be defined here */ +/* +all special features for ppc64le should be defined here; canonical list: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/powerpc/include/uapi/asm/cputable.h +*/ const ( /* AT_HWCAP features */ PPC_FEATURE_32 = 0x80000000 /* 32-bit mode. */ @@ -77,6 +80,8 @@ const ( PPC_FEATURE2_DARN = 0x00200000 /* darn instruction. */ PPC_FEATURE2_SCV = 0x00100000 /* scv syscall. */ PPC_FEATURE2_HTM_NO_SUSPEND = 0x00080000 /* TM without suspended state. */ + PPC_FEATURE2_ARCH_3_1 = 0x00040000 /* ISA 3.1 */ + PPC_FEATURE2_MMA = 0x00020000 /* Matrix Multiply Assist */ ) var flagNames_ppc64le = map[uint64]string{ @@ -124,6 +129,8 @@ var flag2Names_ppc64le = map[uint64]string{ PPC_FEATURE2_DARN: "DARN", PPC_FEATURE2_SCV: "SCV", PPC_FEATURE2_HTM_NO_SUSPEND: "HTM-NO-SUSPEND", + PPC_FEATURE2_ARCH_3_1: "ARCH_3_1", + PPC_FEATURE2_MMA: "MMA", } func getCpuidFlags() []string { diff --git a/source/cpu/cpuid_s390x.go b/source/cpu/cpuid_s390x.go index 339761834..34565fcbb 100644 --- a/source/cpu/cpuid_s390x.go +++ b/source/cpu/cpuid_s390x.go @@ -25,7 +25,11 @@ unsigned long gethwcap() { */ import "C" -/* all special features for s390x should be defined here */ +/* +all special features for s390x should be defined here; canonical list: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/s390/include/asm/elf.h +http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/hwcap.h;hb=HEAD +*/ const ( /* AT_HWCAP features */ HWCAP_S390_ESAN3 = 1 @@ -47,10 +51,10 @@ const ( HWCAP_S390_VXRS_PDE = 65536 HWCAP_S390_SORT = 131072 HWCAP_S390_DFLT = 262144 - HWCAP_NR_VXRS_PDE2 = 524288 - HWCAP_NR_NNPA = 1048576 - HWCAP_NR_PCI_MIO = 2097152 - HWCAP_NR_SIE = 4194304 + HWCAP_S390_VXRS_PDE2 = 524288 + HWCAP_S390_NNPA = 1048576 + HWCAP_S390_PCI_MIO = 2097152 + HWCAP_S390_SIE = 4194304 ) var flagNames_s390x = map[uint64]string{ @@ -73,10 +77,10 @@ var flagNames_s390x = map[uint64]string{ HWCAP_S390_VXRS_PDE: "VXP", HWCAP_S390_SORT: "SORT", HWCAP_S390_DFLT: "DFLT", - HWCAP_NR_VXRS_PDE2: "VXP2", - HWCAP_NR_NNPA: "NNPA", - HWCAP_NR_PCI_MIO: "PCIMIO", - HWCAP_NR_SIE: "SIE", + HWCAP_S390_VXRS_PDE2: "VXP2", + HWCAP_S390_NNPA: "NNPA", + HWCAP_S390_PCI_MIO: "PCIMIO", + HWCAP_S390_SIE: "SIE", } func getCpuidFlags() []string {