X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-ia64.c;h=8024cc0ca085cc8f31167ce48a92f9d5b189a6e3;hb=4b2d1f0edc6712006bfb66c1a19100664dc99edf;hp=f9975572474f39520aa991dfe316f060cecfe052;hpb=1fabd87b02f8d2e359150ed7a9e92613e60383bc;p=mono.git diff --git a/mono/mini/tramp-ia64.c b/mono/mini/tramp-ia64.c index f9975572474..8024cc0ca08 100644 --- a/mono/mini/tramp-ia64.c +++ b/mono/mini/tramp-ia64.c @@ -19,8 +19,6 @@ #include "mini.h" #include "mini-ia64.h" -#define NOT_IMPLEMENTED g_assert_not_reached () - #define GP_SCRATCH_REG 31 #define GP_SCRATCH_REG2 30 @@ -45,15 +43,10 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) /* FIXME: Optimize this */ - if (!mono_method_signature (m)->ret->byref && MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret)) - this_reg = 1; - func_addr = ((gpointer*)addr) [0]; func_gp = ((gpointer*)addr) [1]; - mono_domain_lock (domain); - buf = mono_code_manager_reserve (domain->code_mp, 256); - mono_domain_unlock (domain); + buf = mono_domain_code_reserve (domain, 256); /* Since the this reg is a stacked register, its a bit hard to access it */ ia64_codegen_init (code, buf); @@ -78,7 +71,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) } void -mono_arch_patch_callsite (guint8 *code, guint8 *addr) +mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) { guint8 *callsite_begin; guint64 *callsite = (guint64*)(gpointer)(code - 16); @@ -125,13 +118,13 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { guint8 *callsite_begin; guint64 *callsite = (guint64*)(gpointer)(code - 16); @@ -176,32 +169,8 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) mono_arch_flush_icache (callsite_begin, code - callsite_begin); } -void -mono_arch_nullify_plt_entry (guint8 *code) -{ - g_assert_not_reached (); -} - -void -mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr) -{ - /* - * This is called by the code generated by OP_CALL_REG: - * ld8 r30=[r8],8 - * nop.i 0x0;; - * mov.sptk b6=r30 - * ld8 r1=[r8] - * br.call.sptk.few b0=b6 - */ - - /* We patch the function descriptor instead of delegate->method_ptr */ - //g_assert (((gpointer*)(regs [8] - 8))[0] == tramp); - ((gpointer*)(regs [8] - 8))[0] = mono_get_addr_from_ftnptr (addr); - ((gpointer*)(regs [8] - 8))[1] = NULL; -} - guchar* -mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) +mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInfo **info, gboolean aot) { guint8 *buf, *tramp; int i, offset, saved_regs_offset, saved_fpregs_offset, last_offset, framesize; @@ -211,6 +180,10 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) unw_dyn_info_t *di; unw_dyn_region_info_t *r_pro; + g_assert (!aot); + if (info) + *info = NULL; + /* * Since jump trampolines are not patched, this trampoline is executed every * time a call is made to a jump trampoline. So we try to keep things faster @@ -225,8 +198,6 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) ia64_codegen_init (code, buf); - /* FIXME: Save/restore lmf */ - /* Stacked Registers */ in0 = 32; local0 = in0 + 8; @@ -317,14 +288,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) /* FIXME: */ ia64_mov (code, o3, 0); - if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) - tramp = (guint8*)mono_class_init_trampoline; - else if (tramp_type == MONO_TRAMPOLINE_AOT) - tramp = (guint8*)mono_aot_trampoline; - else if (tramp_type == MONO_TRAMPOLINE_DELEGATE) - tramp = (guint8*)mono_delegate_trampoline; - else - tramp = (guint8*)mono_magic_trampoline; + tramp = (guint8*)mono_get_trampoline_func (tramp_type); /* Call the trampoline using an indirect call */ ia64_movl (code, l0, tramp); @@ -333,6 +297,19 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) ia64_ld8 (code, IA64_GP, l0); ia64_br_call_reg (code, 0, IA64_B6); + /* Check for thread interruption */ + /* This is not perf critical code so no need to check the interrupt flag */ + ia64_mov (code, l2, IA64_R8); + + tramp = (guint8*)mono_thread_force_interruption_checkpoint; + ia64_movl (code, l0, tramp); + ia64_ld8_inc_imm (code, l1, l0, 8); + ia64_mov_to_br (code, IA64_B6, l1); + ia64_ld8 (code, IA64_GP, l0); + ia64_br_call_reg (code, 0, IA64_B6); + + ia64_mov (code, IA64_R8, l2); + /* Restore fp regs */ ia64_adds_imm (code, l1, saved_fpregs_offset, IA64_SP); for (i = 0; i < 8; ++i) @@ -391,9 +368,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty tramp = mono_get_trampoline_code (tramp_type); - mono_domain_lock (domain); - buf = mono_code_manager_reserve (domain->code_mp, TRAMPOLINE_SIZE); - mono_domain_unlock (domain); + buf = mono_domain_code_reserve (domain, TRAMPOLINE_SIZE); /* FIXME: Optimize this */ @@ -430,10 +405,10 @@ mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) NOT_IMPLEMENTED; } -guint8* -mono_debugger_create_notification_function (MonoCodeManager *codeman) +gpointer +mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info, gboolean aot) { - NOT_IMPLEMENTED; - + /* FIXME: implement! */ + g_assert_not_reached (); return NULL; }