1*ab12c95dSIlya Leoshkevich #include "../multiarch/noexec.c.inc" 2*ab12c95dSIlya Leoshkevich 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 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 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 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