X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fexceptions-mips.c;h=13aff78f9de3f0b47a2541b7d32e58a4059ecfdb;hb=c2d511e567dd2d535056dc79b745f88b4fb64afa;hp=8d04b35ed353d0de473339b9a624929bdaaa31e3;hpb=b6abfec9cea4064a9eb07a45bdeea055a0a1150c;p=mono.git diff --git a/mono/mini/exceptions-mips.c b/mono/mini/exceptions-mips.c index 8d04b35ed35..13aff78f9de 100644 --- a/mono/mini/exceptions-mips.c +++ b/mono/mini/exceptions-mips.c @@ -75,7 +75,7 @@ mono_arch_get_restore_context (void) | (1 << mips_sp) | (1 << mips_ra)); for (i = 0; i < MONO_SAVED_GREGS; ++i) { if (iregs_to_restore & (1 << i)) { - mips_lw (code, i, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[i])); + MIPS_LW (code, i, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[i])); } } @@ -130,26 +130,26 @@ mono_arch_get_call_filter (void) /* Save global registers on stack (s0 - s7) */ offset = 16; - mips_sw (code, mips_s0, mips_sp, offset); offset += 4; - mips_sw (code, mips_s1, mips_sp, offset); offset += 4; - mips_sw (code, mips_s2, mips_sp, offset); offset += 4; - mips_sw (code, mips_s3, mips_sp, offset); offset += 4; - mips_sw (code, mips_s4, mips_sp, offset); offset += 4; - mips_sw (code, mips_s5, mips_sp, offset); offset += 4; - mips_sw (code, mips_s6, mips_sp, offset); offset += 4; - mips_sw (code, mips_s7, mips_sp, offset); offset += 4; - mips_sw (code, mips_fp, mips_sp, offset); offset += 4; + MIPS_SW (code, mips_s0, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s1, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s2, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s3, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s4, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s5, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s6, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_s7, mips_sp, offset); offset += IREG_SIZE; + MIPS_SW (code, mips_fp, mips_sp, offset); offset += IREG_SIZE; /* Restore global registers from MonoContext, including the frame pointer */ - mips_lw (code, mips_s0, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s0])); - mips_lw (code, mips_s1, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s1])); - mips_lw (code, mips_s2, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s2])); - mips_lw (code, mips_s3, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s3])); - mips_lw (code, mips_s4, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s4])); - mips_lw (code, mips_s5, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s5])); - mips_lw (code, mips_s6, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s6])); - mips_lw (code, mips_s7, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s7])); - mips_lw (code, mips_fp, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_fp])); + MIPS_LW (code, mips_s0, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s0])); + MIPS_LW (code, mips_s1, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s1])); + MIPS_LW (code, mips_s2, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s2])); + MIPS_LW (code, mips_s3, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s3])); + MIPS_LW (code, mips_s4, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s4])); + MIPS_LW (code, mips_s5, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s5])); + MIPS_LW (code, mips_s6, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s6])); + MIPS_LW (code, mips_s7, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_s7])); + MIPS_LW (code, mips_fp, mips_a0, G_STRUCT_OFFSET (MonoContext, sc_regs[mips_fp])); /* a1 is the handler to call */ mips_move (code, mips_t9, mips_a1); @@ -160,15 +160,15 @@ mono_arch_get_call_filter (void) /* restore all regs from the stack */ offset = 16; - mips_lw (code, mips_s0, mips_sp, offset); offset += 4; - mips_lw (code, mips_s1, mips_sp, offset); offset += 4; - mips_lw (code, mips_s2, mips_sp, offset); offset += 4; - mips_lw (code, mips_s3, mips_sp, offset); offset += 4; - mips_lw (code, mips_s4, mips_sp, offset); offset += 4; - mips_lw (code, mips_s5, mips_sp, offset); offset += 4; - mips_lw (code, mips_s6, mips_sp, offset); offset += 4; - mips_lw (code, mips_s7, mips_sp, offset); offset += 4; - mips_lw (code, mips_fp, mips_sp, offset); offset += 4; + MIPS_LW (code, mips_s0, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s1, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s2, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s3, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s4, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s5, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s6, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_s7, mips_sp, offset); offset += IREG_SIZE; + MIPS_LW (code, mips_fp, mips_sp, offset); offset += IREG_SIZE; /* epilog */ mips_lw (code, mips_ra, mips_sp, alloc_size + MIPS_RET_ADDR_OFFSET); @@ -203,11 +203,7 @@ throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gboolean /*g_print ("stack in throw: %p\n", esp);*/ memcpy (&ctx.sc_regs, (void *)(esp + MIPS_STACK_PARAM_OFFSET), sizeof (gulong) * MONO_SAVED_GREGS); -#if 0 - memcpy (&ctx.sc_fpregs, fp_regs, sizeof (float) * MONO_SAVED_FREGS); -#else - memset (&ctx.sc_fpregs, 0, sizeof (float) * MONO_SAVED_FREGS); -#endif + memset (&ctx.sc_fpregs, 0, sizeof (mips_freg) * MONO_SAVED_FREGS); MONO_CONTEXT_SET_IP (&ctx, eip); if (mono_object_isinst (exc, mono_defaults.exception_class)) { @@ -236,7 +232,7 @@ throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gboolean * */ static gpointer -mono_arch_get_throw_exception_generic (guint8 *start, int size, int by_name, gboolean rethrow) +mono_arch_get_throw_exception_generic (guint8 *start, int size, int corlib, gboolean rethrow) { guint8 *code; int alloc_size, pos, i; @@ -262,18 +258,17 @@ mono_arch_get_throw_exception_generic (guint8 *start, int size, int by_name, gbo /* Save all the regs on the stack */ for (i = 0; i < MONO_MAX_IREGS; i++) { if (i != mips_sp) - mips_sw (code, i, mips_sp, i*sizeof(guint32) + MIPS_STACK_PARAM_OFFSET); + MIPS_SW (code, i, mips_sp, i*IREG_SIZE + MIPS_STACK_PARAM_OFFSET); else { mips_addiu (code, mips_at, mips_sp, alloc_size); - mips_sw (code, mips_at, mips_sp, i*sizeof(guint32) + MIPS_STACK_PARAM_OFFSET); + MIPS_SW (code, mips_at, mips_sp, i*IREG_SIZE + MIPS_STACK_PARAM_OFFSET); } } - if (by_name) { - mips_move (code, mips_a2, mips_a0); + if (corlib) { + mips_move (code, mips_a1, mips_a0); mips_load (code, mips_a0, mono_defaults.corlib); - mips_load (code, mips_a1, "System"); - mips_load (code, mips_t9, mono_exception_from_name); + mips_load (code, mips_t9, mono_exception_from_token); mips_jalr (code, mips_t9, mips_ra); mips_nop (code); mips_move (code, mips_a0, mips_v0); @@ -283,7 +278,7 @@ mono_arch_get_throw_exception_generic (guint8 *start, int size, int by_name, gbo /* exc is already in place in a0 */ /* pointer to ip */ - if (by_name) + if (corlib) mips_lw (code, mips_a1, mips_sp, alloc_size + MIPS_RET_ADDR_OFFSET); else mips_move (code, mips_a1, mips_ra); @@ -349,20 +344,29 @@ mono_arch_get_throw_exception (void) return start; } +gpointer +mono_arch_get_throw_exception_by_name (void) +{ + guint8 *start, *code; + int size = 64; + + /* Not used on MIPS */ + start = code = mono_global_codeman_reserve (size); + mips_break (code, 0xfd); + mono_arch_flush_icache (start, code - start); + return start; +} + /** - * arch_get_throw_exception_by_name: + * mono_arch_get_throw_corlib_exception: * * Returns a function pointer which can be used to raise * corlib exceptions. The returned function has the following - * signature: void (*func) (char *exc_name); - * For example to raise an arithmetic exception you can use: - * - * x86_push_imm (code, "ArithmeticException"); - * x86_call_code (code, arch_get_throw_exception_by_name ()); - * + * signature: void (*func) (guint32 ex_token, guint32 offset); + * On MIPS, the offset argument is missing. */ gpointer -mono_arch_get_throw_exception_by_name (void) +mono_arch_get_throw_corlib_exception (void) { static guint8 start [GENERIC_EXCEPTION_SIZE]; static int inited = 0; @@ -422,8 +426,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, if (managed) *managed = FALSE; - *new_ctx = *ctx; - setup_context (new_ctx); + memcpy (new_ctx, ctx, sizeof (MonoContext)); if (ji != NULL) { int i; @@ -474,10 +477,15 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, /* these all happen before adjustment of fp */ /* Look for sw ??, ????(sp) */ insn = ((guint32 *)ji->code_start) + 1; - while (!*insn || (*insn & 0xffe00000) == 0xafa00000) { + while (!*insn || ((*insn & 0xffe00000) == 0xafa00000) || ((*insn & 0xffe00000) == 0xffa00000)) { int reg = (*insn >> 16) & 0x1f; + guint32 addr = (((guint32)fp) + (short)(*insn & 0x0000ffff)); + mask &= ~(1 << reg); - new_ctx->sc_regs [reg] = *(guint32 *)(((guint32)fp) + (short)(*insn & 0x0000ffff)); + if ((*insn & 0xffe00000) == 0xafa00000) + new_ctx->sc_regs [reg] = *(guint32 *)addr; + else + new_ctx->sc_regs [reg] = *(guint64 *)addr; insn++; } MONO_CONTEXT_SET_SP (new_ctx, sp); @@ -502,7 +510,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) { } else { - memset (res, 0, sizeof (MonoJitInfo)); + memset (res, 0, MONO_SIZEOF_JIT_INFO); res->method = (*lmf)->method; } memcpy (&new_ctx->sc_regs, (*lmf)->iregs, sizeof (gulong) * MONO_SAVED_GREGS);