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