2010-02-15 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-arm.h
index 0b06643ed5acbd0be7e7c6bb402dc58773b4532c..4088ac7857827ef60b52cd559be149e1d2f3dda3 100644 (file)
@@ -46,7 +46,7 @@
 #define MONO_SAVED_GREGS 10 /* r4-411, ip, lr */
 #define MONO_SAVED_FREGS 8
 
-/* r4-r11, ip, lr: registers saved in the LMF and MonoContext  */
+/* r4-r11, ip, lr: registers saved in the LMF  */
 #define MONO_ARM_REGSAVE_MASK 0x5ff0
 
 /* Parameters used by the register allocator */
@@ -55,8 +55,8 @@
 #define MONO_ARCH_CALLEE_SAVED_REGS ((1<<ARMREG_V1) | (1<<ARMREG_V2) | (1<<ARMREG_V3) | (1<<ARMREG_V4) | (1<<ARMREG_V5) | (1<<ARMREG_V6) | (1<<ARMREG_V7))
 
 #ifdef ARM_FPU_VFP
-/* Every double precision vfp register, d0 is reserved for a scratch reg */
-#define MONO_ARCH_CALLEE_FREGS 0x55555554
+/* Every double precision vfp register, d0/d1 is reserved for a scratch reg */
+#define MONO_ARCH_CALLEE_FREGS 0x55555550
 #else
 #define MONO_ARCH_CALLEE_FREGS 0xf
 #endif
@@ -93,6 +93,10 @@ mono_arm_throw_exception_by_token (guint32 type_token, unsigned long eip, unsign
 
 /* keep the size of the structure a multiple of 8 */
 struct MonoLMF {
+       /* 
+        * If the second lowest bit is set to 1, then this is a MonoLMFExt structure, and
+        * the other fields are not valid.
+        */
        gpointer    previous_lmf;
        gpointer    lmf_addr;
        MonoMethod *method;
@@ -116,12 +120,13 @@ typedef struct {
        gulong eip;          // pc 
        gulong ebp;          // fp
        gulong esp;          // sp
-       gulong regs [MONO_SAVED_GREGS];
+       gulong regs [16];
        double fregs [MONO_SAVED_FREGS];
 } MonoContext;
 
 typedef struct MonoCompileArch {
-       int dummy;
+       gpointer seq_point_info_var, ss_trigger_page_var;
+       gpointer cinfo;
 } MonoCompileArch;
 
 #define MONO_ARCH_EMULATE_FCONV_TO_I8 1
@@ -153,8 +158,14 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 
 #define MONO_ARCH_AOT_SUPPORTED 1
+#define MONO_ARCH_LLVM_SUPPORTED 1
 
 #define MONO_ARCH_GSHARED_SUPPORTED 1
+#define MONO_ARCH_DYN_CALL_SUPPORTED 1
+#define MONO_ARCH_DYN_CALL_PARAM_AREA 24
+
+#define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
+#define MONO_ARCH_HAVE_FIND_JIT_INFO_EXT 1
 
 /* ARM doesn't have too many registers, so we have to use a callee saved one */
 #define MONO_ARCH_RGCTX_REG ARMREG_V5
@@ -179,18 +190,30 @@ typedef struct MonoCompileArch {
 #if __APPLE__
        #define UCONTEXT_REG_PC(ctx) ((ctx)->uc_mcontext->__ss.__pc)
        #define UCONTEXT_REG_SP(ctx) ((ctx)->uc_mcontext->__ss.__sp)
-       #define UCONTEXT_REG_R4(ctx) ((ctx)->uc_mcontext->__ss.__r[4])
+       #define UCONTEXT_REG_R0(ctx) ((ctx)->uc_mcontext->__ss.__r[0])
 #else
        #define UCONTEXT_REG_PC(ctx) ((ctx)->sig_ctx.arm_pc)
        #define UCONTEXT_REG_SP(ctx) ((ctx)->sig_ctx.arm_sp)
-       #define UCONTEXT_REG_R4(ctx) ((ctx)->sig_ctx.arm_r4)
+       #define UCONTEXT_REG_R0(ctx) ((ctx)->sig_ctx.arm_r0)
 #endif
 
+/*
+ * This structure is an extension of MonoLMF and contains extra information.
+ */
+typedef struct {
+       struct MonoLMF lmf;
+       gboolean debugger_invoke;
+       MonoContext ctx; /* if debugger_invoke is TRUE */
+} MonoLMFExt;
+
 void
 mono_arm_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gulong *int_regs, gdouble *fp_regs);
 
 void
 mono_arm_throw_exception_by_token (guint32 type_token, unsigned long eip, unsigned long esp, gulong *int_regs, gdouble *fp_regs);
 
+gboolean
+mono_arm_thumb_supported (void);
+
 #endif /* __MONO_MINI_ARM_H__ */