xref: /openbmc/qemu/tests/tcg/s390x/noexec.c (revision b34b42f1b6a33c455dccce6ceb49962dddbb7a8a)
1*ab12c95dSIlya Leoshkevich #include "../multiarch/noexec.c.inc"
2*ab12c95dSIlya Leoshkevich 
arch_mcontext_pc(const mcontext_t * ctx)3*ab12c95dSIlya Leoshkevich static void *arch_mcontext_pc(const mcontext_t *ctx)
4*ab12c95dSIlya Leoshkevich {
5*ab12c95dSIlya Leoshkevich     return (void *)ctx->psw.addr;
6*ab12c95dSIlya Leoshkevich }
7*ab12c95dSIlya Leoshkevich 
arch_mcontext_arg(const mcontext_t * ctx)8*ab12c95dSIlya Leoshkevich static int arch_mcontext_arg(const mcontext_t *ctx)
9*ab12c95dSIlya Leoshkevich {
10*ab12c95dSIlya Leoshkevich     return ctx->gregs[2];
11*ab12c95dSIlya Leoshkevich }
12*ab12c95dSIlya Leoshkevich 
arch_flush(void * p,int len)13*ab12c95dSIlya Leoshkevich static void arch_flush(void *p, int len)
14*ab12c95dSIlya Leoshkevich {
15*ab12c95dSIlya Leoshkevich }
16*ab12c95dSIlya Leoshkevich 
17*ab12c95dSIlya Leoshkevich extern char noexec_1[];
18*ab12c95dSIlya Leoshkevich extern char noexec_2[];
19*ab12c95dSIlya Leoshkevich extern char noexec_end[];
20*ab12c95dSIlya Leoshkevich 
21*ab12c95dSIlya Leoshkevich asm("noexec_1:\n"
22*ab12c95dSIlya Leoshkevich     "   lgfi %r2,1\n"       /* %r2 is 0 on entry, set 1. */
23*ab12c95dSIlya Leoshkevich     "noexec_2:\n"
24*ab12c95dSIlya Leoshkevich     "   lgfi %r2,2\n"       /* %r2 is 0/1; set 2. */
25*ab12c95dSIlya Leoshkevich     "   br %r14\n"          /* return */
26*ab12c95dSIlya Leoshkevich     "noexec_end:");
27*ab12c95dSIlya Leoshkevich 
28*ab12c95dSIlya Leoshkevich extern char exrl_1[];
29*ab12c95dSIlya Leoshkevich extern char exrl_2[];
30*ab12c95dSIlya Leoshkevich extern char exrl_end[];
31*ab12c95dSIlya Leoshkevich 
32*ab12c95dSIlya Leoshkevich asm("exrl_1:\n"
33*ab12c95dSIlya Leoshkevich     "   exrl %r0, exrl_2\n"
34*ab12c95dSIlya Leoshkevich     "   br %r14\n"
35*ab12c95dSIlya Leoshkevich     "exrl_2:\n"
36*ab12c95dSIlya Leoshkevich     "   lgfi %r2,2\n"
37*ab12c95dSIlya Leoshkevich     "exrl_end:");
38*ab12c95dSIlya Leoshkevich 
main(void)39*ab12c95dSIlya Leoshkevich int main(void)
40*ab12c95dSIlya Leoshkevich {
41*ab12c95dSIlya Leoshkevich     struct noexec_test noexec_tests[] = {
42*ab12c95dSIlya Leoshkevich         {
43*ab12c95dSIlya Leoshkevich             .name = "fallthrough",
44*ab12c95dSIlya Leoshkevich             .test_code = noexec_1,
45*ab12c95dSIlya Leoshkevich             .test_len = noexec_end - noexec_1,
46*ab12c95dSIlya Leoshkevich             .page_ofs = noexec_1 - noexec_2,
47*ab12c95dSIlya Leoshkevich             .entry_ofs = noexec_1 - noexec_2,
48*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
49*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = 0,
50*ab12c95dSIlya Leoshkevich             .expected_arg = 1,
51*ab12c95dSIlya Leoshkevich         },
52*ab12c95dSIlya Leoshkevich         {
53*ab12c95dSIlya Leoshkevich             .name = "jump",
54*ab12c95dSIlya Leoshkevich             .test_code = noexec_1,
55*ab12c95dSIlya Leoshkevich             .test_len = noexec_end - noexec_1,
56*ab12c95dSIlya Leoshkevich             .page_ofs = noexec_1 - noexec_2,
57*ab12c95dSIlya Leoshkevich             .entry_ofs = 0,
58*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
59*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = 0,
60*ab12c95dSIlya Leoshkevich             .expected_arg = 0,
61*ab12c95dSIlya Leoshkevich         },
62*ab12c95dSIlya Leoshkevich         {
63*ab12c95dSIlya Leoshkevich             .name = "exrl",
64*ab12c95dSIlya Leoshkevich             .test_code = exrl_1,
65*ab12c95dSIlya Leoshkevich             .test_len = exrl_end - exrl_1,
66*ab12c95dSIlya Leoshkevich             .page_ofs = exrl_1 - exrl_2,
67*ab12c95dSIlya Leoshkevich             .entry_ofs = exrl_1 - exrl_2,
68*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
69*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = exrl_1 - exrl_2,
70*ab12c95dSIlya Leoshkevich             .expected_arg = 0,
71*ab12c95dSIlya Leoshkevich         },
72*ab12c95dSIlya Leoshkevich         {
73*ab12c95dSIlya Leoshkevich             .name = "fallthrough [cross]",
74*ab12c95dSIlya Leoshkevich             .test_code = noexec_1,
75*ab12c95dSIlya Leoshkevich             .test_len = noexec_end - noexec_1,
76*ab12c95dSIlya Leoshkevich             .page_ofs = noexec_1 - noexec_2 - 2,
77*ab12c95dSIlya Leoshkevich             .entry_ofs = noexec_1 - noexec_2 - 2,
78*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
79*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = -2,
80*ab12c95dSIlya Leoshkevich             .expected_arg = 1,
81*ab12c95dSIlya Leoshkevich         },
82*ab12c95dSIlya Leoshkevich         {
83*ab12c95dSIlya Leoshkevich             .name = "jump [cross]",
84*ab12c95dSIlya Leoshkevich             .test_code = noexec_1,
85*ab12c95dSIlya Leoshkevich             .test_len = noexec_end - noexec_1,
86*ab12c95dSIlya Leoshkevich             .page_ofs = noexec_1 - noexec_2 - 2,
87*ab12c95dSIlya Leoshkevich             .entry_ofs = -2,
88*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
89*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = -2,
90*ab12c95dSIlya Leoshkevich             .expected_arg = 0,
91*ab12c95dSIlya Leoshkevich         },
92*ab12c95dSIlya Leoshkevich         {
93*ab12c95dSIlya Leoshkevich             .name = "exrl [cross]",
94*ab12c95dSIlya Leoshkevich             .test_code = exrl_1,
95*ab12c95dSIlya Leoshkevich             .test_len = exrl_end - exrl_1,
96*ab12c95dSIlya Leoshkevich             .page_ofs = exrl_1 - exrl_2 - 2,
97*ab12c95dSIlya Leoshkevich             .entry_ofs = exrl_1 - exrl_2 - 2,
98*ab12c95dSIlya Leoshkevich             .expected_si_ofs = 0,
99*ab12c95dSIlya Leoshkevich             .expected_pc_ofs = exrl_1 - exrl_2 - 2,
100*ab12c95dSIlya Leoshkevich             .expected_arg = 0,
101*ab12c95dSIlya Leoshkevich         },
102*ab12c95dSIlya Leoshkevich     };
103*ab12c95dSIlya Leoshkevich 
104*ab12c95dSIlya Leoshkevich     return test_noexec(noexec_tests,
105*ab12c95dSIlya Leoshkevich                        sizeof(noexec_tests) / sizeof(noexec_tests[0]));
106*ab12c95dSIlya Leoshkevich }
107