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