Commit 380cb2f4 authored by Michael Ellerman's avatar Michael Ellerman

selftests/powerpc: Fix fpu_signal failures

My recent commit e5d00aaa ("selftests/powerpc: Check all FPRs in
fpu_preempt") inadvertently broke the fpu_signal test.

It needs to take into account that fpu_preempt now loads 32 FPRs, so
enlarge darray.

Also use the newly added randomise_darray() to properly randomise darray.

Finally the checking done in signal_fpu_sig() needs to skip checking
f30/f31, because they are used as scratch registers in check_all_fprs(),
called by preempt_fpu(), and so could hold other values when the signal
is taken.

Fixes: e5d00aaa ("selftests/powerpc: Check all FPRs in fpu_preempt")
Reported-by: default avatarSpoorthy <spoorthy@linux.ibm.com>
Depends-on: 2ba107f6 ("selftests/powerpc: Generate better bit patterns for FPU tests")
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240301101035.1230024-1-mpe@ellerman.id.au
parent fad87dbd
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <pthread.h> #include <pthread.h>
#include "utils.h" #include "utils.h"
#include "fpu.h"
/* Number of times each thread should receive the signal */ /* Number of times each thread should receive the signal */
#define ITERATIONS 10 #define ITERATIONS 10
...@@ -27,9 +28,7 @@ ...@@ -27,9 +28,7 @@
*/ */
#define THREAD_FACTOR 8 #define THREAD_FACTOR 8
__thread double darray[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, __thread double darray[32];
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
2.1};
bool bad_context; bool bad_context;
int threads_starting; int threads_starting;
...@@ -43,9 +42,9 @@ void signal_fpu_sig(int sig, siginfo_t *info, void *context) ...@@ -43,9 +42,9 @@ void signal_fpu_sig(int sig, siginfo_t *info, void *context)
ucontext_t *uc = context; ucontext_t *uc = context;
mcontext_t *mc = &uc->uc_mcontext; mcontext_t *mc = &uc->uc_mcontext;
/* Only the non volatiles were loaded up */ // Don't check f30/f31, they're used as scratches in check_all_fprs()
for (i = 14; i < 32; i++) { for (i = 0; i < 30; i++) {
if (mc->fp_regs[i] != darray[i - 14]) { if (mc->fp_regs[i] != darray[i]) {
bad_context = true; bad_context = true;
break; break;
} }
...@@ -54,7 +53,6 @@ void signal_fpu_sig(int sig, siginfo_t *info, void *context) ...@@ -54,7 +53,6 @@ void signal_fpu_sig(int sig, siginfo_t *info, void *context)
void *signal_fpu_c(void *p) void *signal_fpu_c(void *p)
{ {
int i;
long rc; long rc;
struct sigaction act; struct sigaction act;
act.sa_sigaction = signal_fpu_sig; act.sa_sigaction = signal_fpu_sig;
...@@ -64,9 +62,7 @@ void *signal_fpu_c(void *p) ...@@ -64,9 +62,7 @@ void *signal_fpu_c(void *p)
return p; return p;
srand(pthread_self()); srand(pthread_self());
for (i = 0; i < 21; i++) randomise_darray(darray, ARRAY_SIZE(darray));
darray[i] = rand();
rc = preempt_fpu(darray, &threads_starting, &running); rc = preempt_fpu(darray, &threads_starting, &running);
return (void *) rc; return (void *) rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment