/* * Copyright 2011 Xamarin Inc */ #ifndef __MONO_MINI_ARM_H__ #define __MONO_MINI_ARM_H__ #include #include #include #if defined(ARM_FPU_NONE) || (defined(__ARM_EABI__) && !defined(ARM_FPU_VFP) && !defined(ARM_FPU_VFP_HARD)) #define MONO_ARCH_SOFT_FLOAT 1 #endif #ifdef ARM_FPU_VFP_HARD #error "hardfp-abi not yet supported." #endif #if defined(__ARM_EABI__) #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define ARM_ARCHITECTURE "armel" #else #define ARM_ARCHITECTURE "armeb" #endif #else #define ARM_ARCHITECTURE "arm" #endif #if defined(ARM_FPU_FPA) #define ARM_FP_MODEL "fpa" #elif defined(ARM_FPU_VFP) #define ARM_FP_MODEL "vfp" #elif defined(ARM_FPU_NONE) #define ARM_FP_MODEL "soft-float" #elif defined(ARM_FPU_VFP_HARD) #define ARM_FP_MODEL "vfp(hardfp-abi)" #else #error "At least one of ARM_FPU_NONE, ARM_FPU_FPA, ARM_FPU_VFP or ARM_FPU_VFP_HARD must be defined." #endif #define MONO_ARCH_ARCHITECTURE ARM_ARCHITECTURE "," ARM_FP_MODEL #define MONO_ARCH_CPU_SPEC arm_cpu_desc #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define ARM_LSW_REG ARMREG_R0 #define ARM_MSW_REG ARMREG_R1 #else #define ARM_LSW_REG ARMREG_R1 #define ARM_MSW_REG ARMREG_R0 #endif #define MONO_MAX_IREGS 16 #define MONO_MAX_FREGS 16 #define MONO_SAVED_GREGS 10 /* r4-r11, ip, lr */ #define MONO_SAVED_FREGS 8 /* r4-r11, ip, lr: registers saved in the LMF */ #define MONO_ARM_REGSAVE_MASK 0x5ff0 #define MONO_ARM_FIRST_SAVED_REG ARMREG_R4 #define MONO_ARM_NUM_SAVED_REGS 10 /* Parameters used by the register allocator */ #define MONO_ARCH_CALLEE_REGS ((1<regs [0] = (gsize)exc; } while (0) #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \ 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) void mono_arm_throw_exception (MonoObject *exc, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); void mono_arm_throw_exception_by_token (guint32 type_token, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); void mono_arm_resume_unwind (guint32 dummy1, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs); gboolean mono_arm_thumb_supported (void); GSList* mono_arm_get_exception_trampolines (gboolean aot) MONO_INTERNAL; guint8* mono_arm_get_thumb_plt_entry (guint8 *code) MONO_INTERNAL; #endif /* __MONO_MINI_ARM_H__ */