X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Ftramp-ppc.c;h=faecb47d4de845102c506bef722fab3652b24cd2;hb=8808f526907a030746bc6cc0aa875ade5500002f;hp=721ad88cc6cb5506736882598983d0897a92d334;hpb=0b4bc83e79ca3057693089dc7f926004bb9d9592;p=mono.git diff --git a/mono/mini/tramp-ppc.c b/mono/mini/tramp-ppc.c index 721ad88cc6c..faecb47d4de 100644 --- a/mono/mini/tramp-ppc.c +++ b/mono/mini/tramp-ppc.c @@ -1,5 +1,6 @@ -/* - * tramp-ppc.c: JIT trampoline code for PowerPC +/** + * \file + * JIT trampoline code for PowerPC * * Authors: * Dietmar Maurer (dietmar@ximian.com) @@ -104,16 +105,18 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name); g_print ("unbox code is at %p for method at %p\n", start, addr);*/ + mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL), domain); + return start; } /* * 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, *p; guint8 imm_buf [128]; @@ -124,9 +127,9 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo addr = mono_get_addr_from_ftnptr (addr); - /* Compute size of code needed to emit mrgctx */ + /* Compute size of code needed to emit the arg */ p = imm_buf; - ppc_load_ptr (p, MONO_ARCH_RGCTX_REG, mrgctx); + ppc_load_ptr (p, MONO_ARCH_RGCTX_REG, arg); imm_size = p - imm_buf; mono_domain_lock (domain); @@ -138,17 +141,19 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo mono_domain_unlock (domain); if (short_branch) { - ppc_load_ptr (code, MONO_ARCH_RGCTX_REG, mrgctx); + ppc_load_ptr (code, MONO_ARCH_RGCTX_REG, arg); ppc_emit32 (code, short_branch); } else { ppc_load_ptr (code, ppc_r0, addr); ppc_mtctr (code, ppc_r0); - ppc_load_ptr (code, MONO_ARCH_RGCTX_REG, mrgctx); + ppc_load_ptr (code, MONO_ARCH_RGCTX_REG, arg); ppc_bcctr (code, 20, 0); } mono_arch_flush_icache (start, code - start); g_assert ((code - start) <= size); + mono_tramp_info_register (mono_tramp_info_create (NULL, start, code - start, NULL, NULL), domain); + return start; } @@ -198,12 +203,6 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *a *(guint8**)((guint8*)got + offset) = addr; } -void -mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) -{ - mono_arch_patch_callsite (NULL, code, mini_get_nullified_class_init_trampoline ()); -} - /* Stack size for trampoline function * PPC_MINIMAL_STACK_SIZE + 16 (args + alignment to ppc_magic_trampoline) * + MonoLMF + 14 fp regs + 13 gregs + alignment @@ -348,10 +347,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf ppc_ldr (code, ppc_r4, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); /* Arg 3: trampoline argument */ - if (tramp_type == MONO_TRAMPOLINE_GENERIC_CLASS_INIT) - ppc_ldr (code, ppc_r5, GREGS_OFFSET + MONO_ARCH_VTABLE_REG * sizeof (mgreg_t), ppc_r1); - else - ppc_ldr (code, ppc_r5, GREGS_OFFSET, ppc_r1); + ppc_ldr (code, ppc_r5, GREGS_OFFSET, ppc_r1); if (aot) { code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("trampoline_func_%d", tramp_type)); @@ -505,7 +501,6 @@ emit_trampoline_jump (guint8 *code, guint8 *tramp) gpointer mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info, gboolean aot) { -#ifdef MONO_ARCH_VTABLE_REG guint8 *tramp; guint8 *code, *buf; guint8 **rgctx_null_jumps; @@ -610,82 +605,6 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info *info = mono_tramp_info_create (name, buf, code - buf, ji, unwind_ops); g_free (name); - return buf; -#else - g_assert_not_reached (); -#endif -} - -gpointer -mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean aot) -{ - guint8 *tramp; - guint8 *code, *buf; - static int byte_offset = -1; - static guint8 bitmask; - guint8 *jump; - int tramp_size; - GSList *unwind_ops = NULL; - MonoJumpInfo *ji = NULL; - - tramp_size = MONO_PPC_32_64_CASE (32, 44); - if (aot) - tramp_size += 32; - - code = buf = mono_global_codeman_reserve (tramp_size); - - if (byte_offset < 0) - mono_marshal_find_bitfield_offset (MonoVTable, initialized, &byte_offset, &bitmask); - - ppc_lbz (code, ppc_r4, byte_offset, MONO_ARCH_VTABLE_REG); - ppc_andid (code, ppc_r4, ppc_r4, bitmask); - jump = code; - ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); - - ppc_blr (code); - - ppc_patch (jump, code); - - if (aot) { - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_generic_class_init"); - /* Branch to the trampoline */ -#ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r12, 0, ppc_r12); -#endif - ppc_mtctr (code, ppc_r12); - ppc_bcctr (code, PPC_BR_ALWAYS, 0); - } else { - tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_GENERIC_CLASS_INIT, - mono_get_root_domain (), NULL); - - /* jump to the actual trampoline */ - code = emit_trampoline_jump (code, tramp); - } - - mono_arch_flush_icache (buf, code - buf); - - g_assert (code - buf <= tramp_size); - - *info = mono_tramp_info_create ("generic_class_init_trampoline", buf, code - buf, ji, unwind_ops); - - return buf; -} - -gpointer -mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) -{ - guint8 *code, *buf; - guint32 tramp_size = 64; - - code = buf = mono_global_codeman_reserve (tramp_size); - ppc_blr (code); - - mono_arch_flush_icache (buf, code - buf); - - g_assert (code - buf <= tramp_size); - - *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL); - return buf; } @@ -714,3 +633,10 @@ mono_arch_get_plt_info_offset (guint8 *plt_entry, mgreg_t *regs, guint8 *code) return ((guint32*)plt_entry) [6]; #endif } + +gpointer +mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info) +{ + g_assert_not_reached (); + return NULL; +}