Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc: Skip vmx/vsx/tar/etc tests on older CPUs

Some of our tests use VSX or newer VMX instructions, so need to be
skipped on older CPUs to avoid SIGILL'ing.

Similarly TAR was added in v2.07, and the PMU event used in the stcx
fail test only works on Power8 or later.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200803020719.96114-1-mpe@ellerman.id.au

+34 -6
+4 -4
tools/testing/selftests/powerpc/math/Makefile
··· 11 11 $(OUTPUT)/fpu_preempt: fpu_asm.S 12 12 $(OUTPUT)/fpu_signal: fpu_asm.S 13 13 14 - $(OUTPUT)/vmx_syscall: vmx_asm.S 15 - $(OUTPUT)/vmx_preempt: vmx_asm.S 16 - $(OUTPUT)/vmx_signal: vmx_asm.S 14 + $(OUTPUT)/vmx_syscall: vmx_asm.S ../utils.c 15 + $(OUTPUT)/vmx_preempt: vmx_asm.S ../utils.c 16 + $(OUTPUT)/vmx_signal: vmx_asm.S ../utils.c 17 17 18 18 $(OUTPUT)/vsx_preempt: CFLAGS += -mvsx 19 - $(OUTPUT)/vsx_preempt: vsx_asm.S 19 + $(OUTPUT)/vsx_preempt: vsx_asm.S ../utils.c
+3
tools/testing/selftests/powerpc/math/vmx_preempt.c
··· 57 57 int i, rc, threads; 58 58 pthread_t *tids; 59 59 60 + // vcmpequd used in vmx_asm.S is v2.07 61 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 62 + 60 63 threads = sysconf(_SC_NPROCESSORS_ONLN) * THREAD_FACTOR; 61 64 tids = malloc(threads * sizeof(pthread_t)); 62 65 FAIL_IF(!tids);
+3
tools/testing/selftests/powerpc/math/vmx_signal.c
··· 96 96 void *rc_p; 97 97 pthread_t *tids; 98 98 99 + // vcmpequd used in vmx_asm.S is v2.07 100 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 101 + 99 102 threads = sysconf(_SC_NPROCESSORS_ONLN) * THREAD_FACTOR; 100 103 tids = malloc(threads * sizeof(pthread_t)); 101 104 FAIL_IF(!tids);
+6 -1
tools/testing/selftests/powerpc/math/vmx_syscall.c
··· 49 49 * Setup an environment with much context switching 50 50 */ 51 51 pid_t pid2; 52 - pid_t pid = fork(); 52 + pid_t pid; 53 53 int ret; 54 54 int child_ret; 55 + 56 + // vcmpequd used in vmx_asm.S is v2.07 57 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 58 + 59 + pid = fork(); 55 60 FAIL_IF(pid == -1); 56 61 57 62 pid2 = fork();
+2
tools/testing/selftests/powerpc/math/vsx_preempt.c
··· 92 92 int i, rc, threads; 93 93 pthread_t *tids; 94 94 95 + SKIP_IF(!have_hwcap(PPC_FEATURE_HAS_VSX)); 96 + 95 97 threads = sysconf(_SC_NPROCESSORS_ONLN) * THREAD_FACTOR; 96 98 tids = malloc(threads * sizeof(pthread_t)); 97 99 FAIL_IF(!tids);
+4
tools/testing/selftests/powerpc/pmu/count_stcx_fail.c
··· 9 9 #include <stdbool.h> 10 10 #include <string.h> 11 11 #include <sys/prctl.h> 12 + #include <asm/cputable.h> 12 13 13 14 #include "event.h" 14 15 #include "utils.h" ··· 104 103 { 105 104 struct event events[3]; 106 105 u64 overhead; 106 + 107 + // The STCX_FAIL event we use works on Power8 or later 108 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 107 109 108 110 setup_event(&events[0], PERF_COUNT_HW_INSTRUCTIONS, PERF_TYPE_HARDWARE, "instructions"); 109 111 setup_event(&events[1], PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "cycles");
+3
tools/testing/selftests/powerpc/ptrace/ptrace-tar.c
··· 78 78 pid_t pid; 79 79 int ret, status; 80 80 81 + // TAR was added in v2.07 82 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 83 + 81 84 shm_id = shmget(IPC_PRIVATE, sizeof(int) * 3, 0777|IPC_CREAT); 82 85 pid = fork(); 83 86 if (pid < 0) {
+2
tools/testing/selftests/powerpc/ptrace/ptrace-vsx.c
··· 61 61 pid_t pid; 62 62 int ret, status, i; 63 63 64 + SKIP_IF(!have_hwcap(PPC_FEATURE_HAS_VSX)); 65 + 64 66 shm_id = shmget(IPC_PRIVATE, sizeof(int) * 2, 0777|IPC_CREAT); 65 67 66 68 for (i = 0; i < VEC_MAX; i++)
+1 -1
tools/testing/selftests/powerpc/stringloops/Makefile
··· 8 8 9 9 TEST_GEN_PROGS := memcmp_64 strlen 10 10 11 - $(OUTPUT)/memcmp_64: memcmp.c 11 + $(OUTPUT)/memcmp_64: memcmp.c ../utils.c 12 12 $(OUTPUT)/memcmp_64: CFLAGS += -m64 -maltivec 13 13 14 14 ifeq ($(build_32bit),1)
+6
tools/testing/selftests/powerpc/stringloops/memcmp.c
··· 4 4 #include <string.h> 5 5 #include <sys/mman.h> 6 6 #include <time.h> 7 + #include <asm/cputable.h> 7 8 #include "utils.h" 8 9 9 10 #define SIZE 256 ··· 152 151 153 152 static int testcases(void) 154 153 { 154 + #ifdef __powerpc64__ 155 + // vcmpequd used in memcmp_64.S is v2.07 156 + SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07)); 157 + #endif 158 + 155 159 testcase(0); 156 160 testcase(1); 157 161 return 0;