s390x: Fix vector facility (vx) check in test suite

When checking the prereqisuites of running a vector test case, it is not
sufficient to check for the appropriate CPU facility bit.  It must also be
verified that the kernel and hypervisor(s) have actually enabled the
vector facility.  There are various ways of checking this.  E.g., we could
try executing a vector instruction and handle any signals.  Or we can
check the HWCAP for the appropriate bit.  This patch does the latter.
This commit is contained in:
Andreas Arnez
2019-08-06 18:29:46 +02:00
parent 36e793843e
commit 161d22f0af

View File

@@ -10,6 +10,7 @@
#include <fcntl.h> // open
#include <unistd.h> // lseek
#include <sys/stat.h> // S_IRUSR
#include <features.h> // __GLIBC_PREREQ
// This file determines s390x features a processor supports.
//
@@ -39,6 +40,17 @@ jmp_buf env;
#if defined(VGA_s390x)
// Features that require kernel support should be checked against HWCAP instead
// of the CPU facility list. To read the HWCAP, use 'getauxval' if available --
// which should be the case with glibc versions >= 2.16. A system with an older
// glibc is unlikely to support any of these features anyhow.
#if __GLIBC_PREREQ(2, 16)
#include <sys/auxv.h>
#define GET_HWCAP() getauxval(AT_HWCAP)
#else
#define GET_HWCAP() 0UL
#endif
/* Number of double words needed to store all facility bits. */
#define S390_NUM_FACILITY_DW 3
@@ -246,7 +258,8 @@ static int go(char *feature, char *cpu)
} else if (strcmp(feature, "s390x-highw") == 0 ) {
match = facilities[0] & FAC_BIT(45);
} else if (strcmp(feature, "s390x-vx") == 0 ) {
match = facilities[2] & FAC_BIT(0);
/* VX needs kernel support; thus check the appropriate HWCAP bit. */
match = GET_HWCAP() & 0x800;
} else if (strcmp(feature, "s390x-msa5") == 0 ) {
match = facilities[0] & FAC_BIT(57); /* message security assist 5 facility */
} else if (strcmp(feature, "s390x-mi2") == 0 ) {