xref: /openbmc/qemu/tests/tcg/arm/pcalign-a32.c (revision aab8cfd4c3614a049b60333a3747aedffbd04150)
1*0bdce486SRichard Henderson /* Test PC misalignment exception */
2*0bdce486SRichard Henderson 
3*0bdce486SRichard Henderson #ifdef __thumb__
4*0bdce486SRichard Henderson #error "This test must be compiled for ARM"
5*0bdce486SRichard Henderson #endif
6*0bdce486SRichard Henderson 
7*0bdce486SRichard Henderson #include <assert.h>
8*0bdce486SRichard Henderson #include <signal.h>
9*0bdce486SRichard Henderson #include <stdlib.h>
10*0bdce486SRichard Henderson #include <stdio.h>
11*0bdce486SRichard Henderson 
12*0bdce486SRichard Henderson static void *expected;
13*0bdce486SRichard Henderson 
sigbus(int sig,siginfo_t * info,void * vuc)14*0bdce486SRichard Henderson static void sigbus(int sig, siginfo_t *info, void *vuc)
15*0bdce486SRichard Henderson {
16*0bdce486SRichard Henderson     assert(info->si_code == BUS_ADRALN);
17*0bdce486SRichard Henderson     assert(info->si_addr == expected);
18*0bdce486SRichard Henderson     exit(EXIT_SUCCESS);
19*0bdce486SRichard Henderson }
20*0bdce486SRichard Henderson 
main()21*0bdce486SRichard Henderson int main()
22*0bdce486SRichard Henderson {
23*0bdce486SRichard Henderson     void *tmp;
24*0bdce486SRichard Henderson 
25*0bdce486SRichard Henderson     struct sigaction sa = {
26*0bdce486SRichard Henderson         .sa_sigaction = sigbus,
27*0bdce486SRichard Henderson         .sa_flags = SA_SIGINFO
28*0bdce486SRichard Henderson     };
29*0bdce486SRichard Henderson 
30*0bdce486SRichard Henderson     if (sigaction(SIGBUS, &sa, NULL) < 0) {
31*0bdce486SRichard Henderson         perror("sigaction");
32*0bdce486SRichard Henderson         return EXIT_FAILURE;
33*0bdce486SRichard Henderson     }
34*0bdce486SRichard Henderson 
35*0bdce486SRichard Henderson     asm volatile("adr %0, 1f + 2\n\t"
36*0bdce486SRichard Henderson                  "str %0, %1\n\t"
37*0bdce486SRichard Henderson                  "bx  %0\n"
38*0bdce486SRichard Henderson                  "1:"
39*0bdce486SRichard Henderson                  : "=&r"(tmp), "=m"(expected));
40*0bdce486SRichard Henderson 
41*0bdce486SRichard Henderson     /*
42*0bdce486SRichard Henderson      * From v8, it is CONSTRAINED UNPREDICTABLE whether BXWritePC aligns
43*0bdce486SRichard Henderson      * the address or not.  If so, we can legitimately fall through.
44*0bdce486SRichard Henderson      */
45*0bdce486SRichard Henderson     return EXIT_SUCCESS;
46*0bdce486SRichard Henderson }
47