qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

noexec.c (1998B)


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