runtime: move s390x HWCap CPU feature detection to internal/cpu

Change-Id: I7d9e31c3b342731ddd7329962426fdfc80e9ed87
Reviewed-on: https://go-review.googlesource.com/c/go/+/263803
Trust: Martin Möhrmann <moehrmann@google.com>
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
This commit is contained in:
Martin Möhrmann 2020-10-20 14:21:07 +02:00
parent 91b7619310
commit f8aecbbff5
2 changed files with 15 additions and 9 deletions

View File

@ -6,6 +6,8 @@ package cpu
const CacheLinePadSize = 256
var HWCap uint
// bitIsSet reports whether the bit at index is set. The bit index
// is in big endian order, so bit index 0 is the leftmost bit.
func bitIsSet(bits []uint64, index uint) bool {
@ -95,8 +97,10 @@ const (
// vector facilities
vxe facility = 135 // vector-enhancements 1
// Note: vx and highgprs are excluded because they require
// kernel support and so must be fetched from HWCAP.
// Note: vx requires kernel support
// and so must be fetched from HWCAP.
hwcap_VX = 1 << 11 // vector facility
)
// facilityList contains the result of an STFLE call.
@ -188,7 +192,14 @@ func doinit() {
S390X.HasEDDSA = kdsa.Has(eddsaVerifyEd25519, eddsaSignEd25519, eddsaVerifyEd448, eddsaSignEd448)
}
}
S390X.HasVX = isSet(HWCap, hwcap_VX)
if S390X.HasVX {
S390X.HasVXE = facilities.Has(vxe)
}
}
func isSet(hwc uint, value uint) bool {
return hwc&value != 0
}

View File

@ -6,15 +6,10 @@ package runtime
import "internal/cpu"
const (
// bit masks taken from bits/hwcap.h
_HWCAP_S390_VX = 2048 // vector facility
)
func archauxv(tag, val uintptr) {
switch tag {
case _AT_HWCAP: // CPU capability bit flags
cpu.S390X.HasVX = val&_HWCAP_S390_VX != 0
case _AT_HWCAP:
cpu.HWCap = uint(val)
}
}