12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // 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.
- //+build !amd64,!amd64p32,!386
- package cpu
- import (
- "encoding/binary"
- "io/ioutil"
- "runtime"
- )
- const (
- _AT_HWCAP = 16
- _AT_HWCAP2 = 26
- procAuxv = "/proc/self/auxv"
- uintSize uint = 32 << (^uint(0) >> 63)
- )
- // 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.
- var HWCap uint
- var HWCap2 uint
- func init() {
- buf, err := ioutil.ReadFile(procAuxv)
- if err != nil {
- panic("read proc auxv failed: " + err.Error())
- }
- pb := int(uintSize / 8)
- for i := 0; i < len(buf)-pb*2; i += pb * 2 {
- var tag, val uint
- switch uintSize {
- case 32:
- tag = uint(binary.LittleEndian.Uint32(buf[i:]))
- val = uint(binary.LittleEndian.Uint32(buf[i+pb:]))
- case 64:
- if runtime.GOARCH == "ppc64" {
- tag = uint(binary.BigEndian.Uint64(buf[i:]))
- val = uint(binary.BigEndian.Uint64(buf[i+pb:]))
- } else {
- tag = uint(binary.LittleEndian.Uint64(buf[i:]))
- val = uint(binary.LittleEndian.Uint64(buf[i+pb:]))
- }
- }
- switch tag {
- case _AT_HWCAP:
- HWCap = val
- case _AT_HWCAP2:
- HWCap2 = val
- }
- }
- doinit()
- }
|