/*------------------------------------------------------------------*/
/* 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);
}
// 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);
* 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,
{
ALPHA_DEBUG("mono_arch_create_jump_trampoline");
- NOT_IMPLEMENTED("mono_arch_create_jump_trampoline");
+ NOT_IMPLEMENTED;
return 0;
}
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);
/*========================= 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");
-}
-
-/*
-** This method is called after delegate method is compiled.
-** We need to patch call site to call compiled method directly
-** (not via trampoline stub)
-** Determine address to patch using fp reg
-**
-*/
-
-void
-mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp,
- gssize *regs, guint8 *addr)
-{
- unsigned int *pcode = (unsigned int *)code;
- int reg;
- short fp_disp, obj_disp;
- unsigned long *pobj, obj;
-
- ALPHA_DEBUG("mono_arch_patch_delegate_trampoline");
-
- // The call signature for now is
- // -4 - ldq v0,24(fp)
- // -3 - ldq v0,40(v0)
- // -2 - mov v0,t12
- // -1 - jsr ra,(t12),0x200041476e4
- // 0 - ldah gp,0(ra)
- if (((pcode[-4] & 0xFF000000) == 0xA4000000) &&
- ((pcode[-3] & 0xFF000000) == 0xA4000000) &&
- ((pcode[-2] & 0xFF00FF00) == 0x47000400) &&
- ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
- {
- fp_disp = (pcode[-4] & 0xFFFF);
- obj_disp = (pcode[-3] & 0xFFFF);
+ // 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);
- pobj = regs[15] + fp_disp;
- obj = *pobj;
- reg = 0;
- }
+ mono_arch_flush_icache ((code-4), 3*4);
+ }
else
- // The non-optimized call signature for now is
- // -5 - ldq v0,24(fp)
- // -4 - mov v0,v0
- // -3 - ldq v0,40(v0)
- // -2 - mov v0,t12
- // -1 - jsr ra,(t12),0x200041476e4
- // 0 - ldah gp,0(ra)
- if (((pcode[-5] & 0xFF000000) == 0xA4000000) &&
- ((pcode[-4] & 0xFF00FF00) == 0x47000400) &&
- ((pcode[-3] & 0xFF000000) == 0xA4000000) &&
- ((pcode[-2] & 0xFF00FF00) == 0x47000400) &&
- ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
- {
- fp_disp = (pcode[-5] & 0xFFFF);
- obj_disp = (pcode[-3] & 0xFFFF);
-
- pobj = regs[15] + fp_disp;
- obj = *pobj;
- reg = 0;
- }
- else
g_assert_not_reached ();
-
- *((gpointer*)(obj + obj_disp)) = addr;
}
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);
/*
* mono_arch_get_unbox_trampoline:
+ * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* 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
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
}
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.
- */
gpointer
-mono_debugger_create_notification_function (void)
+mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 encoded_offset)
{
- guint8 *code;
- unsigned int *buf;
-
- code = mono_global_codeman_reserve (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;
}
-