X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-ia64.c;h=c95d26f8fd66c33f49a18513df3daccacef6188c;hb=cb4dfb5d9803365b73db03e34dc9900301b19a80;hp=4356e2502c40178f62e9e9a615ca41878d7d8e98;hpb=fefd6f1d0578964f8ec15e061c5b2db1f9ef4fbc;p=mono.git diff --git a/mono/mini/tramp-ia64.c b/mono/mini/tramp-ia64.c index 4356e2502c4..c95d26f8fd6 100644 --- a/mono/mini/tramp-ia64.c +++ b/mono/mini/tramp-ia64.c @@ -13,14 +13,12 @@ #include #include #include -#include #include +#include #include "mini.h" #include "mini-ia64.h" -#define NOT_IMPLEMENTED g_assert_not_reached () - #define GP_SCRATCH_REG 31 #define GP_SCRATCH_REG2 30 @@ -40,19 +38,15 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) gpointer func_addr, func_gp; Ia64CodegenState code; int this_reg = 0; + gpointer *desc; MonoDomain *domain = mono_domain_get (); /* 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); @@ -66,9 +60,10 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) g_assert (code.buf - buf < 256); - /* FIXME: */ + mono_arch_flush_icache (buf, code.buf - buf); - gpointer *desc = g_malloc0 (sizeof (gpointer) * 2); + /* FIXME: */ + desc = g_malloc0 (sizeof (gpointer) * 2); desc [0] = buf; desc [1] = func_gp; @@ -76,11 +71,12 @@ 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); - guint64 instructions [3]; + guint64 *next_bundle; + guint64 ins, instructions [3]; guint64 buf [16]; Ia64CodegenState gen; gpointer func = ((gpointer*)(gpointer)addr)[0]; @@ -90,6 +86,15 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) callsite -= 2; callsite_begin = (guint8*)callsite; + next_bundle = callsite + 2; + ins = ia64_bundle_ins1 (next_bundle); + if (ia64_ins_opcode (ins) == 5) { + /* ld8_inc_imm -> indirect call through a function pointer */ + g_assert (ia64_ins_r1 (ins) == GP_SCRATCH_REG2); + g_assert (ia64_ins_r3 (ins) == GP_SCRATCH_REG); + return; + } + /* Patch the code generated by emit_call */ instructions [0] = ia64_bundle_ins1 (callsite); @@ -113,7 +118,13 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +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, mgreg_t *regs) { guint8 *callsite_begin; guint64 *callsite = (guint64*)(gpointer)(code - 16); @@ -159,25 +170,13 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) } void -mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { - /* - * 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; + g_assert_not_reached (); } 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; @@ -187,6 +186,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 @@ -201,8 +204,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; @@ -293,14 +294,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); @@ -309,6 +303,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) @@ -367,9 +374,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 */ @@ -407,9 +412,9 @@ mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) } gpointer -mono_debugger_create_notification_function (gpointer *notification_address) +mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info, gboolean aot) { - NOT_IMPLEMENTED; - + /* FIXME: implement! */ + g_assert_not_reached (); return NULL; }