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 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 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