golang.org/x/sys@v0.20.1-0.20240517151509-673e0f94c16d/cpu/cpu_s390x_test.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_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  // bitIsSet reports whether the bit at index is set. The bit index
    32  // is in big endian order, so bit index 0 is the leftmost bit.
    33  func bitIsSet(bits [4]uint64, i uint) bool {
    34  	return bits[i/64]&((1<<63)>>(i%64)) != 0
    35  }
    36  
    37  // facilityList contains the contents of location 200 on zos.
    38  // Bits are numbered in big endian order so the
    39  // leftmost bit (the MSB) is at index 0.
    40  type facilityList struct {
    41  	bits [4]uint64
    42  }
    43  
    44  func TestS390XVectorFacilityFeatures(t *testing.T) {
    45  	// vector-enhancements require vector facility to be enabled
    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  	// Read available facilities from address 200.
    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  }