Browse Source
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>pull/202/head
committed by
Peter Maydell
4 changed files with 89 additions and 2 deletions
@ -0,0 +1,37 @@ |
|||
/* Test PC misalignment exception */ |
|||
|
|||
#include <assert.h> |
|||
#include <signal.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
|
|||
static void *expected; |
|||
|
|||
static void sigbus(int sig, siginfo_t *info, void *vuc) |
|||
{ |
|||
assert(info->si_code == BUS_ADRALN); |
|||
assert(info->si_addr == expected); |
|||
exit(EXIT_SUCCESS); |
|||
} |
|||
|
|||
int main() |
|||
{ |
|||
void *tmp; |
|||
|
|||
struct sigaction sa = { |
|||
.sa_sigaction = sigbus, |
|||
.sa_flags = SA_SIGINFO |
|||
}; |
|||
|
|||
if (sigaction(SIGBUS, &sa, NULL) < 0) { |
|||
perror("sigaction"); |
|||
return EXIT_FAILURE; |
|||
} |
|||
|
|||
asm volatile("adr %0, 1f + 1\n\t" |
|||
"str %0, %1\n\t" |
|||
"br %0\n" |
|||
"1:" |
|||
: "=&r"(tmp), "=m"(expected)); |
|||
abort(); |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
/* Test PC misalignment exception */ |
|||
|
|||
#ifdef __thumb__ |
|||
#error "This test must be compiled for ARM" |
|||
#endif |
|||
|
|||
#include <assert.h> |
|||
#include <signal.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
|
|||
static void *expected; |
|||
|
|||
static void sigbus(int sig, siginfo_t *info, void *vuc) |
|||
{ |
|||
assert(info->si_code == BUS_ADRALN); |
|||
assert(info->si_addr == expected); |
|||
exit(EXIT_SUCCESS); |
|||
} |
|||
|
|||
int main() |
|||
{ |
|||
void *tmp; |
|||
|
|||
struct sigaction sa = { |
|||
.sa_sigaction = sigbus, |
|||
.sa_flags = SA_SIGINFO |
|||
}; |
|||
|
|||
if (sigaction(SIGBUS, &sa, NULL) < 0) { |
|||
perror("sigaction"); |
|||
return EXIT_FAILURE; |
|||
} |
|||
|
|||
asm volatile("adr %0, 1f + 2\n\t" |
|||
"str %0, %1\n\t" |
|||
"bx %0\n" |
|||
"1:" |
|||
: "=&r"(tmp), "=m"(expected)); |
|||
|
|||
/*
|
|||
* From v8, it is CONSTRAINED UNPREDICTABLE whether BXWritePC aligns |
|||
* the address or not. If so, we can legitimately fall through. |
|||
*/ |
|||
return EXIT_SUCCESS; |
|||
} |
|||
Loading…
Reference in new issue