k3s/vendor/golang.org/x/sys/cpu/cpu_linux.go

60 lines
1.1 KiB
Go
Raw Normal View History

2019-09-05 18:55:53 +00:00
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
2019-09-30 23:25:17 +00:00
// +build !amd64,!amd64p32,!386
2019-09-05 18:55:53 +00:00
package cpu
import (
"io/ioutil"
)
const (
_AT_HWCAP = 16
_AT_HWCAP2 = 26
procAuxv = "/proc/self/auxv"
2019-09-25 02:29:12 +00:00
uintSize = int(32 << (^uint(0) >> 63))
2019-09-05 18:55:53 +00:00
)
// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2
// These are initialized in cpu_$GOARCH.go
// and should not be changed after they are initialized.
2019-09-25 02:29:12 +00:00
var hwCap uint
var hwCap2 uint
2019-09-05 18:55:53 +00:00
func init() {
buf, err := ioutil.ReadFile(procAuxv)
if err != nil {
2019-09-25 02:29:12 +00:00
// e.g. on android /proc/self/auxv is not accessible, so silently
// ignore the error and leave Initialized = false
return
2019-09-05 18:55:53 +00:00
}
2019-09-25 02:29:12 +00:00
bo := hostByteOrder()
for len(buf) >= 2*(uintSize/8) {
2019-09-05 18:55:53 +00:00
var tag, val uint
switch uintSize {
case 32:
2019-09-25 02:29:12 +00:00
tag = uint(bo.Uint32(buf[0:]))
val = uint(bo.Uint32(buf[4:]))
buf = buf[8:]
2019-09-05 18:55:53 +00:00
case 64:
2019-09-25 02:29:12 +00:00
tag = uint(bo.Uint64(buf[0:]))
val = uint(bo.Uint64(buf[8:]))
buf = buf[16:]
2019-09-05 18:55:53 +00:00
}
switch tag {
case _AT_HWCAP:
2019-09-25 02:29:12 +00:00
hwCap = val
2019-09-05 18:55:53 +00:00
case _AT_HWCAP2:
2019-09-25 02:29:12 +00:00
hwCap2 = val
2019-09-05 18:55:53 +00:00
}
}
doinit()
2019-09-25 02:29:12 +00:00
Initialized = true
2019-09-05 18:55:53 +00:00
}