X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-alpha.c;h=cab03d65ec5f8a8af8a17cf9e0edfff7e320d826;hb=4c78059bc5c4792dfa04f4c26a0e66796642b2e4;hp=48966289cfcedaa6d58531032c9e6688bd201c3a;hpb=f99ce750ee781a2584e849a0264300fa4d99aaaa;p=mono.git diff --git a/mono/mini/tramp-alpha.c b/mono/mini/tramp-alpha.c index 48966289cfc..cab03d65ec5 100644 --- a/mono/mini/tramp-alpha.c +++ b/mono/mini/tramp-alpha.c @@ -18,9 +18,6 @@ /*------------------------------------------------------------------*/ /* D e f i n e s */ /*------------------------------------------------------------------*/ -#define NOT_IMPLEMENTED(x) \ - g_error ("FIXME: %s is not yet implemented.", x); - #define ALPHA_DEBUG(x) \ if (mini_alpha_verbose_level) \ g_debug ("ALPHA_DEBUG: %s is called.", x); @@ -184,7 +181,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) } // alpha_at points to start of this method !!! - alpha_ldq(code, alpha_r0, alpha_at, off); + alpha_ldq(code, alpha_pv, alpha_at, off); alpha_br(code, alpha_zero, 2); *code = (unsigned int)(((unsigned long)mono_get_lmf_addr) & 0xFFFFFFFF); @@ -196,7 +193,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) * The call might clobber argument registers, but they are already * saved to the stack/global regs. */ - alpha_jsr(code, alpha_ra, alpha_r0, 0); + alpha_jsr(code, alpha_ra, alpha_pv, 0); // Save lmf_addr alpha_stq(code, alpha_r0, alpha_sp, @@ -383,7 +380,7 @@ mono_arch_create_jump_trampoline (MonoMethod *method) { ALPHA_DEBUG("mono_arch_create_jump_trampoline"); - NOT_IMPLEMENTED("mono_arch_create_jump_trampoline"); + NOT_IMPLEMENTED; return 0; } @@ -475,14 +472,12 @@ mono_arch_create_specific_trampoline (gpointer arg1, alpha_jmp(code, alpha_zero, alpha_at, 0); g_assert (((char *)code - (char *)buf) <= TRAMPOLINE_SIZE); - mono_domain_lock (domain); /* * FIXME: Changing the size to code - buf causes strange crashes during * mcs bootstrap. */ - real_code = mono_code_manager_reserve (domain->code_mp, TRAMPOLINE_SIZE); + real_code = mono_domain_code_reserve (domain, TRAMPOLINE_SIZE); size = (char *)code - (char *)buf; - mono_domain_unlock (domain); memcpy (real_code, buf, size); @@ -490,8 +485,6 @@ mono_arch_create_specific_trampoline (gpointer arg1, g_debug("mono_arch_create_specific_trampoline: Target: %p, Arg1: %p", real_code, arg1); - mono_jit_stats.method_trampolines++; - if (code_len) *code_len = size; @@ -502,24 +495,31 @@ mono_arch_create_specific_trampoline (gpointer arg1, /*========================= End of Function ========================*/ void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { unsigned int *pcode = (unsigned int *)code; ALPHA_DEBUG("mono_arch_nullify_class_init_trampoline"); -} - + // pcode[-2] ldq t12,n(gp) + // pcode[-1] jsr ra,(t12),0x20003efcb40 + if ((pcode[-2] & 0xFFFF0000) == 0xa77d0000 && + pcode[-1] == 0x6b5b4000) + { + // Put "unop" into call inst + pcode--; + alpha_nop(pcode); + alpha_nop(pcode); + alpha_nop(pcode); -void -mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, - gssize *regs, guint8 *addr) -{ - ALPHA_DEBUG("mono_arch_patch_delegate_trampoline"); + mono_arch_flush_icache ((code-4), 3*4); + } + else + g_assert_not_reached (); } void -mono_arch_patch_callsite (guint8 *code, guint8 *addr) +mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) { unsigned long *p = (unsigned int *)(code-12); @@ -566,6 +566,7 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) /* * mono_arch_get_unbox_trampoline: + * @gsctx: the generic sharing context * @m: method pointer * @addr: pointer to native code for @m * @@ -574,7 +575,7 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr) * unboxing before calling the method */ gpointer -mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) +mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) { unsigned int *code, *start_code; int this_reg = 16; //R16 @@ -583,13 +584,10 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) ALPHA_DEBUG("mono_arch_get_unbox_trampoline"); - if (!mono_method_signature (m)->ret->byref && - MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret)) + if (MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret)) this_reg = 17; //R17 - mono_domain_lock (domain); - start_code = code = (unsigned int *)mono_code_manager_reserve (domain->code_mp, 32); - mono_domain_unlock (domain); + start_code = code = (unsigned int *)mono_domain_code_reserve (domain, 32); // Adjust this by size of MonoObject alpha_addq_(code, this_reg, sizeof(MonoObject), this_reg); // 0 @@ -614,36 +612,21 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } 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 (); } -/* - * This method is only called when running in the Mono Debugger. - */ -guint8 * -mono_debugger_create_notification_function (MonoCodeManager *codeman) +gpointer +mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 encoded_offset) { - guint8 *code; - unsigned int *buf; - - code = mono_code_manager_reserve (codeman, 16); - buf = (unsigned int *)code; - - *buf = 0; - - alpha_call_pal(buf, 0x80); - alpha_ret(buf, alpha_ra, 1); - //x86_breakpoint (buf); - //x86_ret (buf); - - return code; + /* FIXME: implement! */ + g_assert_not_reached (); + return NULL; } -