mirror of
https://github.com/kubernetes-sigs/node-feature-discovery.git
synced 2024-12-15 17:50:49 +00:00
52fcf0b0e9
Non-x86_64 platforms are virtually only buildable on Linux because the getauxval() glibc function is missing on many platforms.
121 lines
3 KiB
Go
121 lines
3 KiB
Go
/*
|
|
Copyright 2020 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package cpu
|
|
|
|
/*
|
|
#include <sys/auxv.h>
|
|
|
|
unsigned long gethwcap() {
|
|
return getauxval(AT_HWCAP);
|
|
}
|
|
unsigned long gethwcap2() {
|
|
return getauxval(AT_HWCAP2);
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
/*
|
|
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
|
|
CPU_ARM_FEATURE_HALF
|
|
CPU_ARM_FEATURE_THUMB
|
|
CPU_ARM_FEATURE_26BIT
|
|
CPU_ARM_FEATURE_FASTMUL
|
|
CPU_ARM_FEATURE_FPA
|
|
CPU_ARM_FEATURE_VFP
|
|
CPU_ARM_FEATURE_EDSP
|
|
CPU_ARM_FEATURE_JAVA
|
|
CPU_ARM_FEATURE_IWMMXT
|
|
CPU_ARM_FEATURE_CRUNCH
|
|
CPU_ARM_FEATURE_THUMBEE
|
|
CPU_ARM_FEATURE_NEON
|
|
CPU_ARM_FEATURE_VFPv3
|
|
CPU_ARM_FEATURE_VFPv3D16
|
|
CPU_ARM_FEATURE_TLS
|
|
CPU_ARM_FEATURE_VFPv4
|
|
CPU_ARM_FEATURE_IDIVA
|
|
CPU_ARM_FEATURE_IDIVT
|
|
CPU_ARM_FEATURE_VFPD32
|
|
CPU_ARM_FEATURE_LPAE
|
|
CPU_ARM_FEATURE_EVTSTRM
|
|
)
|
|
|
|
const (
|
|
CPU_ARM_FEATURE2_AES = 1 << iota
|
|
CPU_ARM_FEATURE2_PMULL
|
|
CPU_ARM_FEATURE2_SHA1
|
|
CPU_ARM_FEATURE2_SHA2
|
|
CPU_ARM_FEATURE2_CRC32
|
|
)
|
|
|
|
var flagNames_arm = map[uint64]string{
|
|
CPU_ARM_FEATURE_SWP: "SWP",
|
|
CPU_ARM_FEATURE_HALF: "HALF",
|
|
CPU_ARM_FEATURE_THUMB: "THUMB",
|
|
CPU_ARM_FEATURE_26BIT: "26BIT",
|
|
CPU_ARM_FEATURE_FASTMUL: "FASTMUL",
|
|
CPU_ARM_FEATURE_FPA: "FPA",
|
|
CPU_ARM_FEATURE_VFP: "VFP",
|
|
CPU_ARM_FEATURE_EDSP: "EDSP",
|
|
CPU_ARM_FEATURE_JAVA: "JAVA",
|
|
CPU_ARM_FEATURE_IWMMXT: "IWMMXT",
|
|
CPU_ARM_FEATURE_CRUNCH: "CRUNCH",
|
|
CPU_ARM_FEATURE_THUMBEE: "THUMBEE",
|
|
CPU_ARM_FEATURE_NEON: "NEON",
|
|
CPU_ARM_FEATURE_VFPv3: "VFPv3",
|
|
CPU_ARM_FEATURE_VFPv3D16: "VFPv3D16",
|
|
CPU_ARM_FEATURE_TLS: "TLS",
|
|
CPU_ARM_FEATURE_VFPv4: "VFPv4",
|
|
CPU_ARM_FEATURE_IDIVA: "IDIVA",
|
|
CPU_ARM_FEATURE_IDIVT: "IDIVT",
|
|
CPU_ARM_FEATURE_VFPD32: "VFPD32",
|
|
CPU_ARM_FEATURE_LPAE: "LPAE",
|
|
CPU_ARM_FEATURE_EVTSTRM: "EVTSTRM",
|
|
}
|
|
|
|
var flag2Names_arm = map[uint64]string{
|
|
CPU_ARM_FEATURE2_AES: "AES",
|
|
CPU_ARM_FEATURE2_PMULL: "PMULL",
|
|
CPU_ARM_FEATURE2_SHA1: "SHA1",
|
|
CPU_ARM_FEATURE2_SHA2: "SHA2",
|
|
CPU_ARM_FEATURE2_CRC32: "CRC32",
|
|
}
|
|
|
|
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, ok := flagNames_arm[key]
|
|
if hwcap&key != 0 && ok {
|
|
r = append(r, val)
|
|
}
|
|
}
|
|
for i := uint(0); i < 64; i++ {
|
|
key := uint64(1 << i)
|
|
val, ok := flag2Names_arm[key]
|
|
if hwcap2&key != 0 && ok {
|
|
r = append(r, val)
|
|
}
|
|
}
|
|
return r
|
|
}
|