xref: /openbmc/qemu/tests/tcg/x86_64/noexec.c (revision b34b42f1b6a33c455dccce6ceb49962dddbb7a8a)
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