1cda86e2bSRichard Henderson /*
2cda86e2bSRichard Henderson * BTI vs PACIASP
3cda86e2bSRichard Henderson */
4cda86e2bSRichard Henderson
50b2d8bd6SPhilippe Mathieu-Daudé #include "bti-crt.c.inc"
6cda86e2bSRichard Henderson
skip2_sigill(int sig,siginfo_t * info,ucontext_t * uc)7cda86e2bSRichard Henderson static void skip2_sigill(int sig, siginfo_t *info, ucontext_t *uc)
8cda86e2bSRichard Henderson {
9cda86e2bSRichard Henderson uc->uc_mcontext.pc += 8;
10cda86e2bSRichard Henderson uc->uc_mcontext.pstate = 1;
11cda86e2bSRichard Henderson }
12cda86e2bSRichard Henderson
13cda86e2bSRichard Henderson #define BTYPE_1() \
14*79e73b5dSAkihiko Odaki asm("mov %w0,#1; adr x16, 1f; br x16; 1: hint #25; mov %w0,#0" \
15cda86e2bSRichard Henderson : "=r"(skipped) : : "x16", "x30")
16cda86e2bSRichard Henderson
17cda86e2bSRichard Henderson #define BTYPE_2() \
18*79e73b5dSAkihiko Odaki asm("mov %w0,#1; adr x16, 1f; blr x16; 1: hint #25; mov %w0,#0" \
19cda86e2bSRichard Henderson : "=r"(skipped) : : "x16", "x30")
20cda86e2bSRichard Henderson
21cda86e2bSRichard Henderson #define BTYPE_3() \
22*79e73b5dSAkihiko Odaki asm("mov %w0,#1; adr x15, 1f; br x15; 1: hint #25; mov %w0,#0" \
23cda86e2bSRichard Henderson : "=r"(skipped) : : "x15", "x30")
24cda86e2bSRichard Henderson
25cda86e2bSRichard Henderson #define TEST(WHICH, EXPECT) \
26cda86e2bSRichard Henderson do { WHICH(); fail += skipped ^ EXPECT; } while (0)
27cda86e2bSRichard Henderson
main()28cda86e2bSRichard Henderson int main()
29cda86e2bSRichard Henderson {
30cda86e2bSRichard Henderson int fail = 0;
31cda86e2bSRichard Henderson int skipped;
32cda86e2bSRichard Henderson
33cda86e2bSRichard Henderson /* Signal-like with SA_SIGINFO. */
34cda86e2bSRichard Henderson signal_info(SIGILL, skip2_sigill);
35cda86e2bSRichard Henderson
36cda86e2bSRichard Henderson /* With SCTLR_EL1.BT0 set, PACIASP is not compatible with type=3. */
37cda86e2bSRichard Henderson TEST(BTYPE_1, 0);
38cda86e2bSRichard Henderson TEST(BTYPE_2, 0);
39cda86e2bSRichard Henderson TEST(BTYPE_3, 1);
40cda86e2bSRichard Henderson
41cda86e2bSRichard Henderson return fail;
42cda86e2bSRichard Henderson }
43