1*95093668SIlya Leoshkevich #include "../multiarch/noexec.c.inc"
2*95093668SIlya Leoshkevich
arch_mcontext_pc(const mcontext_t * ctx)3*95093668SIlya Leoshkevich static void *arch_mcontext_pc(const mcontext_t *ctx)
4*95093668SIlya Leoshkevich {
5*95093668SIlya Leoshkevich return (void *)ctx->gregs[REG_RIP];
6*95093668SIlya Leoshkevich }
7*95093668SIlya Leoshkevich
arch_mcontext_arg(const mcontext_t * ctx)8*95093668SIlya Leoshkevich int arch_mcontext_arg(const mcontext_t *ctx)
9*95093668SIlya Leoshkevich {
10*95093668SIlya Leoshkevich return ctx->gregs[REG_RDI];
11*95093668SIlya Leoshkevich }
12*95093668SIlya Leoshkevich
arch_flush(void * p,int len)13*95093668SIlya Leoshkevich static void arch_flush(void *p, int len)
14*95093668SIlya Leoshkevich {
15*95093668SIlya Leoshkevich }
16*95093668SIlya Leoshkevich
17*95093668SIlya Leoshkevich extern char noexec_1[];
18*95093668SIlya Leoshkevich extern char noexec_2[];
19*95093668SIlya Leoshkevich extern char noexec_end[];
20*95093668SIlya Leoshkevich
21*95093668SIlya Leoshkevich asm("noexec_1:\n"
22*95093668SIlya Leoshkevich " movq $1,%rdi\n" /* %rdi is 0 on entry, set 1. */
23*95093668SIlya Leoshkevich "noexec_2:\n"
24*95093668SIlya Leoshkevich " movq $2,%rdi\n" /* %rdi is 0/1; set 2. */
25*95093668SIlya Leoshkevich " ret\n"
26*95093668SIlya Leoshkevich "noexec_end:");
27*95093668SIlya Leoshkevich
main(void)28*95093668SIlya Leoshkevich int main(void)
29*95093668SIlya Leoshkevich {
30*95093668SIlya Leoshkevich struct noexec_test noexec_tests[] = {
31*95093668SIlya Leoshkevich {
32*95093668SIlya Leoshkevich .name = "fallthrough",
33*95093668SIlya Leoshkevich .test_code = noexec_1,
34*95093668SIlya Leoshkevich .test_len = noexec_end - noexec_1,
35*95093668SIlya Leoshkevich .page_ofs = noexec_1 - noexec_2,
36*95093668SIlya Leoshkevich .entry_ofs = noexec_1 - noexec_2,
37*95093668SIlya Leoshkevich .expected_si_ofs = 0,
38*95093668SIlya Leoshkevich .expected_pc_ofs = 0,
39*95093668SIlya Leoshkevich .expected_arg = 1,
40*95093668SIlya Leoshkevich },
41*95093668SIlya Leoshkevich {
42*95093668SIlya Leoshkevich .name = "jump",
43*95093668SIlya Leoshkevich .test_code = noexec_1,
44*95093668SIlya Leoshkevich .test_len = noexec_end - noexec_1,
45*95093668SIlya Leoshkevich .page_ofs = noexec_1 - noexec_2,
46*95093668SIlya Leoshkevich .entry_ofs = 0,
47*95093668SIlya Leoshkevich .expected_si_ofs = 0,
48*95093668SIlya Leoshkevich .expected_pc_ofs = 0,
49*95093668SIlya Leoshkevich .expected_arg = 0,
50*95093668SIlya Leoshkevich },
51*95093668SIlya Leoshkevich {
52*95093668SIlya Leoshkevich .name = "fallthrough [cross]",
53*95093668SIlya Leoshkevich .test_code = noexec_1,
54*95093668SIlya Leoshkevich .test_len = noexec_end - noexec_1,
55*95093668SIlya Leoshkevich .page_ofs = noexec_1 - noexec_2 - 2,
56*95093668SIlya Leoshkevich .entry_ofs = noexec_1 - noexec_2 - 2,
57*95093668SIlya Leoshkevich .expected_si_ofs = 0,
58*95093668SIlya Leoshkevich .expected_pc_ofs = -2,
59*95093668SIlya Leoshkevich .expected_arg = 1,
60*95093668SIlya Leoshkevich },
61*95093668SIlya Leoshkevich {
62*95093668SIlya Leoshkevich .name = "jump [cross]",
63*95093668SIlya Leoshkevich .test_code = noexec_1,
64*95093668SIlya Leoshkevich .test_len = noexec_end - noexec_1,
65*95093668SIlya Leoshkevich .page_ofs = noexec_1 - noexec_2 - 2,
66*95093668SIlya Leoshkevich .entry_ofs = -2,
67*95093668SIlya Leoshkevich .expected_si_ofs = 0,
68*95093668SIlya Leoshkevich .expected_pc_ofs = -2,
69*95093668SIlya Leoshkevich .expected_arg = 0,
70*95093668SIlya Leoshkevich },
71*95093668SIlya Leoshkevich };
72*95093668SIlya Leoshkevich
73*95093668SIlya Leoshkevich return test_noexec(noexec_tests,
74*95093668SIlya Leoshkevich sizeof(noexec_tests) / sizeof(noexec_tests[0]));
75*95093668SIlya Leoshkevich }
76