]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
selftests/powerpc: Fix error handling in FPU/VMX preemption tests
authorMichael Ellerman <mpe@ellerman.id.au>
Tue, 28 Nov 2023 13:27:44 +0000 (00:27 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 13 Dec 2023 02:29:08 +0000 (13:29 +1100)
The FPU & VMX preemption tests do not check for errors returned by the
low-level asm routines, preempt_fpu() / preempt_vsx() respectively.
That means any register corruption detected by the asm routines does not
result in a test failure.

Fix it by returning the return value of the asm routines from the
pthread child routines.

Fixes: e5ab8be68e44 ("selftests/powerpc: Test preservation of FPU and VMX regs across preemption")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20231128132748.1990179-1-mpe@ellerman.id.au
tools/testing/selftests/powerpc/math/fpu_preempt.c
tools/testing/selftests/powerpc/math/vmx_preempt.c

index 5235bdc8c0b1143427aa473ac53e7811919975e3..3e5b5663d24492638f8ab9c3f310ef9b4697fb7c 100644 (file)
@@ -37,19 +37,20 @@ __thread double darray[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
 int threads_starting;
 int running;
 
-extern void preempt_fpu(double *darray, int *threads_starting, int *running);
+extern int preempt_fpu(double *darray, int *threads_starting, int *running);
 
 void *preempt_fpu_c(void *p)
 {
+       long rc;
        int i;
+
        srand(pthread_self());
        for (i = 0; i < 21; i++)
                darray[i] = rand();
 
-       /* Test failed if it ever returns */
-       preempt_fpu(darray, &threads_starting, &running);
+       rc = preempt_fpu(darray, &threads_starting, &running);
 
-       return p;
+       return (void *)rc;
 }
 
 int test_preempt_fpu(void)
index 6761d6ce30eca92ae0c989470bd8a5a71c401a5f..6f7cf400c6875f9195887aa86ce304c9cf499498 100644 (file)
@@ -37,19 +37,21 @@ __thread vector int varray[] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10,11,12},
 int threads_starting;
 int running;
 
-extern void preempt_vmx(vector int *varray, int *threads_starting, int *running);
+extern int preempt_vmx(vector int *varray, int *threads_starting, int *running);
 
 void *preempt_vmx_c(void *p)
 {
        int i, j;
+       long rc;
+
        srand(pthread_self());
        for (i = 0; i < 12; i++)
                for (j = 0; j < 4; j++)
                        varray[i][j] = rand();
 
-       /* Test fails if it ever returns */
-       preempt_vmx(varray, &threads_starting, &running);
-       return p;
+       rc = preempt_vmx(varray, &threads_starting, &running);
+
+       return (void *)rc;
 }
 
 int test_preempt_vmx(void)