...
Source file src/pkg/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go
1
2
3
4
5 package cpu
6
7 const cacheLineSize = 256
8
9 const (
10
11 hwcap_ZARCH = 2
12 hwcap_STFLE = 4
13 hwcap_MSA = 8
14 hwcap_LDISP = 16
15 hwcap_EIMM = 32
16 hwcap_DFP = 64
17 hwcap_ETF3EH = 256
18 hwcap_VX = 2048
19 hwcap_VXE = 8192
20 )
21
22
23
24 func bitIsSet(bits []uint64, index uint) bool {
25 return bits[index/64]&((1<<63)>>(index%64)) != 0
26 }
27
28
29 type function uint8
30
31 const (
32
33 aes128 function = 18
34 aes192 function = 19
35 aes256 function = 20
36
37
38 sha1 function = 1
39 sha256 function = 2
40 sha512 function = 3
41 sha3_224 function = 32
42 sha3_256 function = 33
43 sha3_384 function = 34
44 sha3_512 function = 35
45 shake128 function = 36
46 shake256 function = 37
47
48
49 ghash function = 65
50 )
51
52
53
54
55 type queryResult struct {
56 bits [2]uint64
57 }
58
59
60 func (q *queryResult) Has(fns ...function) bool {
61 if len(fns) == 0 {
62 panic("no function codes provided")
63 }
64 for _, f := range fns {
65 if !bitIsSet(q.bits[:], uint(f)) {
66 return false
67 }
68 }
69 return true
70 }
71
72
73 type facility uint8
74
75 const (
76
77 msa4 facility = 77
78 msa8 facility = 146
79 )
80
81
82
83
84 type facilityList struct {
85 bits [4]uint64
86 }
87
88
89 func (s *facilityList) Has(fs ...facility) bool {
90 if len(fs) == 0 {
91 panic("no facility bits provided")
92 }
93 for _, f := range fs {
94 if !bitIsSet(s.bits[:], uint(f)) {
95 return false
96 }
97 }
98 return true
99 }
100
101 func doinit() {
102
103 has := func(featureMask uint) bool {
104 return hwCap&featureMask == featureMask
105 }
106
107
108 S390X.HasZARCH = has(hwcap_ZARCH)
109
110
111 S390X.HasSTFLE = has(hwcap_STFLE)
112 S390X.HasLDISP = has(hwcap_LDISP)
113 S390X.HasEIMM = has(hwcap_EIMM)
114 S390X.HasETF3EH = has(hwcap_ETF3EH)
115 S390X.HasDFP = has(hwcap_DFP)
116 S390X.HasMSA = has(hwcap_MSA)
117 S390X.HasVX = has(hwcap_VX)
118 if S390X.HasVX {
119 S390X.HasVXE = has(hwcap_VXE)
120 }
121
122
123
124 if !haveAsmFunctions() {
125 return
126 }
127
128
129 if S390X.HasMSA {
130 aes := []function{aes128, aes192, aes256}
131
132
133 km, kmc := kmQuery(), kmcQuery()
134 S390X.HasAES = km.Has(aes...)
135 S390X.HasAESCBC = kmc.Has(aes...)
136 if S390X.HasSTFLE {
137 facilities := stfle()
138 if facilities.Has(msa4) {
139 kmctr := kmctrQuery()
140 S390X.HasAESCTR = kmctr.Has(aes...)
141 }
142 if facilities.Has(msa8) {
143 kma := kmaQuery()
144 S390X.HasAESGCM = kma.Has(aes...)
145 }
146 }
147
148
149 kimd := kimdQuery()
150 klmd := klmdQuery()
151 S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1)
152 S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256)
153 S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512)
154 S390X.HasGHASH = kimd.Has(ghash)
155 sha3 := []function{
156 sha3_224, sha3_256, sha3_384, sha3_512,
157 shake128, shake256,
158 }
159 S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...)
160 }
161 }
162
View as plain text