@samitouri / QOSamiQemu / commits / aa5d03bc93

tests/tcg/s390x: Test DR overflow (INT64_MIN / -1)

Check that DR with a non-representable quotient raises SIGFPE rather than crashing the emulator. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Link: https://lore.kernel.org/qemu-devel/20260714190351.337923-3-iii@linux.ibm.com Signed-off-by: Eric Farman <farman@linux.ibm.com>

Ilya Leoshkevich committed Jul 14, 2026 at 21:02 UTC aa5d03bc93514ceed8d94f38dbdf951f6cb19d23
1 file changed +37
tests/tcg/s390x/div.c
+37
@@ -1,6 +1,15 @@
1 #include <assert.h>
2 +#include <signal.h>
3 #include <stdint.h>
4
5 +/* Set asynchronously by the signal handler. */
6 +static volatile int signum;
7 +
8 +static void signal_handler(int n)
9 +{
10 + signum = n;
11 +}
12 +
13 static void test_dr(void)
14 {
15 register int32_t r0 asm("r0") = -1;
@@ -65,11 +74,39 @@ static void test_dlgr(void)
74 assert(r == 1);
75 }
76
77 +/*
78 + * The most negative dividend divided by -1 yields a quotient that does not
79 + * fit into 32 bits, so DR must raise a fixed-point-divide exception.
80 + */
81 +static void test_dr_overflow(void)
82 +{
83 + struct sigaction act = { .sa_handler = signal_handler };
84 + register int32_t r0 asm("r0");
85 + register int32_t r1 asm("r1");
86 + int32_t b = -1;
87 + int err;
88 +
89 + err = sigaction(SIGFPE, &act, NULL);
90 + assert(err == 0);
91 + signum = -1;
92 +
93 + r0 = 0x80000000;
94 + r1 = 0;
95 + asm volatile("dr %[r0],%[b]"
96 + : [r0] "+r" (r0), [r1] "+r" (r1)
97 + : [b] "r" (b)
98 + : "cc");
99 + assert(signum == SIGFPE);
100 +
101 + signal(SIGFPE, SIG_DFL);
102 +}
103 +
104 int main(void)
105 {
106 test_dr();
107 test_dlr();
108 test_dsgr();
109 test_dlgr();
110 + test_dr_overflow();
111 return 0;
112 }