golang.org/x/sys@v0.20.1-0.20240517151509-673e0f94c16d/cpu/cpu_s390x.go (about)

     1  // Copyright 2020 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  package cpu
     6  
     7  const cacheLineSize = 256
     8  
     9  func initOptions() {
    10  	options = []option{
    11  		{Name: "zarch", Feature: &S390X.HasZARCH, Required: true},
    12  		{Name: "stfle", Feature: &S390X.HasSTFLE, Required: true},
    13  		{Name: "ldisp", Feature: &S390X.HasLDISP, Required: true},
    14  		{Name: "eimm", Feature: &S390X.HasEIMM, Required: true},
    15  		{Name: "dfp", Feature: &S390X.HasDFP},
    16  		{Name: "etf3eh", Feature: &S390X.HasETF3EH},
    17  		{Name: "msa", Feature: &S390X.HasMSA},
    18  		{Name: "aes", Feature: &S390X.HasAES},
    19  		{Name: "aescbc", Feature: &S390X.HasAESCBC},
    20  		{Name: "aesctr", Feature: &S390X.HasAESCTR},
    21  		{Name: "aesgcm", Feature: &S390X.HasAESGCM},
    22  		{Name: "ghash", Feature: &S390X.HasGHASH},
    23  		{Name: "sha1", Feature: &S390X.HasSHA1},
    24  		{Name: "sha256", Feature: &S390X.HasSHA256},
    25  		{Name: "sha3", Feature: &S390X.HasSHA3},
    26  		{Name: "sha512", Feature: &S390X.HasSHA512},
    27  		{Name: "vx", Feature: &S390X.HasVX},
    28  		{Name: "vxe", Feature: &S390X.HasVXE},
    29  	}
    30  }
    31  
    32  // bitIsSet reports whether the bit at index is set. The bit index
    33  // is in big endian order, so bit index 0 is the leftmost bit.
    34  func bitIsSet(bits []uint64, index uint) bool {
    35  	return bits[index/64]&((1<<63)>>(index%64)) != 0
    36  }
    37  
    38  // facility is a bit index for the named facility.
    39  type facility uint8
    40  
    41  const (
    42  	// mandatory facilities
    43  	zarch  facility = 1  // z architecture mode is active
    44  	stflef facility = 7  // store-facility-list-extended
    45  	ldisp  facility = 18 // long-displacement
    46  	eimm   facility = 21 // extended-immediate
    47  
    48  	// miscellaneous facilities
    49  	dfp    facility = 42 // decimal-floating-point
    50  	etf3eh facility = 30 // extended-translation 3 enhancement
    51  
    52  	// cryptography facilities
    53  	msa  facility = 17  // message-security-assist
    54  	msa3 facility = 76  // message-security-assist extension 3
    55  	msa4 facility = 77  // message-security-assist extension 4
    56  	msa5 facility = 57  // message-security-assist extension 5
    57  	msa8 facility = 146 // message-security-assist extension 8
    58  	msa9 facility = 155 // message-security-assist extension 9
    59  
    60  	// vector facilities
    61  	vx   facility = 129 // vector facility
    62  	vxe  facility = 135 // vector-enhancements 1
    63  	vxe2 facility = 148 // vector-enhancements 2
    64  )
    65  
    66  // facilityList contains the result of an STFLE call.
    67  // Bits are numbered in big endian order so the
    68  // leftmost bit (the MSB) is at index 0.
    69  type facilityList struct {
    70  	bits [4]uint64
    71  }
    72  
    73  // Has reports whether the given facilities are present.
    74  func (s *facilityList) Has(fs ...facility) bool {
    75  	if len(fs) == 0 {
    76  		panic("no facility bits provided")
    77  	}
    78  	for _, f := range fs {
    79  		if !bitIsSet(s.bits[:], uint(f)) {
    80  			return false
    81  		}
    82  	}
    83  	return true
    84  }
    85  
    86  // function is the code for the named cryptographic function.
    87  type function uint8
    88  
    89  const (
    90  	// KM{,A,C,CTR} function codes
    91  	aes128 function = 18 // AES-128
    92  	aes192 function = 19 // AES-192
    93  	aes256 function = 20 // AES-256
    94  
    95  	// K{I,L}MD function codes
    96  	sha1     function = 1  // SHA-1
    97  	sha256   function = 2  // SHA-256
    98  	sha512   function = 3  // SHA-512
    99  	sha3_224 function = 32 // SHA3-224
   100  	sha3_256 function = 33 // SHA3-256
   101  	sha3_384 function = 34 // SHA3-384
   102  	sha3_512 function = 35 // SHA3-512
   103  	shake128 function = 36 // SHAKE-128
   104  	shake256 function = 37 // SHAKE-256
   105  
   106  	// KLMD function codes
   107  	ghash function = 65 // GHASH
   108  )
   109  
   110  // queryResult contains the result of a Query function
   111  // call. Bits are numbered in big endian order so the
   112  // leftmost bit (the MSB) is at index 0.
   113  type queryResult struct {
   114  	bits [2]uint64
   115  }
   116  
   117  // Has reports whether the given functions are present.
   118  func (q *queryResult) Has(fns ...function) bool {
   119  	if len(fns) == 0 {
   120  		panic("no function codes provided")
   121  	}
   122  	for _, f := range fns {
   123  		if !bitIsSet(q.bits[:], uint(f)) {
   124  			return false
   125  		}
   126  	}
   127  	return true
   128  }
   129  
   130  func doinit() {
   131  	initS390Xbase()
   132  
   133  	// We need implementations of stfle, km and so on
   134  	// to detect cryptographic features.
   135  	if !haveAsmFunctions() {
   136  		return
   137  	}
   138  
   139  	// optional cryptographic functions
   140  	if S390X.HasMSA {
   141  		aes := []function{aes128, aes192, aes256}
   142  
   143  		// cipher message
   144  		km, kmc := kmQuery(), kmcQuery()
   145  		S390X.HasAES = km.Has(aes...)
   146  		S390X.HasAESCBC = kmc.Has(aes...)
   147  		if S390X.HasSTFLE {
   148  			facilities := stfle()
   149  			if facilities.Has(msa4) {
   150  				kmctr := kmctrQuery()
   151  				S390X.HasAESCTR = kmctr.Has(aes...)
   152  			}
   153  			if facilities.Has(msa8) {
   154  				kma := kmaQuery()
   155  				S390X.HasAESGCM = kma.Has(aes...)
   156  			}
   157  		}
   158  
   159  		// compute message digest
   160  		kimd := kimdQuery() // intermediate (no padding)
   161  		klmd := klmdQuery() // last (padding)
   162  		S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1)
   163  		S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256)
   164  		S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512)
   165  		S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist
   166  		sha3 := []function{
   167  			sha3_224, sha3_256, sha3_384, sha3_512,
   168  			shake128, shake256,
   169  		}
   170  		S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...)
   171  	}
   172  }