xref: /qemu/tests/tcg/aarch64/bti-1.c (revision 0b2d8bd6)
11d9ac91bSRichard Henderson /*
21d9ac91bSRichard Henderson  * Branch target identification, basic notskip cases.
31d9ac91bSRichard Henderson  */
41d9ac91bSRichard Henderson 
50b2d8bd6SPhilippe Mathieu-Daudé #include "bti-crt.c.inc"
61d9ac91bSRichard Henderson 
skip2_sigill(int sig,siginfo_t * info,ucontext_t * uc)71d9ac91bSRichard Henderson static void skip2_sigill(int sig, siginfo_t *info, ucontext_t *uc)
81d9ac91bSRichard Henderson {
91d9ac91bSRichard Henderson     uc->uc_mcontext.pc += 8;
101d9ac91bSRichard Henderson     uc->uc_mcontext.pstate = 1;
111d9ac91bSRichard Henderson }
121d9ac91bSRichard Henderson 
131d9ac91bSRichard Henderson #define NOP       "nop"
141d9ac91bSRichard Henderson #define BTI_N     "hint #32"
151d9ac91bSRichard Henderson #define BTI_C     "hint #34"
161d9ac91bSRichard Henderson #define BTI_J     "hint #36"
171d9ac91bSRichard Henderson #define BTI_JC    "hint #38"
181d9ac91bSRichard Henderson 
191d9ac91bSRichard Henderson #define BTYPE_1(DEST) \
201d9ac91bSRichard Henderson     asm("mov %0,#1; adr x16, 1f; br x16; 1: " DEST "; mov %0,#0" \
211d9ac91bSRichard Henderson         : "=r"(skipped) : : "x16")
221d9ac91bSRichard Henderson 
231d9ac91bSRichard Henderson #define BTYPE_2(DEST) \
241d9ac91bSRichard Henderson     asm("mov %0,#1; adr x16, 1f; blr x16; 1: " DEST "; mov %0,#0" \
251d9ac91bSRichard Henderson         : "=r"(skipped) : : "x16", "x30")
261d9ac91bSRichard Henderson 
271d9ac91bSRichard Henderson #define BTYPE_3(DEST) \
281d9ac91bSRichard Henderson     asm("mov %0,#1; adr x15, 1f; br x15; 1: " DEST "; mov %0,#0" \
291d9ac91bSRichard Henderson         : "=r"(skipped) : : "x15")
301d9ac91bSRichard Henderson 
311d9ac91bSRichard Henderson #define TEST(WHICH, DEST, EXPECT) \
321d9ac91bSRichard Henderson     do { WHICH(DEST); fail += skipped ^ EXPECT; } while (0)
331d9ac91bSRichard Henderson 
341d9ac91bSRichard Henderson 
main()351d9ac91bSRichard Henderson int main()
361d9ac91bSRichard Henderson {
371d9ac91bSRichard Henderson     int fail = 0;
381d9ac91bSRichard Henderson     int skipped;
391d9ac91bSRichard Henderson 
401d9ac91bSRichard Henderson     /* Signal-like with SA_SIGINFO.  */
411d9ac91bSRichard Henderson     signal_info(SIGILL, skip2_sigill);
421d9ac91bSRichard Henderson 
431d9ac91bSRichard Henderson     TEST(BTYPE_1, NOP, 1);
441d9ac91bSRichard Henderson     TEST(BTYPE_1, BTI_N, 1);
451d9ac91bSRichard Henderson     TEST(BTYPE_1, BTI_C, 0);
461d9ac91bSRichard Henderson     TEST(BTYPE_1, BTI_J, 0);
471d9ac91bSRichard Henderson     TEST(BTYPE_1, BTI_JC, 0);
481d9ac91bSRichard Henderson 
491d9ac91bSRichard Henderson     TEST(BTYPE_2, NOP, 1);
501d9ac91bSRichard Henderson     TEST(BTYPE_2, BTI_N, 1);
511d9ac91bSRichard Henderson     TEST(BTYPE_2, BTI_C, 0);
521d9ac91bSRichard Henderson     TEST(BTYPE_2, BTI_J, 1);
531d9ac91bSRichard Henderson     TEST(BTYPE_2, BTI_JC, 0);
541d9ac91bSRichard Henderson 
551d9ac91bSRichard Henderson     TEST(BTYPE_3, NOP, 1);
561d9ac91bSRichard Henderson     TEST(BTYPE_3, BTI_N, 1);
571d9ac91bSRichard Henderson     TEST(BTYPE_3, BTI_C, 1);
581d9ac91bSRichard Henderson     TEST(BTYPE_3, BTI_J, 0);
591d9ac91bSRichard Henderson     TEST(BTYPE_3, BTI_JC, 0);
601d9ac91bSRichard Henderson 
611d9ac91bSRichard Henderson     return fail;
621d9ac91bSRichard Henderson }
63