Message ID | 20220817165704.165291-1-lucas.araujo@eldorado.org.br (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] tests/tcg/ppc64le: Added an overflow with OE=1 test | expand |
On 8/17/22 09:57, Lucas Mateus Castro(alqotel) wrote: > +void sigfpe_handler(int sig, siginfo_t *si, void *ucontext) > +{ > + uint64_t t; > + uint64_t ch = 0x5fcfffe4965a17e0ull; > + asm ( > + "stfd 2, %0\n\t" > + : "=m"(t) > + : > + : "memory", "fr2" > + ); No, you need to fetch f2 from ucontext. There's no guarantee of any specific values being present in the signal handler otherwise. > + return -1; exit(-1), which return from main equates to, helpful over EXIT_FAILURE. But here I'd tend to abort(), since it really shouldn't be reachable. r~
On 18/08/2022 12:32, Richard Henderson wrote: > On 8/17/22 09:57, Lucas Mateus Castro(alqotel) wrote: >> +void sigfpe_handler(int sig, siginfo_t *si, void *ucontext) >> +{ >> + uint64_t t; >> + uint64_t ch = 0x5fcfffe4965a17e0ull; >> + asm ( >> + "stfd 2, %0\n\t" >> + : "=m"(t) >> + : >> + : "memory", "fr2" >> + ); > > No, you need to fetch f2 from ucontext. There's no guarantee of any > specific values being > present in the signal handler otherwise. Yeah, for some reason I completely forgot about this, my bad. I'll send a second version fixing this > >> + return -1; > > exit(-1), which return from main equates to, helpful over EXIT_FAILURE. > But here I'd tend to abort(), since it really shouldn't be reachable. Good point, I'll change in v2 > > > r~
diff --git a/tests/tcg/ppc64/Makefile.target b/tests/tcg/ppc64/Makefile.target index 331fae628e..43958ad87b 100644 --- a/tests/tcg/ppc64/Makefile.target +++ b/tests/tcg/ppc64/Makefile.target @@ -29,5 +29,6 @@ run-plugin-sha512-vector-with-%: QEMU_OPTS+=-cpu POWER10 PPC64_TESTS += signal_save_restore_xer PPC64_TESTS += xxspltw +PPC64_TESTS += oe_excp TESTS += $(PPC64_TESTS) diff --git a/tests/tcg/ppc64le/Makefile.target b/tests/tcg/ppc64le/Makefile.target index 6ca3003f02..8d11ac731d 100644 --- a/tests/tcg/ppc64le/Makefile.target +++ b/tests/tcg/ppc64le/Makefile.target @@ -27,5 +27,6 @@ PPC64LE_TESTS += mtfsf PPC64LE_TESTS += mffsce PPC64LE_TESTS += signal_save_restore_xer PPC64LE_TESTS += xxspltw +PPC64LE_TESTS += oe_excp TESTS += $(PPC64LE_TESTS) diff --git a/tests/tcg/ppc64le/oe_excp.c b/tests/tcg/ppc64le/oe_excp.c new file mode 100644 index 0000000000..cfc364f5ed --- /dev/null +++ b/tests/tcg/ppc64le/oe_excp.c @@ -0,0 +1,54 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/prctl.h> +#include <signal.h> +#include <stdint.h> + +#define FP_OE (1ull << 6) +#define MTFSF(FLM, FRB) asm volatile ("mtfsf %0, %1" :: "i" (FLM), "f" (FRB)) + +void sigfpe_handler(int sig, siginfo_t *si, void *ucontext) +{ + uint64_t t; + uint64_t ch = 0x5fcfffe4965a17e0ull; + asm ( + "stfd 2, %0\n\t" + : "=m"(t) + : + : "memory", "fr2" + ); + if (t == ch) { + exit(0); + } + fprintf(stderr, "expected result: %lx\n result: %lx\n", ch, t); + exit(1); +} + +int main() +{ + uint64_t fpscr; + uint64_t a = 0x7fdfffe816d77b00ull; + uint64_t b = 0x7fdfffFC7F7FFF00ull; + + struct sigaction sa = { + .sa_sigaction = sigfpe_handler, + .sa_flags = SA_SIGINFO + }; + + prctl(PR_SET_FPEXC, PR_FP_EXC_PRECISE); + sigaction(SIGFPE, &sa, NULL); + + fpscr = FP_OE; + MTFSF(0b11111111, fpscr); + + asm ( + "lfd 0, %0\n\t" + "lfd 1, %1\n\t" + "fmul 2, 0, 1\n\t" + : + : "m"(a), "m"(b) + : "memory", "fr0", "fr1", "fr2" + ); + + return -1; +}