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
}