xref: /openbmc/qemu/tests/tcg/m68k/trap.c (revision 1e62a82574fc28e64deca589a23cf55ada2e1a7d)
1*e105db02SRichard Henderson /*
2*e105db02SRichard Henderson  * Test m68k trap addresses.
3*e105db02SRichard Henderson  */
4*e105db02SRichard Henderson 
5*e105db02SRichard Henderson #define _GNU_SOURCE 1
6*e105db02SRichard Henderson #include <signal.h>
7*e105db02SRichard Henderson #include <assert.h>
8*e105db02SRichard Henderson #include <limits.h>
9*e105db02SRichard Henderson 
10*e105db02SRichard Henderson static int expect_sig;
11*e105db02SRichard Henderson static int expect_si_code;
12*e105db02SRichard Henderson static void *expect_si_addr;
13*e105db02SRichard Henderson static greg_t expect_mc_pc;
14*e105db02SRichard Henderson static volatile int got_signal;
15*e105db02SRichard Henderson 
sig_handler(int sig,siginfo_t * si,void * puc)16*e105db02SRichard Henderson static void sig_handler(int sig, siginfo_t *si, void *puc)
17*e105db02SRichard Henderson {
18*e105db02SRichard Henderson     ucontext_t *uc = puc;
19*e105db02SRichard Henderson     mcontext_t *mc = &uc->uc_mcontext;
20*e105db02SRichard Henderson 
21*e105db02SRichard Henderson     assert(sig == expect_sig);
22*e105db02SRichard Henderson     assert(si->si_code == expect_si_code);
23*e105db02SRichard Henderson     assert(si->si_addr == expect_si_addr);
24*e105db02SRichard Henderson     assert(mc->gregs[R_PC] == expect_mc_pc);
25*e105db02SRichard Henderson 
26*e105db02SRichard Henderson     got_signal = 1;
27*e105db02SRichard Henderson }
28*e105db02SRichard Henderson 
29*e105db02SRichard Henderson #define FMT_INS     [ad] "a"(&expect_si_addr), [pc] "a"(&expect_mc_pc)
30*e105db02SRichard Henderson #define FMT0_STR(S) \
31*e105db02SRichard Henderson     "move.l #1f, (%[ad])\n\tmove.l #1f, (%[pc])\n" S "\n1:\n"
32*e105db02SRichard Henderson #define FMT2_STR(S) \
33*e105db02SRichard Henderson     "move.l #0f, (%[ad])\n\tmove.l #1f, (%[pc])\n" S "\n1:\n"
34*e105db02SRichard Henderson 
35*e105db02SRichard Henderson #define CHECK_SIG   do { assert(got_signal); got_signal = 0; } while (0)
36*e105db02SRichard Henderson 
main(int argc,char ** argv)37*e105db02SRichard Henderson int main(int argc, char **argv)
38*e105db02SRichard Henderson {
39*e105db02SRichard Henderson     struct sigaction act = {
40*e105db02SRichard Henderson         .sa_sigaction = sig_handler,
41*e105db02SRichard Henderson         .sa_flags = SA_SIGINFO
42*e105db02SRichard Henderson     };
43*e105db02SRichard Henderson     int t0, t1;
44*e105db02SRichard Henderson 
45*e105db02SRichard Henderson     sigaction(SIGILL, &act, NULL);
46*e105db02SRichard Henderson     sigaction(SIGTRAP, &act, NULL);
47*e105db02SRichard Henderson     sigaction(SIGFPE, &act, NULL);
48*e105db02SRichard Henderson 
49*e105db02SRichard Henderson     expect_sig = SIGFPE;
50*e105db02SRichard Henderson     expect_si_code = FPE_INTOVF;
51*e105db02SRichard Henderson     asm volatile(FMT2_STR("0:\tchk %0, %1") : : "d"(0), "d"(-1), FMT_INS);
52*e105db02SRichard Henderson     CHECK_SIG;
53*e105db02SRichard Henderson 
54*e105db02SRichard Henderson #if 0
55*e105db02SRichard Henderson     /* FIXME: chk2 not correctly translated. */
56*e105db02SRichard Henderson     int bounds[2] = { 0, 1 };
57*e105db02SRichard Henderson     asm volatile(FMT2_STR("0:\tchk2.l %0, %1")
58*e105db02SRichard Henderson                  : : "m"(bounds), "d"(2), FMT_INS);
59*e105db02SRichard Henderson     CHECK_SIG;
60*e105db02SRichard Henderson #endif
61*e105db02SRichard Henderson 
62*e105db02SRichard Henderson     asm volatile(FMT2_STR("cmp.l %0, %1\n0:\ttrapv")
63*e105db02SRichard Henderson                  : : "d"(INT_MIN), "d"(1), FMT_INS);
64*e105db02SRichard Henderson     CHECK_SIG;
65*e105db02SRichard Henderson 
66*e105db02SRichard Henderson     asm volatile(FMT2_STR("cmp.l %0, %0\n0:\ttrapeq")
67*e105db02SRichard Henderson                  : : "d"(0), FMT_INS);
68*e105db02SRichard Henderson     CHECK_SIG;
69*e105db02SRichard Henderson 
70*e105db02SRichard Henderson     asm volatile(FMT2_STR("cmp.l %0, %0\n0:\ttrapeq.w #0x1234")
71*e105db02SRichard Henderson                  : : "d"(0), FMT_INS);
72*e105db02SRichard Henderson     CHECK_SIG;
73*e105db02SRichard Henderson 
74*e105db02SRichard Henderson     asm volatile(FMT2_STR("cmp.l %0, %0\n0:\ttrapeq.l #0x12345678")
75*e105db02SRichard Henderson                  : : "d"(0), FMT_INS);
76*e105db02SRichard Henderson     CHECK_SIG;
77*e105db02SRichard Henderson 
78*e105db02SRichard Henderson     asm volatile(FMT2_STR("fcmp.x %0, %0\n0:\tftrapeq")
79*e105db02SRichard Henderson                  : : "f"(0.0L), FMT_INS);
80*e105db02SRichard Henderson     CHECK_SIG;
81*e105db02SRichard Henderson 
82*e105db02SRichard Henderson     expect_si_code = FPE_INTDIV;
83*e105db02SRichard Henderson 
84*e105db02SRichard Henderson     asm volatile(FMT2_STR("0:\tdivs.w %1, %0")
85*e105db02SRichard Henderson                  : "=d"(t0) : "d"(0), "0"(1), FMT_INS);
86*e105db02SRichard Henderson     CHECK_SIG;
87*e105db02SRichard Henderson 
88*e105db02SRichard Henderson     asm volatile(FMT2_STR("0:\tdivsl.l %2, %1:%0")
89*e105db02SRichard Henderson                  : "=d"(t0), "=d"(t1) : "d"(0), "0"(1), FMT_INS);
90*e105db02SRichard Henderson     CHECK_SIG;
91*e105db02SRichard Henderson 
92*e105db02SRichard Henderson     expect_sig = SIGILL;
93*e105db02SRichard Henderson     expect_si_code = ILL_ILLTRP;
94*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #1") : : FMT_INS);
95*e105db02SRichard Henderson     CHECK_SIG;
96*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #2") : : FMT_INS);
97*e105db02SRichard Henderson     CHECK_SIG;
98*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #3") : : FMT_INS);
99*e105db02SRichard Henderson     CHECK_SIG;
100*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #4") : : FMT_INS);
101*e105db02SRichard Henderson     CHECK_SIG;
102*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #5") : : FMT_INS);
103*e105db02SRichard Henderson     CHECK_SIG;
104*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #6") : : FMT_INS);
105*e105db02SRichard Henderson     CHECK_SIG;
106*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #7") : : FMT_INS);
107*e105db02SRichard Henderson     CHECK_SIG;
108*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #8") : : FMT_INS);
109*e105db02SRichard Henderson     CHECK_SIG;
110*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #9") : : FMT_INS);
111*e105db02SRichard Henderson     CHECK_SIG;
112*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #10") : : FMT_INS);
113*e105db02SRichard Henderson     CHECK_SIG;
114*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #11") : : FMT_INS);
115*e105db02SRichard Henderson     CHECK_SIG;
116*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #12") : : FMT_INS);
117*e105db02SRichard Henderson     CHECK_SIG;
118*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #13") : : FMT_INS);
119*e105db02SRichard Henderson     CHECK_SIG;
120*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #14") : : FMT_INS);
121*e105db02SRichard Henderson     CHECK_SIG;
122*e105db02SRichard Henderson 
123*e105db02SRichard Henderson     expect_sig = SIGTRAP;
124*e105db02SRichard Henderson     expect_si_code = TRAP_BRKPT;
125*e105db02SRichard Henderson     asm volatile(FMT0_STR("trap #15") : : FMT_INS);
126*e105db02SRichard Henderson     CHECK_SIG;
127*e105db02SRichard Henderson 
128*e105db02SRichard Henderson     return 0;
129*e105db02SRichard Henderson }
130