Skip to content

Commit

Permalink
selftests/powerpc: Generate better bit patterns for FPU tests
Browse files Browse the repository at this point in the history
The fpu_preempt test randomly initialises an array of doubles to try and
detect FPU register corruption.

However the values it generates do not occupy the full range of values
possible in the 64-bit double, meaning some partial register corruption
could go undetected.

Without getting too carried away, add some better initialisation to
generate values that occupy more bits.

Sample values before:

  f0             902677510               (raw 0x41cae6e203000000)
  f1             325217596               (raw 0x41b3626d3c000000)
  f2             1856578300              (raw 0x41dbaa48bf000000)
  f3             1247189984              (raw 0x41d295a6f8000000)

And after:

  f0             1.1078153481413311e-09  (raw 0x3e13083932805cc2)
  f1             1.0576648474801922e+17  (raw 0x43777c20eb88c261)
  f2             -6.6245033413594075e-10 (raw 0xbe06c2f989facae9)
  f3             3.0085988827156291e+18  (raw 0x43c4e0585f2df37b)

Signed-off-by: Michael Ellerman <[email protected]>
Link: https://msgid.link/[email protected]
  • Loading branch information
mpe committed Dec 13, 2023
1 parent e5d00aa commit 2ba107f
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
25 changes: 25 additions & 0 deletions tools/testing/selftests/powerpc/math/fpu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright 2023, Michael Ellerman, IBM Corporation.
*/

#ifndef _SELFTESTS_POWERPC_FPU_H
#define _SELFTESTS_POWERPC_FPU_H

static inline void randomise_darray(double *darray, int num)
{
long val;

for (int i = 0; i < num; i++) {
val = random();
if (val & 1)
val *= -1;

if (val & 2)
darray[i] = 1.0 / val;
else
darray[i] = val * val;
}
}

#endif /* _SELFTESTS_POWERPC_FPU_H */
6 changes: 2 additions & 4 deletions tools/testing/selftests/powerpc/math/fpu_preempt.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <pthread.h>

#include "utils.h"
#include "fpu.h"

/* Time to wait for workers to get preempted (seconds) */
#define PREEMPT_TIME 20
Expand All @@ -39,12 +40,9 @@ 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 < ARRAY_SIZE(darray); i++)
darray[i] = rand();

randomise_darray(darray, ARRAY_SIZE(darray));
rc = preempt_fpu(darray, &threads_starting, &running);

return (void *)rc;
Expand Down

0 comments on commit 2ba107f

Please sign in to comment.