xref: /qemu/tests/tcg/aarch64/pcalign-a64.c (revision 0bdce486)
1*0bdce486SRichard Henderson /* Test PC misalignment exception */
2*0bdce486SRichard Henderson 
3*0bdce486SRichard Henderson #include <assert.h>
4*0bdce486SRichard Henderson #include <signal.h>
5*0bdce486SRichard Henderson #include <stdlib.h>
6*0bdce486SRichard Henderson #include <stdio.h>
7*0bdce486SRichard Henderson 
8*0bdce486SRichard Henderson static void *expected;
9*0bdce486SRichard Henderson 
sigbus(int sig,siginfo_t * info,void * vuc)10*0bdce486SRichard Henderson static void sigbus(int sig, siginfo_t *info, void *vuc)
11*0bdce486SRichard Henderson {
12*0bdce486SRichard Henderson     assert(info->si_code == BUS_ADRALN);
13*0bdce486SRichard Henderson     assert(info->si_addr == expected);
14*0bdce486SRichard Henderson     exit(EXIT_SUCCESS);
15*0bdce486SRichard Henderson }
16*0bdce486SRichard Henderson 
main()17*0bdce486SRichard Henderson int main()
18*0bdce486SRichard Henderson {
19*0bdce486SRichard Henderson     void *tmp;
20*0bdce486SRichard Henderson 
21*0bdce486SRichard Henderson     struct sigaction sa = {
22*0bdce486SRichard Henderson         .sa_sigaction = sigbus,
23*0bdce486SRichard Henderson         .sa_flags = SA_SIGINFO
24*0bdce486SRichard Henderson     };
25*0bdce486SRichard Henderson 
26*0bdce486SRichard Henderson     if (sigaction(SIGBUS, &sa, NULL) < 0) {
27*0bdce486SRichard Henderson         perror("sigaction");
28*0bdce486SRichard Henderson         return EXIT_FAILURE;
29*0bdce486SRichard Henderson     }
30*0bdce486SRichard Henderson 
31*0bdce486SRichard Henderson     asm volatile("adr %0, 1f + 1\n\t"
32*0bdce486SRichard Henderson                  "str %0, %1\n\t"
33*0bdce486SRichard Henderson                  "br  %0\n"
34*0bdce486SRichard Henderson                  "1:"
35*0bdce486SRichard Henderson                  : "=&r"(tmp), "=m"(expected));
36*0bdce486SRichard Henderson     abort();
37*0bdce486SRichard Henderson }
38