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