Skip to content

Commit

Permalink
selftests/powerpc: Fix error handling in FPU/VMX preemption tests
Browse files Browse the repository at this point in the history
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: e5ab8be ("selftests/powerpc: Test preservation of FPU and VMX regs across preemption")
Signed-off-by: Michael Ellerman <[email protected]>
Link: https://msgid.link/[email protected]
  • Loading branch information
mpe committed Dec 13, 2023
1 parent 402928b commit 9dbd592
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
9 changes: 5 additions & 4 deletions tools/testing/selftests/powerpc/math/fpu_preempt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 6 additions & 4 deletions tools/testing/selftests/powerpc/math/vmx_preempt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 9dbd592

Please sign in to comment.