X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-amd64.c;h=365b0ae81630cb6ef7d753bb016931ba1d2bcaf6;hb=HEAD;hp=2e00450da1bcfa18985b8faeef53033bbdd3ff56;hpb=580ccb1ffb8e5c2e3fa0555e342d916764f42930;p=mono.git diff --git a/mono/mini/tramp-amd64.c b/mono/mini/tramp-amd64.c index 2e00450da1b..365b0ae8163 100644 --- a/mono/mini/tramp-amd64.c +++ b/mono/mini/tramp-amd64.c @@ -30,6 +30,10 @@ #include "mini-amd64.h" #include "debugger-agent.h" +#ifdef ENABLE_INTERPRETER +#include "interp/interp.h" +#endif + #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) #define IS_REX(inst) (((inst) >= 0x40) && ((inst) <= 0x4f)) @@ -67,7 +71,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_TRAMPOLINE_UNWINDINFO_SIZE(0))); mono_arch_flush_icache (start, code - start); - mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m); + MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m)); mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, unwind_ops), domain); @@ -77,10 +81,10 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) /* * mono_arch_get_static_rgctx_trampoline: * - * Create a trampoline which sets RGCTX_REG to MRGCTX, then jumps to ADDR. + * Create a trampoline which sets RGCTX_REG to ARG, then jumps to ADDR. */ gpointer -mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) +mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr) { guint8 *code, *start; GSList *unwind_ops; @@ -102,13 +106,13 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo unwind_ops = mono_arch_get_cie_program (); - amd64_mov_reg_imm (code, MONO_ARCH_RGCTX_REG, mrgctx); + amd64_mov_reg_imm (code, MONO_ARCH_RGCTX_REG, arg); amd64_jump_code (code, addr); g_assert ((code - start) < buf_len); g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_TRAMPOLINE_UNWINDINFO_SIZE(0))); mono_arch_flush_icache (start, code - start); - mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, unwind_ops), domain); @@ -140,6 +144,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) if (((code [-13] == 0x49) && (code [-12] == 0xbb)) || (code [-5] == 0xe8)) { if (code [-5] != 0xe8) { if (can_write) { + g_assert ((guint64)(orig_code - 11) % 8 == 0); InterlockedExchangePointer ((gpointer*)(orig_code - 11), addr); VALGRIND_DISCARD_TRANSLATIONS (orig_code - 11, sizeof (gpointer)); } @@ -158,7 +163,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) addr = thunk_start; g_assert ((((guint64)(addr)) >> 32) == 0); mono_arch_flush_icache (thunk_start, thunk_code - thunk_start); - mono_profiler_code_buffer_new (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); } if (can_write) { InterlockedExchange ((gint32*)(orig_code - 4), ((gint64)addr - (gint64)orig_code)); @@ -193,7 +198,7 @@ mono_arch_create_llvm_native_thunk (MonoDomain *domain, guint8 *addr) *(guint64*)thunk_code = (guint64)addr; addr = thunk_start; mono_arch_flush_icache (thunk_start, thunk_code - thunk_start); - mono_profiler_code_buffer_new (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); return addr; } #endif /* !DISABLE_JIT */ @@ -235,7 +240,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf MonoJumpInfo *ji = NULL; const guint kMaxCodeSize = 630; - if (tramp_type == MONO_TRAMPOLINE_JUMP || tramp_type == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) + if (tramp_type == MONO_TRAMPOLINE_JUMP) has_caller = FALSE; else has_caller = TRUE; @@ -375,43 +380,38 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf mono_amd64_patch (br [0], code); //amd64_breakpoint (code); - if (tramp_type != MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) { - /* Obtain the trampoline argument which is encoded in the instruction stream */ - if (aot) { - /* Load the GOT offset */ - amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, tramp_offset, sizeof(gpointer)); - /* - * r11 points to a call *(%rip) instruction, load the - * pc-relative offset from the instruction itself. - */ - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 3, 4); - /* 7 is the length of the call, 8 is the offset to the next got slot */ - amd64_alu_reg_imm_size (code, X86_ADD, AMD64_RAX, 7 + sizeof (gpointer), sizeof(gpointer)); - /* Compute the address of the GOT slot */ - amd64_alu_reg_reg_size (code, X86_ADD, AMD64_R11, AMD64_RAX, sizeof(gpointer)); - /* Load the value */ - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0, sizeof(gpointer)); - } else { - amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, tramp_offset, sizeof(gpointer)); - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 5, 1); - amd64_widen_reg (code, AMD64_RAX, AMD64_RAX, TRUE, FALSE); - amd64_alu_reg_imm_size (code, X86_CMP, AMD64_RAX, 4, 1); - br [0] = code; - x86_branch8 (code, X86_CC_NE, 6, FALSE); - /* 32 bit immediate */ - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 6, 4); - br [1] = code; - x86_jump8 (code, 10); - /* 64 bit immediate */ - mono_amd64_patch (br [0], code); - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 6, 8); - mono_amd64_patch (br [1], code); - } - amd64_mov_membase_reg (code, AMD64_RBP, arg_offset, AMD64_R11, sizeof(gpointer)); + /* Obtain the trampoline argument which is encoded in the instruction stream */ + if (aot) { + /* Load the GOT offset */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, tramp_offset, sizeof(gpointer)); + /* + * r11 points to a call *(%rip) instruction, load the + * pc-relative offset from the instruction itself. + */ + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 3, 4); + /* 7 is the length of the call, 8 is the offset to the next got slot */ + amd64_alu_reg_imm_size (code, X86_ADD, AMD64_RAX, 7 + sizeof (gpointer), sizeof(gpointer)); + /* Compute the address of the GOT slot */ + amd64_alu_reg_reg_size (code, X86_ADD, AMD64_R11, AMD64_RAX, sizeof(gpointer)); + /* Load the value */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0, sizeof(gpointer)); } else { - amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, saved_regs_offset + (MONO_AMD64_ARG_REG1 * sizeof(mgreg_t)), sizeof(mgreg_t)); - amd64_mov_membase_reg (code, AMD64_RBP, arg_offset, AMD64_R11, sizeof(gpointer)); + amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, tramp_offset, sizeof(gpointer)); + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 5, 1); + amd64_widen_reg (code, AMD64_RAX, AMD64_RAX, TRUE, FALSE); + amd64_alu_reg_imm_size (code, X86_CMP, AMD64_RAX, 4, 1); + br [0] = code; + x86_branch8 (code, X86_CC_NE, 6, FALSE); + /* 32 bit immediate */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 6, 4); + br [1] = code; + x86_jump8 (code, 10); + /* 64 bit immediate */ + mono_amd64_patch (br [0], code); + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 6, 8); + mono_amd64_patch (br [1], code); } + amd64_mov_membase_reg (code, AMD64_RBP, arg_offset, AMD64_R11, sizeof(gpointer)); /* Save LMF begin */ @@ -570,7 +570,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_MAX_TRAMPOLINE_UNWINDINFO_SIZE)); mono_arch_flush_icache (buf, code - buf); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); tramp_name = mono_get_generic_trampoline_name (tramp_type); *info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops); @@ -627,7 +627,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty *code_len = size; mono_arch_flush_icache (buf, size); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)); + MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type))); return buf; } @@ -706,8 +706,10 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info g_free (rgctx_null_jumps); - /* move the rgctx pointer to the VTABLE register */ - amd64_mov_reg_reg (code, MONO_ARCH_VTABLE_REG, AMD64_ARG_REG1, sizeof(gpointer)); + if (MONO_ARCH_VTABLE_REG != AMD64_ARG_REG1) { + /* move the rgctx pointer to the VTABLE register */ + amd64_mov_reg_reg (code, MONO_ARCH_VTABLE_REG, AMD64_ARG_REG1, sizeof(gpointer)); + } if (aot) { code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("specific_trampoline_lazy_fetch_%u", slot)); @@ -720,7 +722,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info } mono_arch_flush_icache (buf, code - buf); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); g_assert (code - buf <= tramp_size); g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_TRAMPOLINE_UNWINDINFO_SIZE(0))); @@ -757,7 +759,7 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo amd64_jump_reg (code, AMD64_R11); mono_arch_flush_icache (buf, code - buf); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); g_assert (code - buf <= tramp_size); g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_TRAMPOLINE_UNWINDINFO_SIZE(0))); @@ -782,85 +784,6 @@ mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) } #endif /* !DISABLE_JIT */ -gpointer -mono_amd64_handler_block_trampoline_helper (void) -{ - MonoJitTlsData *jit_tls = (MonoJitTlsData *)mono_tls_get_jit_tls (); - return jit_tls->handler_block_return_address; -} - -#ifndef DISABLE_JIT -gpointer -mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) -{ - guint8 *code, *buf; - int tramp_size = 64; - MonoJumpInfo *ji = NULL; - GSList *unwind_ops; - - code = buf = (guint8 *)mono_global_codeman_reserve (tramp_size + MONO_TRAMPOLINE_UNWINDINFO_SIZE(0)); - - unwind_ops = mono_arch_get_cie_program (); - - /* - * This trampoline restore the call chain of the handler block then jumps into the code that deals with it. - * We get here from the ret emitted by CEE_ENDFINALLY. - * The stack is misaligned. - */ - /* Align the stack before the call to mono_amd64_handler_block_trampoline_helper() */ -#ifdef TARGET_WIN32 - /* Also make room for the "register parameter stack area" as specified by the Windows x64 ABI (4 64-bit registers) */ - amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 8 + 4 * 8); -#else - amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 8); -#endif - if (aot) { - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_amd64_handler_block_trampoline_helper"); - amd64_call_reg (code, AMD64_R11); - } else { - amd64_mov_reg_imm (code, AMD64_RAX, mono_amd64_handler_block_trampoline_helper); - amd64_call_reg (code, AMD64_RAX); - } - /* Undo stack alignment */ -#ifdef TARGET_WIN32 - amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 8 + 4 * 8); -#else - amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 8); -#endif - /* Save the result to the stack */ - amd64_push_reg (code, AMD64_RAX); -#ifdef TARGET_WIN32 - /* Make room for the "register parameter stack area" as specified by the Windows x64 ABI (4 64-bit registers) */ - amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 4 * 8); -#endif - if (aot) { - char *name = g_strdup_printf ("trampoline_func_%d", MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD); - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, name); - amd64_mov_reg_reg (code, AMD64_RAX, AMD64_R11, 8); - } else { - amd64_mov_reg_imm (code, AMD64_RAX, mono_get_trampoline_func (MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD)); - } - /* The stack is aligned */ - amd64_call_reg (code, AMD64_RAX); -#ifdef TARGET_WIN32 - amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 4 * 8); -#endif - /* Load return address */ - amd64_pop_reg (code, AMD64_RAX); - /* The stack is misaligned, thats what the code we branch to expects */ - amd64_jump_reg (code, AMD64_RAX); - - mono_arch_flush_icache (buf, code - buf); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); - g_assert (code - buf <= tramp_size); - g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_TRAMPOLINE_UNWINDINFO_SIZE(0))); - - *info = mono_tramp_info_create ("handler_block_trampoline", buf, code - buf, ji, unwind_ops); - - return buf; -} -#endif /* !DISABLE_JIT */ - /* * mono_arch_get_call_target: * @@ -988,7 +911,7 @@ mono_arch_create_sdb_trampoline (gboolean single_step, MonoTrampInfo **info, gbo amd64_ret (code); mono_arch_flush_icache (code, code - buf); - mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); g_assert (code - buf <= tramp_size); g_assert_checked (mono_arch_unwindinfo_validate_size (unwind_ops, MONO_MAX_TRAMPOLINE_UNWINDINFO_SIZE)); @@ -1001,23 +924,26 @@ mono_arch_create_sdb_trampoline (gboolean single_step, MonoTrampInfo **info, gbo /* * mono_arch_get_enter_icall_trampoline: * - * A trampoline that handles the transition from interpreter into native world. - * It requiers to set up a descriptor (MethodArguments) that describes the - * required arguments passed to the callee. + * A trampoline that handles the transition from interpreter into native + * world. It requiers to set up a descriptor (InterpMethodArguments), so the + * trampoline can translate the arguments into the native calling convention. + * + * See also `build_args_from_sig ()` in interp.c. */ gpointer mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) { #ifdef ENABLE_INTERPRETER - const int gregs_num = 8; - const int fregs_num = 3; + const int gregs_num = INTERP_ICALL_TRAMP_IARGS; + const int fregs_num = INTERP_ICALL_TRAMP_FARGS; guint8 *start = NULL, *code, *label_gexits [gregs_num], *label_fexits [fregs_num], *label_leave_tramp [3], *label_is_float_ret; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; static int farg_regs[] = {AMD64_XMM0, AMD64_XMM1, AMD64_XMM2}; - int i, framesize = 0, off_rbp, off_methodargs, off_targetaddr; + int buf_len, i, framesize = 0, off_rbp, off_methodargs, off_targetaddr; - start = code = (guint8 *) mono_global_codeman_reserve (256 + MONO_TRAMPOLINE_UNWINDINFO_SIZE(0)); + buf_len = 512 + MONO_TRAMPOLINE_UNWINDINFO_SIZE(0); + start = code = (guint8 *) mono_global_codeman_reserve (buf_len); off_rbp = -framesize; @@ -1033,19 +959,19 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) amd64_mov_reg_reg (code, AMD64_RBP, AMD64_RSP, sizeof (mgreg_t)); amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, ALIGN_TO (framesize, MONO_ARCH_FRAME_ALIGNMENT)); - /* save MethodArguments* onto stack */ + /* save InterpMethodArguments* onto stack */ amd64_mov_membase_reg (code, AMD64_RBP, off_methodargs, AMD64_ARG_REG2, sizeof (mgreg_t)); /* save target address on stack */ amd64_mov_membase_reg (code, AMD64_RBP, off_targetaddr, AMD64_ARG_REG1, sizeof (mgreg_t)); - /* load pointer to MethodArguments* into R11 */ + /* load pointer to InterpMethodArguments* into R11 */ amd64_mov_reg_reg (code, AMD64_R11, AMD64_ARG_REG2, 8); - /* move flen into RAX */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 16, sizeof (mgreg_t)); - /* load pointer to fregs into R11 */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 24, sizeof (mgreg_t)); + /* move flen into RAX */ + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, flen), sizeof (mgreg_t)); + /* load pointer to fargs into R11 */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, fargs), sizeof (mgreg_t)); for (i = 0; i < fregs_num; ++i) { amd64_test_reg_reg (code, AMD64_RAX, AMD64_RAX); @@ -1056,14 +982,13 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) amd64_dec_reg_size (code, AMD64_RAX, 1); } - for (i = 0; i < fregs_num; i++) { + for (i = 0; i < fregs_num; i++) x86_patch (label_fexits [i], code); - } - /* load pointer to MethodArguments* into R11 */ + /* load pointer to InterpMethodArguments* into R11 */ amd64_mov_reg_reg (code, AMD64_R11, AMD64_ARG_REG2, sizeof (mgreg_t)); - /* move ilen into RAX */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 0, sizeof (mgreg_t)); + /* move ilen into RAX */ + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, ilen), sizeof (mgreg_t)); int stack_offset = 0; for (i = 0; i < gregs_num; i++) { @@ -1071,10 +996,10 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) label_gexits [i] = code; x86_branch32 (code, X86_CC_Z, 0, FALSE); - /* load pointer to MethodArguments* into R11 */ + /* load pointer to InterpMethodArguments* into R11 */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, off_methodargs, sizeof (mgreg_t)); - /* load pointer to iregs into R11 */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 8, sizeof (mgreg_t)); + /* load pointer to iargs into R11 */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, iargs), sizeof (mgreg_t)); if (i < PARAM_REGS) { amd64_mov_reg_membase (code, param_regs [i], AMD64_R11, i * sizeof (mgreg_t), sizeof (mgreg_t)); @@ -1086,9 +1011,8 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) amd64_dec_reg_size (code, AMD64_RAX, 1); } - for (i = 0; i < gregs_num; i++) { + for (i = 0; i < gregs_num; i++) x86_patch (label_gexits [i], code); - } /* load target addr */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, off_targetaddr, sizeof (mgreg_t)); @@ -1096,11 +1020,11 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) /* call into native function */ amd64_call_reg (code, AMD64_R11); - /* load MethodArguments */ + /* load InterpMethodArguments */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, off_methodargs, sizeof (mgreg_t)); - /* load is_float_ret */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0x28, sizeof (mgreg_t)); + /* load is_float_ret */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, is_float_ret), sizeof (mgreg_t)); /* check if a float return value is expected */ amd64_test_reg_reg (code, AMD64_R11, AMD64_R11); @@ -1108,13 +1032,11 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) label_is_float_ret = code; x86_branch8 (code, X86_CC_NZ, 0, FALSE); - - /* greg return */ - /* load MethodArguments */ + /* load InterpMethodArguments */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, off_methodargs, sizeof (mgreg_t)); - /* load retval */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0x20, sizeof (mgreg_t)); + /* load retval */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, retval), sizeof (mgreg_t)); amd64_test_reg_reg (code, AMD64_R11, AMD64_R11); label_leave_tramp [0] = code; @@ -1125,14 +1047,12 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) label_leave_tramp [1] = code; x86_jump8 (code, 0); - - /* freg return */ x86_patch (label_is_float_ret, code); - /* load MethodArguments */ + /* load InterpMethodArguments */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, off_methodargs, sizeof (mgreg_t)); - /* load retval */ // TODO: struct offset - amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0x20, sizeof (mgreg_t)); + /* load retval */ + amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (InterpMethodArguments, retval), sizeof (mgreg_t)); amd64_test_reg_reg (code, AMD64_R11, AMD64_R11); label_leave_tramp [2] = code; @@ -1147,8 +1067,10 @@ mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) amd64_pop_reg (code, AMD64_RBP); amd64_ret (code); + g_assert (code - start < buf_len); + mono_arch_flush_icache (start, code - start); - mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL)); if (info) *info = mono_tramp_info_create ("enter_icall_trampoline", start, code - start, ji, unwind_ops); @@ -1170,7 +1092,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) } gpointer -mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) +mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr) { g_assert_not_reached (); return NULL; @@ -1204,13 +1126,6 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo return NULL; } -gpointer -mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) -{ - g_assert_not_reached (); - return NULL; -} - void mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) {