...
1
2
3
4
5 package cpu_test
6
7 import (
8 "runtime"
9 "testing"
10 "unsafe"
11
12 "golang.org/x/sys/cpu"
13 )
14
15 var s390xTests = []struct {
16 name string
17 feature bool
18 facility uint
19 mandatory bool
20 }{
21 {"ZARCH", cpu.S390X.HasZARCH, 1, true},
22 {"STFLE", cpu.S390X.HasSTFLE, 7, true},
23 {"LDISP", cpu.S390X.HasLDISP, 18, true},
24 {"EIMM", cpu.S390X.HasEIMM, 21, true},
25 {"DFP", cpu.S390X.HasDFP, 42, false},
26 {"MSA", cpu.S390X.HasMSA, 17, false},
27 {"VX", cpu.S390X.HasVX, 129, false},
28 {"VXE", cpu.S390X.HasVXE, 135, false},
29 }
30
31
32
33 func bitIsSet(bits [4]uint64, i uint) bool {
34 return bits[i/64]&((1<<63)>>(i%64)) != 0
35 }
36
37
38
39
40 type facilityList struct {
41 bits [4]uint64
42 }
43
44 func TestS390XVectorFacilityFeatures(t *testing.T) {
45
46 if cpu.S390X.HasVXE && !cpu.S390X.HasVX {
47 t.Error("HasVX expected true, got false (VXE is true)")
48 }
49 }
50
51 func TestS390XMandatoryFeatures(t *testing.T) {
52 for _, tc := range s390xTests {
53 if tc.mandatory && !tc.feature {
54 t.Errorf("Feature %s is mandatory but is not present", tc.name)
55 }
56 }
57 }
58
59 func TestS390XFeatures(t *testing.T) {
60 if runtime.GOOS != "zos" {
61 return
62 }
63
64 facilitiesAddress := uintptr(200)
65 var facilities facilityList
66 for i := 0; i < 4; i++ {
67 facilities.bits[i] = *(*uint64)(unsafe.Pointer(facilitiesAddress + uintptr(8*i)))
68 }
69
70 for _, tc := range s390xTests {
71 if want := bitIsSet(facilities.bits, tc.facility); want != tc.feature {
72 t.Errorf("Feature %s expected %v, got %v", tc.name, want, tc.feature)
73 }
74 }
75 }
76
View as plain text