]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move s390x HWCap CPU feature detection to internal/cpu
authorMartin Möhrmann <moehrmann@google.com>
Tue, 20 Oct 2020 12:21:07 +0000 (14:21 +0200)
committerMartin Möhrmann <moehrmann@google.com>
Thu, 22 Oct 2020 17:11:03 +0000 (17:11 +0000)
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>
src/internal/cpu/cpu_s390x.go
src/runtime/os_linux_s390x.go

index 526e0742253b642984b498db30092b7f9c33b203..45d8ed27f07564ccc96c96f57008de926105ddc4 100644 (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
+}
index ee18fd1dc20b90a3dcc9bd7790cae3232854049f..b9651f186c3fe8a336a31916925b66c2668108cc 100644 (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)
        }
 }