void gum_arm_writer_free (GumArmWriter * writer) { gum_arm_writer_flush (writer); gum_array_free (writer->u32_refs, TRUE); }
static void gum_insert_deflector (gpointer cave, GumInsertDeflectorContext * ctx) { # if defined (HAVE_ARM) GumCodeDeflectorDispatcher * dispatcher = ctx->dispatcher; GumThumbWriter tw; if (ctx->dedicated_target != NULL) { gboolean owner_is_arm; owner_is_arm = (GPOINTER_TO_SIZE (ctx->return_address) & 1) == 0; if (owner_is_arm) { GumArmWriter aw; gum_arm_writer_init (&aw, cave); aw.pc = ctx->pc; gum_arm_writer_put_ldr_reg_address (&aw, ARM_REG_PC, GUM_ADDRESS (ctx->dedicated_target)); gum_arm_writer_flush (&aw); g_assert (gum_arm_writer_offset (&aw) <= ctx->max_size); gum_arm_writer_clear (&aw); dispatcher->trampoline = GSIZE_TO_POINTER (ctx->pc); return; } gum_thumb_writer_init (&tw, cave); tw.pc = ctx->pc; gum_thumb_writer_put_ldr_reg_address (&tw, ARM_REG_PC, GUM_ADDRESS (ctx->dedicated_target)); } else { gum_thumb_writer_init (&tw, cave); tw.pc = ctx->pc; gum_thumb_writer_put_ldr_reg_address (&tw, ARM_REG_PC, GUM_ADDRESS (dispatcher->thunk) + 1); } gum_thumb_writer_flush (&tw); g_assert (gum_thumb_writer_offset (&tw) <= ctx->max_size); gum_thumb_writer_clear (&tw); dispatcher->trampoline = GSIZE_TO_POINTER (ctx->pc + 1); # elif defined (HAVE_ARM64) GumCodeDeflectorDispatcher * dispatcher = ctx->dispatcher; GumArm64Writer aw; gum_arm64_writer_init (&aw, cave); aw.pc = ctx->pc; if (ctx->dedicated_target != NULL) { gum_arm64_writer_put_push_reg_reg (&aw, ARM64_REG_X0, ARM64_REG_LR); gum_arm64_writer_put_ldr_reg_address (&aw, ARM64_REG_X0, GUM_ADDRESS (ctx->dedicated_target)); gum_arm64_writer_put_br_reg (&aw, ARM64_REG_X0); } else { gum_arm64_writer_put_ldr_reg_address (&aw, ARM64_REG_X0, GUM_ADDRESS (dispatcher->thunk)); gum_arm64_writer_put_br_reg (&aw, ARM64_REG_X0); } gum_arm64_writer_flush (&aw); g_assert (gum_arm64_writer_offset (&aw) <= ctx->max_size); gum_arm64_writer_clear (&aw); dispatcher->trampoline = GSIZE_TO_POINTER (ctx->pc); # else (void) gum_code_deflector_dispatcher_lookup; # endif }