...

Source file src/pkg/vendor/golang.org/x/sys/cpu/cpu_linux.go

     1	// Copyright 2018 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	//+build !amd64,!amd64p32,!386
     6	
     7	package cpu
     8	
     9	import (
    10		"io/ioutil"
    11	)
    12	
    13	const (
    14		_AT_HWCAP  = 16
    15		_AT_HWCAP2 = 26
    16	
    17		procAuxv = "/proc/self/auxv"
    18	
    19		uintSize = int(32 << (^uint(0) >> 63))
    20	)
    21	
    22	// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2
    23	// These are initialized in cpu_$GOARCH.go
    24	// and should not be changed after they are initialized.
    25	var hwCap uint
    26	var hwCap2 uint
    27	
    28	func init() {
    29		buf, err := ioutil.ReadFile(procAuxv)
    30		if err != nil {
    31			// e.g. on android /proc/self/auxv is not accessible, so silently
    32			// ignore the error and leave Initialized = false
    33			return
    34		}
    35	
    36		bo := hostByteOrder()
    37		for len(buf) >= 2*(uintSize/8) {
    38			var tag, val uint
    39			switch uintSize {
    40			case 32:
    41				tag = uint(bo.Uint32(buf[0:]))
    42				val = uint(bo.Uint32(buf[4:]))
    43				buf = buf[8:]
    44			case 64:
    45				tag = uint(bo.Uint64(buf[0:]))
    46				val = uint(bo.Uint64(buf[8:]))
    47				buf = buf[16:]
    48			}
    49			switch tag {
    50			case _AT_HWCAP:
    51				hwCap = val
    52			case _AT_HWCAP2:
    53				hwCap2 = val
    54			}
    55		}
    56		doinit()
    57	
    58		Initialized = true
    59	}
    60	

View as plain text