diff --git a/tools/test/xregs_sig/c2x2c_aarch64.S b/tools/test/xregs_sig/c2x2c_aarch64.S index eebe1f334546..6f1637f5bcdf 100644 --- a/tools/test/xregs_sig/c2x2c_aarch64.S +++ b/tools/test/xregs_sig/c2x2c_aarch64.S @@ -1,55 +1,55 @@ /* * This file is in public domain. * Written by Dmitry Chagin * * $FreeBSD$ */ - .global cpu_to_simd - .type cpu_to_simd, @function -cpu_to_simd: + .global cpu_to_xregs + .type cpu_to_xregs, @function +cpu_to_xregs: stp q0, q1, [x0, #( 0 * 16)] stp q2, q3, [x0, #( 2 * 16)] stp q4, q5, [x0, #( 4 * 16)] stp q6, q7, [x0, #( 6 * 16)] stp q8, q9, [x0, #( 8 * 16)] stp q10, q11, [x0, #(10 * 16)] stp q12, q13, [x0, #(12 * 16)] stp q14, q15, [x0, #(14 * 16)] stp q16, q17, [x0, #(16 * 16)] stp q18, q19, [x0, #(18 * 16)] stp q20, q21, [x0, #(20 * 16)] stp q22, q23, [x0, #(22 * 16)] stp q24, q25, [x0, #(24 * 16)] stp q26, q27, [x0, #(26 * 16)] stp q28, q29, [x0, #(28 * 16)] stp q30, q31, [x0, #(30 * 16)] ret - .size cpu_to_simd, . - cpu_to_simd + .size cpu_to_xregs, . - cpu_to_xregs - .global simd_to_cpu - .type simd_to_cpu, @function -simd_to_cpu: + .global xregs_to_cpu + .type xregs_to_cpu, @function +xregs_to_cpu: ldp q0, q1, [x0, #( 0 * 16)] ldp q2, q3, [x0, #( 2 * 16)] ldp q4, q5, [x0, #( 4 * 16)] ldp q6, q7, [x0, #( 6 * 16)] ldp q8, q9, [x0, #( 8 * 16)] ldp q10, q11, [x0, #(10 * 16)] ldp q12, q13, [x0, #(12 * 16)] ldp q14, q15, [x0, #(14 * 16)] ldp q16, q17, [x0, #(16 * 16)] ldp q18, q19, [x0, #(18 * 16)] ldp q20, q21, [x0, #(20 * 16)] ldp q22, q23, [x0, #(22 * 16)] ldp q24, q25, [x0, #(24 * 16)] ldp q26, q27, [x0, #(26 * 16)] ldp q28, q29, [x0, #(28 * 16)] ldp q30, q31, [x0, #(30 * 16)] ret - .size simd_to_cpu, . - simd_to_cpu + .size xregs_to_cpu, . - xregs_to_cpu .section .note.GNU-stack,"",@progbits diff --git a/tools/test/xregs_sig/c2x2c_amd64.S b/tools/test/xregs_sig/c2x2c_amd64.S index bd18ac979000..e5ae5af99e97 100644 --- a/tools/test/xregs_sig/c2x2c_amd64.S +++ b/tools/test/xregs_sig/c2x2c_amd64.S @@ -1,55 +1,55 @@ /* * This file is in public domain. * Written by Dmitry Chagin * * $FreeBSD$ */ - .global cpu_to_simd - .type cpu_to_simd, @function -cpu_to_simd: + .global cpu_to_xregs + .type cpu_to_xregs, @function +cpu_to_xregs: movdqu %xmm0, (%rdi) movdqu %xmm1, 1 * 16(%rdi) movdqu %xmm2, 2 * 16(%rdi) movdqu %xmm3, 3 * 16(%rdi) movdqu %xmm4, 4 * 16(%rdi) movdqu %xmm5, 5 * 16(%rdi) movdqu %xmm6, 6 * 16(%rdi) movdqu %xmm7, 7 * 16(%rdi) movdqu %xmm8, 8 * 16(%rdi) movdqu %xmm9, 9 * 16(%rdi) movdqu %xmm10, 10 * 16(%rdi) movdqu %xmm11, 11 * 16(%rdi) movdqu %xmm12, 12 * 16(%rdi) movdqu %xmm13, 13 * 16(%rdi) movdqu %xmm14, 14 * 16(%rdi) movdqu %xmm15, 15 * 16(%rdi) retq - .size cpu_to_simd, . - cpu_to_simd + .size cpu_to_xregs, . - cpu_to_xregs - .global simd_to_cpu - .type simd_to_cpu, @function -simd_to_cpu: + .global xregs_to_cpu + .type xregs_to_cpu, @function +xregs_to_cpu: movdqu (%rdi), %xmm0 movdqu 1 * 16(%rdi), %xmm1 movdqu 2 * 16(%rdi), %xmm2 movdqu 3 * 16(%rdi), %xmm3 movdqu 4 * 16(%rdi), %xmm4 movdqu 5 * 16(%rdi), %xmm5 movdqu 6 * 16(%rdi), %xmm6 movdqu 7 * 16(%rdi), %xmm7 movdqu 8 * 16(%rdi), %xmm8 movdqu 9 * 16(%rdi), %xmm9 movdqu 10 * 16(%rdi), %xmm10 movdqu 11 * 16(%rdi), %xmm11 movdqu 12 * 16(%rdi), %xmm12 movdqu 13 * 16(%rdi), %xmm13 movdqu 14 * 16(%rdi), %xmm14 movdqu 15 * 16(%rdi), %xmm15 retq - .size simd_to_cpu, . - simd_to_cpu + .size xregs_to_cpu, . - xregs_to_cpu .section .note.GNU-stack,"",@progbits diff --git a/tools/test/xregs_sig/xregs_sig.c b/tools/test/xregs_sig/xregs_sig.c index 19fb85f2e803..a67379a0080e 100644 --- a/tools/test/xregs_sig/xregs_sig.c +++ b/tools/test/xregs_sig/xregs_sig.c @@ -1,218 +1,218 @@ /* $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 #include #include #include #include #include #ifdef __FreeBSD__ #include #endif #ifdef __linux__ #ifdef __GLIBC__ #include #endif #if !defined(__GLIBC__) || (__GLIBC__ * 100 + __GLIBC_MINOR__) < 236 #include #endif #endif #include #include #include #include #include #include #include #include /* SIGALRM interval in seconds. */ #ifndef TIMO #define TIMO 5 #endif #ifndef __unused #define __unused __attribute__((__unused__)) #endif #ifndef nitems #define nitems(x) (sizeof((x)) / sizeof((x)[0])) #endif #if defined(__amd64__) -#define SIMDRNAM "xmm" +#define XREGSRNAM "xmm" #define NREGS 16 #elif defined(__aarch64__) -#define SIMDRNAM "q" +#define XREGSRNAM "q" #define NREGS 32 #endif -struct simdreg { - uint8_t simd_bytes[16]; +struct xregsreg { + uint8_t xregs_bytes[16]; }; -struct simd { - struct simdreg simdreg[NREGS]; +struct xregs { + struct xregsreg xregsreg[NREGS]; }; -void cpu_to_simd(struct simd *simd); -void simd_to_cpu(struct simd *simd); +void cpu_to_xregs(struct xregs *xregs); +void xregs_to_cpu(struct xregs *xregs); 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); } static void sigalrm_handler(int sig __unused) { struct rusage r; if (getrusage(RUSAGE_SELF, &r) == 0) { printf("%lu vctx %lu nvctx %lu nsigs %u SIGUSR1\n", r.ru_nvcsw, r.ru_nivcsw, r.ru_nsignals, sigs); } alarm(TIMO); } -static struct simd zero_simd = {}; +static struct xregs zero_xregs = {}; static void -fill_simd(struct simd *simd) +fill_xregs(struct xregs *xregs) { - arc4random_buf(simd, sizeof(*simd)); + arc4random_buf(xregs, sizeof(*xregs)); } static void -dump_simd(const struct simdreg *r) +dump_xregs(const struct xregsreg *r) { unsigned k; - for (k = 0; k < nitems(r->simd_bytes); k++) { + for (k = 0; k < nitems(r->xregs_bytes); k++) { if (k != 0) printf(" "); - printf("%02x", r->simd_bytes[k]); + printf("%02x", r->xregs_bytes[k]); } printf("\n"); } static pthread_mutex_t show_lock; static void -show_diff(const struct simd *simd1, const struct simd *simd2) +show_diff(const struct xregs *xregs1, const struct xregs *xregs2) { - const struct simdreg *r1, *r2; + const struct xregsreg *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(simd1->simdreg); i++) { - r1 = &simd1->simdreg[i]; - r2 = &simd2->simdreg[i]; - for (j = 0; j < nitems(r1->simd_bytes); j++) { - if (r1->simd_bytes[j] != r2->simd_bytes[j]) { - printf("%%%s%u\n", SIMDRNAM, i); - dump_simd(r1); - dump_simd(r2); + for (i = 0; i < nitems(xregs1->xregsreg); i++) { + r1 = &xregs1->xregsreg[i]; + r2 = &xregs2->xregsreg[i]; + for (j = 0; j < nitems(r1->xregs_bytes); j++) { + if (r1->xregs_bytes[j] != r2->xregs_bytes[j]) { + printf("%%%s%u\n", XREGSRNAM, i); + dump_xregs(r1); + dump_xregs(r2); break; } } } } static void my_pause(void) { usleep(0); } static void * worker_thread(void *arg __unused) { - struct simd simd, simd_cpu; + struct xregs xregs, xregs_cpu; - fill_simd(&simd); + fill_xregs(&xregs); for (;;) { - simd_to_cpu(&simd); + xregs_to_cpu(&xregs); my_pause(); - cpu_to_simd(&simd_cpu); - if (memcmp(&simd, &simd_cpu, sizeof(struct simd)) != 0) { + cpu_to_xregs(&xregs_cpu); + if (memcmp(&xregs, &xregs_cpu, sizeof(struct xregs)) != 0) { pthread_mutex_lock(&show_lock); - show_diff(&simd, &simd_cpu); + show_diff(&xregs, &xregs_cpu); abort(); pthread_mutex_unlock(&show_lock); } - simd_to_cpu(&zero_simd); + xregs_to_cpu(&zero_xregs); my_pause(); - cpu_to_simd(&simd_cpu); - if (memcmp(&zero_simd, &simd_cpu, sizeof(struct simd)) != 0) { + cpu_to_xregs(&xregs_cpu); + if (memcmp(&zero_xregs, &xregs_cpu, sizeof(struct xregs)) != 0) { pthread_mutex_lock(&show_lock); - show_diff(&zero_simd, &simd_cpu); + show_diff(&zero_xregs, &xregs_cpu); abort(); pthread_mutex_unlock(&show_lock); } } return (NULL); } int main(void) { struct sigaction sa; int error, i, ncpu; bzero(&sa, sizeof(sa)); sa.sa_handler = sigalrm_handler; if (sigaction(SIGALRM, &sa, NULL) == -1) { fprintf(stderr, "sigaction SIGALRM %s\n", strerror(errno)); exit(1); } 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)); } } alarm(TIMO); for (;;) { for (i = 0; i < ncpu; i++) { my_pause(); pthread_kill(wt[i], SIGUSR1); } } }