aboutsummaryrefslogtreecommitdiff
path: root/tools/test/avx_sig/avx_sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/test/avx_sig/avx_sig.c')
-rw-r--r--tools/test/avx_sig/avx_sig.c220
1 files changed, 0 insertions, 220 deletions
diff --git a/tools/test/avx_sig/avx_sig.c b/tools/test/avx_sig/avx_sig.c
deleted file mode 100644
index 711d40f2c231..000000000000
--- a/tools/test/avx_sig/avx_sig.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* $Id: avx_sig.c,v 1.12 2021/12/11 22:47:09 kostik Exp $ */
-/*
- * Naive test to check that context switches and signal delivery do
- * not corrupt AVX registers file (%xmm). Run until some
- * inconsistency detected, then aborts.
- *
- * FreeBSD:
- * ${CC} -Wall -Wextra -O -g -o avx_sig avx_sig.c -lpthread
- * Linux
- * ${CC} -D_GNU_SOURCE -Wall -Wextra -O -g -o avx_sig avx_sig.c -lbsd -lpthread
- */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/syscall.h>
-#include <errno.h>
-#include <pthread.h>
-#ifdef __FreeBSD__
-#include <pthread_np.h>
-#endif
-#ifdef __linux__
-#include <bsd/stdlib.h>
-#endif
-#include <signal.h>
-#include <stdatomic.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef __unused
-#define __unused __attribute__((__unused__))
-#endif
-#ifndef nitems
-#define nitems(x) (sizeof((x)) / sizeof((x)[0]))
-#endif
-
-struct xmmreg {
- uint8_t xmm_bytes[16];
-};
-
-struct xmm {
- struct xmmreg xmmreg[16];
-};
-
-#define X2C(r) asm("movdqu %0, %%xmm" #r : "=m" (xmm->xmmreg[r]))
-#define C2X(r) asm("movdqu %%xmm" #r ", %0" : : "m" (xmm->xmmreg[r]) : "xmm" #r)
-
-static void
-cpu_to_xmm(struct xmm *xmm)
-{
- C2X(0); C2X(1); C2X(2); C2X(3); C2X(4); C2X(5); C2X(6); C2X(7);
- C2X(8); C2X(9); C2X(10); C2X(11); C2X(12); C2X(13); C2X(14); C2X(15);
-}
-
-static void
-xmm_to_cpu(struct xmm *xmm)
-{
- X2C(0); X2C(1); X2C(2); X2C(3); X2C(4); X2C(5); X2C(6); X2C(7);
- X2C(8); X2C(9); X2C(10); X2C(11); X2C(12); X2C(13); X2C(14); X2C(15);
-}
-
-#undef C2X
-#undef X2C
-
-static atomic_uint sigs;
-
-static void
-sigusr1_handler(int sig __unused, siginfo_t *si __unused, void *m __unused)
-{
- atomic_fetch_add_explicit(&sigs, 1, memory_order_relaxed);
-}
-
-#ifdef SIGINFO
-static void
-siginfo_handler(int sig __unused)
-{
- struct rusage r;
-
- if (getrusage(RUSAGE_SELF, &r) == 0) {
- printf("%lu vctx %lu nvctx %lu nsigs ",
- r.ru_nvcsw, r.ru_nivcsw, r.ru_nsignals);
- }
- printf("%u SIGUSR1\n", sigs);
-}
-#endif
-
-static struct xmm zero_xmm = {};
-
-static void
-fill_xmm(struct xmm *xmm)
-{
- arc4random_buf(xmm, sizeof(*xmm));
-}
-
-static void
-dump_xmm(const struct xmmreg *r)
-{
- unsigned k;
-
- for (k = 0; k < nitems(r->xmm_bytes); k++) {
- if (k != 0)
- printf(" ");
- printf("%02x", r->xmm_bytes[k]);
- }
- printf("\n");
-}
-
-static pthread_mutex_t show_lock;
-
-static void
-show_diff(const struct xmm *xmm1, const struct xmm *xmm2)
-{
- const struct xmmreg *r1, *r2;
- unsigned i, j;
-
-#if defined(__FreeBSD__)
- printf("thr %d\n", pthread_getthreadid_np());
-#elif defined(__linux__)
- printf("thr %ld\n", syscall(SYS_gettid));
-#endif
- for (i = 0; i < nitems(xmm1->xmmreg); i++) {
- r1 = &xmm1->xmmreg[i];
- r2 = &xmm2->xmmreg[i];
- for (j = 0; j < nitems(r1->xmm_bytes); j++) {
- if (r1->xmm_bytes[j] != r2->xmm_bytes[j]) {
- printf("xmm%u\n", i);
- dump_xmm(r1);
- dump_xmm(r2);
- break;
- }
- }
- }
-}
-
-static void
-my_pause(void)
-{
- usleep(0);
-}
-
-static void *
-worker_thread(void *arg __unused)
-{
- struct xmm xmm, xmm_cpu;
-
- fill_xmm(&xmm);
- for (;;) {
- xmm_to_cpu(&xmm);
- my_pause();
- cpu_to_xmm(&xmm_cpu);
- if (memcmp(&xmm, &xmm_cpu, sizeof(struct xmm)) != 0) {
- pthread_mutex_lock(&show_lock);
- show_diff(&xmm, &xmm_cpu);
- abort();
- pthread_mutex_unlock(&show_lock);
- }
-
- xmm_to_cpu(&zero_xmm);
- my_pause();
- cpu_to_xmm(&xmm_cpu);
- if (memcmp(&zero_xmm, &xmm_cpu, sizeof(struct xmm)) != 0) {
- pthread_mutex_lock(&show_lock);
- show_diff(&zero_xmm, &xmm_cpu);
- abort();
- pthread_mutex_unlock(&show_lock);
- }
- }
- return (NULL);
-}
-
-int
-main(void)
-{
- struct sigaction sa;
- int error, i, ncpu;
-
-#ifdef SIGINFO
- bzero(&sa, sizeof(sa));
- sa.sa_handler = siginfo_handler;
- if (sigaction(SIGINFO, &sa, NULL) == -1) {
- fprintf(stderr, "sigaction SIGINFO %s\n", strerror(errno));
- exit(1);
- }
-#endif
-
- bzero(&sa, sizeof(sa));
- sa.sa_sigaction = sigusr1_handler;
- sa.sa_flags = SA_SIGINFO;
- if (sigaction(SIGUSR1, &sa, NULL) == -1) {
- fprintf(stderr, "sigaction SIGUSR1 %s\n", strerror(errno));
- exit(1);
- }
-
- error = pthread_mutex_init(&show_lock, NULL);
- if (error != 0) {
- fprintf(stderr, "pthread_mutex_init %s\n", strerror(error));
- exit(1);
- }
-
- ncpu = sysconf(_SC_NPROCESSORS_ONLN);
- ncpu *= 2;
- pthread_t wt[ncpu];
- for (i = 0; i < ncpu; i++) {
- error = pthread_create(&wt[i], NULL, worker_thread, NULL);
- if (error != 0) {
- fprintf(stderr, "pthread_create %s\n", strerror(error));
- }
- }
-
- for (;;) {
- for (i = 0; i < ncpu; i++) {
- my_pause();
- pthread_kill(wt[i], SIGUSR1);
- }
- }
-}