xref: /qemu/tests/tcg/aarch64/bti-3.c (revision 0b2d8bd6)
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() \
14cda86e2bSRichard Henderson     asm("mov %0,#1; adr x16, 1f; br x16; 1: hint #25; mov %0,#0" \
15cda86e2bSRichard Henderson         : "=r"(skipped) : : "x16", "x30")
16cda86e2bSRichard Henderson 
17cda86e2bSRichard Henderson #define BTYPE_2() \
18cda86e2bSRichard Henderson     asm("mov %0,#1; adr x16, 1f; blr x16; 1: hint #25; mov %0,#0" \
19cda86e2bSRichard Henderson         : "=r"(skipped) : : "x16", "x30")
20cda86e2bSRichard Henderson 
21cda86e2bSRichard Henderson #define BTYPE_3() \
22cda86e2bSRichard Henderson     asm("mov %0,#1; adr x15, 1f; br x15; 1: hint #25; mov %0,#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