|
40 | 40 | # ifndef HAVE_ANDROID |
41 | 41 | # include <unwind.h> |
42 | 42 | # endif |
| 43 | +# ifndef __NR_clone3 |
| 44 | +# define __NR_clone3 435 |
| 45 | +# endif |
43 | 46 | #endif |
44 | 47 |
|
45 | 48 | #define GUM_CODE_SLAB_SIZE_INITIAL (128 * 1024) |
@@ -5041,23 +5044,27 @@ gum_exec_block_virtualize_linux_syscall (GumExecBlock * block, |
5041 | 5044 | { |
5042 | 5045 | GumX86Writer * cw = gc->code_writer; |
5043 | 5046 | const cs_insn * insn = gc->instruction->ci; |
5044 | | - gconstpointer perform_regular_syscall = cw->code + 1; |
5045 | | - gconstpointer perform_next_instruction = cw->code + 2; |
| 5047 | + gconstpointer perform_clone_syscall = cw->code + 1; |
| 5048 | + gconstpointer perform_regular_syscall = cw->code + 2; |
| 5049 | + gconstpointer perform_next_instruction = cw->code + 3; |
5046 | 5050 |
|
5047 | 5051 | gum_x86_relocator_skip_one (gc->relocator); |
5048 | 5052 |
|
5049 | 5053 | if (gc->opened_prolog != GUM_PROLOG_NONE) |
5050 | 5054 | gum_exec_block_close_prolog (block, gc, cw); |
5051 | 5055 |
|
5052 | | - /* Save state */ |
5053 | 5056 | gum_x86_writer_put_lea_reg_reg_offset (cw, GUM_REG_XSP, |
5054 | 5057 | GUM_REG_XSP, -GUM_RED_ZONE_SIZE); |
5055 | 5058 | gum_x86_writer_put_pushfx (cw); |
5056 | 5059 |
|
5057 | | - /* See if the syscall is clone */ |
5058 | 5060 | gum_x86_writer_put_cmp_reg_i32 (cw, GUM_REG_XAX, __NR_clone); |
| 5061 | + gum_x86_writer_put_jcc_near_label (cw, X86_INS_JE, perform_clone_syscall, |
| 5062 | + GUM_NO_HINT); |
| 5063 | + gum_x86_writer_put_cmp_reg_i32 (cw, GUM_REG_XAX, __NR_clone3); |
5059 | 5064 | gum_x86_writer_put_jcc_near_label (cw, X86_INS_JNE, perform_regular_syscall, |
5060 | | - GUM_UNLIKELY); |
| 5065 | + GUM_NO_HINT); |
| 5066 | + |
| 5067 | + gum_x86_writer_put_label (cw, perform_clone_syscall); |
5061 | 5068 |
|
5062 | 5069 | /* |
5063 | 5070 | * Store the return address. Note that we cannot use the stack to store this |
@@ -5100,16 +5107,14 @@ gum_exec_block_virtualize_linux_syscall (GumExecBlock * block, |
5100 | 5107 | g_assert_not_reached (); |
5101 | 5108 | } |
5102 | 5109 |
|
5103 | | - gum_x86_writer_put_jmp_near_label (cw, perform_next_instruction); |
| 5110 | + gum_x86_writer_put_jmp_short_label (cw, perform_next_instruction); |
5104 | 5111 |
|
5105 | 5112 | gum_x86_writer_put_label (cw, perform_regular_syscall); |
5106 | 5113 |
|
5107 | | - /* Restore state */ |
5108 | 5114 | gum_x86_writer_put_popfx (cw); |
5109 | 5115 | gum_x86_writer_put_lea_reg_reg_offset (cw, GUM_REG_XSP, |
5110 | 5116 | GUM_REG_XSP, GUM_RED_ZONE_SIZE); |
5111 | 5117 |
|
5112 | | - /* Original syscall instruction */ |
5113 | 5118 | gum_x86_writer_put_bytes (cw, insn->bytes, insn->size); |
5114 | 5119 |
|
5115 | 5120 | gum_x86_writer_put_label (cw, perform_next_instruction); |
|
0 commit comments