X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-mips.h;h=73d0ad3272062fad992e68c42e33ca075b703a07;hb=99f2a62240cef1c950975f35b2e1fa896123abb4;hp=a2e79b7b22871304ac2ff50ae73ebde5fc8551ec;hpb=92f60fbffa1187be7dedf6a9286b5c35b2082815;p=mono.git diff --git a/mono/mini/mini-mips.h b/mono/mini/mini-mips.h index a2e79b7b228..73d0ad32720 100644 --- a/mono/mini/mini-mips.h +++ b/mono/mini/mini-mips.h @@ -3,6 +3,7 @@ #include #include +#include #if _MIPS_SIM == _ABIO32 /* o32 fully supported */ @@ -16,7 +17,7 @@ #endif -#define MONO_ARCH_CPU_SPEC mips_desc +#define MONO_ARCH_CPU_SPEC mono_mips_desc #define MONO_MAX_IREGS 32 #define MONO_MAX_FREGS 32 @@ -27,14 +28,12 @@ #if SIZEOF_REGISTER == 4 #define IREG_SIZE 4 -typedef guint32 mips_ireg; #define FREG_SIZE 4 typedef gfloat mips_freg; #elif SIZEOF_REGISTER == 8 #define IREG_SIZE 8 -typedef guint64 mips_ireg; #define FREG_SIZE 8 typedef gdouble mips_freg; @@ -42,14 +41,6 @@ typedef gdouble mips_freg; #error Unknown REGISTER_SIZE #endif -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -#define MSW_OFFSET sizeof(mips_ireg) -#define LSW_OFFSET 0 -#else -#define MSW_OFFSET 0 -#define LSW_OFFSET sizeof(mips_ireg) -#endif - /* * at and t0 used internally * v0, v1 aren't here for clarity reasons @@ -103,7 +94,7 @@ typedef gdouble mips_freg; #define mips_temp mips_t8 -#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS) +#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS | MIPS_A_REGS) #define MONO_ARCH_CALLEE_SAVED_REGS MIPS_S_REGS #define MIPS_ARG_REGS MIPS_A_REGS @@ -208,30 +199,21 @@ void mips_patch (guint32 *code, guint32 target); #define MIPS_LMF_MAGIC1 0xa5a5a5a5 #define MIPS_LMF_MAGIC2 0xc3c3c3c3 +/* Registers saved in lmf->iregs */ +#define MIPS_LMF_IREGMASK (0xffffffff & ~((1 << mips_zero) | (1 << mips_at) | MONO_ARCH_CALLEE_REGS)) + struct MonoLMF { gpointer previous_lmf; gpointer lmf_addr; MonoMethod *method; - mips_ireg ebp; gpointer eip; - mips_ireg iregs [MONO_SAVED_GREGS]; + mgreg_t iregs [MONO_SAVED_GREGS]; mips_freg fregs [MONO_SAVED_FREGS]; gulong magic; }; -/* we define our own structure and we'll copy the data - * from sigcontext/ucontext/mach when we need it. - * This also makes us save stack space and time when copying - * We might also want to add an additional field to propagate - * the original context from the signal handler. - */ -typedef struct { - gpointer sc_pc; - mips_ireg sc_regs [MONO_SAVED_GREGS]; - mips_freg sc_fpregs [MONO_SAVED_FREGS]; -} MonoContext; - typedef struct MonoCompileArch { + gpointer cinfo; guint iregs_offset; guint lmf_offset; guint local_alloc_offset; @@ -239,6 +221,8 @@ typedef struct MonoCompileArch { guint spillvar_offset_float; guint tracing_offset; guint long_branch; + gboolean omit_fp; + gboolean omit_fp_computed; } MonoCompileArch; #if SIZEOF_REGISTER == 4 @@ -247,7 +231,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_LCONV_TO_R4 1 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 -#define MONO_ARCH_BIGMUL_INTRINS 1 #endif #if SIZEOF_REGISTER == 8 @@ -258,7 +241,7 @@ typedef struct MonoCompileArch { #define MIPS_FP_ADDR_OFFSET (-8) #define MIPS_STACK_ALIGNMENT 16 #define MIPS_STACK_PARAM_OFFSET 16 /* from sp to first parameter */ -#define MIPS_MINIMAL_STACK_SIZE (4*sizeof(mips_ireg) + 4*sizeof(mips_ireg)) +#define MIPS_MINIMAL_STACK_SIZE (4*sizeof(mgreg_t) + 4*sizeof(mgreg_t)) #define MIPS_EXTRA_STACK_SIZE 16 /* from last parameter to top of frame */ #if _MIPS_SIM == _ABIO32 @@ -273,43 +256,30 @@ typedef struct MonoCompileArch { #define MIPS_LAST_FPARG_REG mips_f19 #endif -#define MONO_ARCH_HAVE_IMT 1 #define MONO_ARCH_IMT_REG mips_t0 -#define MONO_ARCH_VTABLE_REG mips_t0 -#define MONO_ARCH_RGCTX_REG mips_t0 +#define MONO_ARCH_VTABLE_REG mips_a0 +#define MONO_ARCH_RGCTX_REG MONO_ARCH_IMT_REG #define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 #define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1 - -/* XXX - a mystery, but it works */ -#define MONO_GET_CONTEXT \ - void *ctx = (void *)(((int)context)+24); +#define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1 +#define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1 +#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1 +#define MONO_ARCH_GSHARED_SUPPORTED 1 /* set the next to 0 once inssel-mips.brg is updated */ #define MIPS_PASS_STRUCTS_BY_VALUE 1 -#define MIPS_SMALL_RET_STRUCT_IN_REG 0 #define MONO_ARCH_USE_SIGACTION #define MONO_ARCH_NEED_DIV_CHECK 1 #define MONO_ARCH_NO_IOV_CHECK 1 -#define MONO_ARCH_THIS_AS_FIRST_ARG 1 - #define MIPS_NUM_REG_ARGS (MIPS_LAST_ARG_REG-MIPS_FIRST_ARG_REG+1) #define MIPS_NUM_REG_FPARGS (MIPS_LAST_FPARG_REG-MIPS_FIRST_FPARG_REG+1) -/* we have the stack pointer, not the base pointer in sigcontext */ -#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->sc_pc = (int)(ip); } while (0); -#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->sc_regs[mips_fp] = (int)(bp); } while (0); -#define MONO_CONTEXT_SET_SP(ctx,sp) do { (ctx)->sc_regs[mips_sp] = (int)(sp); } while (0); - -#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->sc_pc)) -#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->sc_regs[mips_fp])) -#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_regs[mips_sp])) - typedef struct { unsigned long zero; unsigned long at; /* assembler temp */ @@ -346,28 +316,18 @@ typedef struct { } MonoMipsStackFrame; #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \ - guint32 sp, ra; \ - guint32 *code = (guint32 *)(void *)func; \ - short imm; \ - memset ((ctx), 0, sizeof (*(ctx))); \ - __asm__ volatile("addu %0,$0,$29" : "=r" (sp)); \ - /* Look for adjustment of sp */ \ - while ((*code & 0xffff0000) != 0x27bd0000) \ - ++code; \ - imm = (short) (*code & 0xffff); \ - MONO_CONTEXT_SET_BP ((ctx), sp + (-imm)); \ - ra = *(guint32 *)(sp + (-imm) + MIPS_RET_ADDR_OFFSET); \ - MONO_CONTEXT_SET_IP ((ctx),ra); \ - MONO_CONTEXT_SET_SP ((ctx), MONO_CONTEXT_GET_BP (ctx)); \ + MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \ + MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \ + MONO_CONTEXT_SET_IP ((ctx), (func)); \ } while (0) +#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) + /* re-attaches with gdb - sometimes causes executable to hang */ #undef HAVE_BACKTRACE_SYMBOLS #undef DEBUG_EXCEPTIONS -#define MONO_ZERO_REG mips_zero - #define MONO_EMIT_NEW_MIPS_COND_EXC(cfg,cond,sr1,sr2,name) do { \ MonoInst *inst; \ MONO_INST_NEW ((cfg), (inst), cond); \