X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-sigcontext.h;h=daa82bbef3742d8ea07529776eefc31589ced3cf;hb=5df3fd4797d5529466d0507d18f1ae312c082b4f;hp=5c8a57a450a18a26fabc1fa62ad82fd927b5388c;hpb=d8e166985bce7fc73b947e92d85dffd38c54dee0;p=mono.git diff --git a/mono/utils/mono-sigcontext.h b/mono/utils/mono-sigcontext.h index 5c8a57a450a..daa82bbef37 100644 --- a/mono/utils/mono-sigcontext.h +++ b/mono/utils/mono-sigcontext.h @@ -6,16 +6,24 @@ #include #endif -#if defined(__i386__) +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SIGNAL_H +#include +#endif -#if defined(__FreeBSD__) || defined(__APPLE__) +#if defined(TARGET_X86) + +#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__DragonFly__) #include #endif #if defined(__APPLE__) #include #endif -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__DragonFly__) #define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_eax) #define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_ebx) #define UCONTEXT_REG_ECX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_ecx) @@ -26,7 +34,7 @@ #define UCONTEXT_REG_EDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_edi) #define UCONTEXT_REG_EIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_eip) #elif defined(__APPLE__) -# if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +# if defined (TARGET_IOS) || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) #define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__eax) #define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__ebx) #define UCONTEXT_REG_ECX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__ecx) @@ -58,16 +66,81 @@ #define UCONTEXT_REG_EDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_EDI]) #define UCONTEXT_REG_EIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_EIP]) #elif defined(__OpenBSD__) - #define UCONTEXT_REG_EAX(ctx) ((ctx)->sc_eax) - #define UCONTEXT_REG_EBX(ctx) ((ctx)->sc_ebx) - #define UCONTEXT_REG_ECX(ctx) ((ctx)->sc_ecx) - #define UCONTEXT_REG_EDX(ctx) ((ctx)->sc_edx) - #define UCONTEXT_REG_EBP(ctx) ((ctx)->sc_ebp) - #define UCONTEXT_REG_ESP(ctx) ((ctx)->sc_esp) - #define UCONTEXT_REG_ESI(ctx) ((ctx)->sc_esi) - #define UCONTEXT_REG_EDI(ctx) ((ctx)->sc_edi) - #define UCONTEXT_REG_EIP(ctx) ((ctx)->sc_eip) + #define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->sc_eax) + #define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->sc_ebx) + #define UCONTEXT_REG_ECX(ctx) (((ucontext_t*)(ctx))->sc_ecx) + #define UCONTEXT_REG_EDX(ctx) (((ucontext_t*)(ctx))->sc_edx) + #define UCONTEXT_REG_EBP(ctx) (((ucontext_t*)(ctx))->sc_ebp) + #define UCONTEXT_REG_ESP(ctx) (((ucontext_t*)(ctx))->sc_esp) + #define UCONTEXT_REG_ESI(ctx) (((ucontext_t*)(ctx))->sc_esi) + #define UCONTEXT_REG_EDI(ctx) (((ucontext_t*)(ctx))->sc_edi) + #define UCONTEXT_REG_EIP(ctx) (((ucontext_t*)(ctx))->sc_eip) +#elif defined(PLATFORM_SOLARIS) + #define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EAX]) + #define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EBX]) + #define UCONTEXT_REG_ECX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [ECX]) + #define UCONTEXT_REG_EDX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EDX]) + #define UCONTEXT_REG_EBP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EBP]) + #define UCONTEXT_REG_ESP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [ESP]) + #define UCONTEXT_REG_ESI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [ESI]) + #define UCONTEXT_REG_EDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EDI]) + #define UCONTEXT_REG_EIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [EIP]) #else + +#if defined(TARGET_ANDROID) +/* No ucontext.h as of NDK v6b */ +typedef int greg_t; +#define NGREG 19 +typedef greg_t gregset_t [NGREG]; +enum +{ + REG_GS = 0, +# define REG_GS REG_GS + REG_FS, +# define REG_FS REG_FS + REG_ES, +# define REG_ES REG_ES + REG_DS, +# define REG_DS REG_DS + REG_EDI, +# define REG_EDI REG_EDI + REG_ESI, +# define REG_ESI REG_ESI + REG_EBP, +# define REG_EBP REG_EBP + REG_ESP, +# define REG_ESP REG_ESP + REG_EBX, +# define REG_EBX REG_EBX + REG_EDX, +# define REG_EDX REG_EDX + REG_ECX, +# define REG_ECX REG_ECX + REG_EAX, +# define REG_EAX REG_EAX + REG_TRAPNO, +# define REG_TRAPNO REG_TRAPNO + REG_ERR, +# define REG_ERR REG_ERR + REG_EIP, +# define REG_EIP REG_EIP +}; + +typedef struct { + gregset_t gregs; + /* Many missing fields */ +} mcontext_t; + +typedef struct ucontext { + unsigned long int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + /* Many missing fields */ +} ucontext_t; + +#endif + #define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_EAX]) #define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_EBX]) #define UCONTEXT_REG_ECX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_ECX]) @@ -79,7 +152,11 @@ #define UCONTEXT_REG_EIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_EIP]) #endif -#elif defined(__x86_64__) +#elif defined(TARGET_AMD64) + +#if defined(__FreeBSD__) +#include +#endif #if defined(__APPLE__) #define UCONTEXT_REG_RAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__rax) @@ -100,26 +177,56 @@ #define UCONTEXT_REG_R14(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__r14) #define UCONTEXT_REG_R15(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__r15) #elif defined(__FreeBSD__) -#define UCONTEXT_GREGS(ctx) ((guint64*)&(((ucontext_t*)(ctx))->uc_mcontext)) + #define UCONTEXT_REG_RAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rax) + #define UCONTEXT_REG_RBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rbx) + #define UCONTEXT_REG_RCX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rcx) + #define UCONTEXT_REG_RDX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rdx) + #define UCONTEXT_REG_RBP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rbp) + #define UCONTEXT_REG_RSP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rsp) + #define UCONTEXT_REG_RSI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rsi) + #define UCONTEXT_REG_RDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rdi) + #define UCONTEXT_REG_RIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_rip) + #define UCONTEXT_REG_R8(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r8) + #define UCONTEXT_REG_R9(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r9) + #define UCONTEXT_REG_R10(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r10) + #define UCONTEXT_REG_R11(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r11) + #define UCONTEXT_REG_R12(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r12) + #define UCONTEXT_REG_R13(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r13) + #define UCONTEXT_REG_R14(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r14) + #define UCONTEXT_REG_R15(ctx) (((ucontext_t*)(ctx))->uc_mcontext.mc_r15) +#elif defined(__NetBSD__) + #define UCONTEXT_REG_RAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RAX]) + #define UCONTEXT_REG_RBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RBX]) + #define UCONTEXT_REG_RCX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RCX]) + #define UCONTEXT_REG_RDX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RDX]) + #define UCONTEXT_REG_RBP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RBP]) + #define UCONTEXT_REG_RSP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RSP]) + #define UCONTEXT_REG_RSI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RSI]) + #define UCONTEXT_REG_RDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RDI]) + #define UCONTEXT_REG_RIP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_RIP]) + #define UCONTEXT_REG_R12(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_R12]) + #define UCONTEXT_REG_R13(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_R13]) + #define UCONTEXT_REG_R14(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_R14]) + #define UCONTEXT_REG_R15(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_R15]) #elif defined(__OpenBSD__) /* OpenBSD/amd64 has no gregs array, ucontext_t == sigcontext */ - #define UCONTEXT_REG_RAX(ctx) ((ctx)->sc_rax) - #define UCONTEXT_REG_RBX(ctx) ((ctx)->sc_rbx) - #define UCONTEXT_REG_RCX(ctx) ((ctx)->sc_rcx) - #define UCONTEXT_REG_RDX(ctx) ((ctx)->sc_rdx) - #define UCONTEXT_REG_RBP(ctx) ((ctx)->sc_rbp) - #define UCONTEXT_REG_RSP(ctx) ((ctx)->sc_rsp) - #define UCONTEXT_REG_RSI(ctx) ((ctx)->sc_rsi) - #define UCONTEXT_REG_RDI(ctx) ((ctx)->sc_rdi) - #define UCONTEXT_REG_RIP(ctx) ((ctx)->sc_rip) - #define UCONTEXT_REG_R8(ctx) ((ctx)->sc_r8) - #define UCONTEXT_REG_R9(ctx) ((ctx)->sc_r9) - #define UCONTEXT_REG_R10(ctx) ((ctx)->sc_r10) - #define UCONTEXT_REG_R11(ctx) ((ctx)->sc_r11) - #define UCONTEXT_REG_R12(ctx) ((ctx)->sc_r12) - #define UCONTEXT_REG_R13(ctx) ((ctx)->sc_r13) - #define UCONTEXT_REG_R14(ctx) ((ctx)->sc_r14) - #define UCONTEXT_REG_R15(ctx) ((ctx)->sc_r15) + #define UCONTEXT_REG_RAX(ctx) (((ucontext_t*)(ctx))->sc_rax) + #define UCONTEXT_REG_RBX(ctx) (((ucontext_t*)(ctx))->sc_rbx) + #define UCONTEXT_REG_RCX(ctx) (((ucontext_t*)(ctx))->sc_rcx) + #define UCONTEXT_REG_RDX(ctx) (((ucontext_t*)(ctx))->sc_rdx) + #define UCONTEXT_REG_RBP(ctx) (((ucontext_t*)(ctx))->sc_rbp) + #define UCONTEXT_REG_RSP(ctx) (((ucontext_t*)(ctx))->sc_rsp) + #define UCONTEXT_REG_RSI(ctx) (((ucontext_t*)(ctx))->sc_rsi) + #define UCONTEXT_REG_RDI(ctx) (((ucontext_t*)(ctx))->sc_rdi) + #define UCONTEXT_REG_RIP(ctx) (((ucontext_t*)(ctx))->sc_rip) + #define UCONTEXT_REG_R8(ctx) (((ucontext_t*)(ctx))->sc_r8) + #define UCONTEXT_REG_R9(ctx) (((ucontext_t*)(ctx))->sc_r9) + #define UCONTEXT_REG_R10(ctx) (((ucontext_t*)(ctx))->sc_r10) + #define UCONTEXT_REG_R11(ctx) (((ucontext_t*)(ctx))->sc_r11) + #define UCONTEXT_REG_R12(ctx) (((ucontext_t*)(ctx))->sc_r12) + #define UCONTEXT_REG_R13(ctx) (((ucontext_t*)(ctx))->sc_r13) + #define UCONTEXT_REG_R14(ctx) (((ucontext_t*)(ctx))->sc_r14) + #define UCONTEXT_REG_R15(ctx) (((ucontext_t*)(ctx))->sc_r15) #else #define UCONTEXT_GREGS(ctx) ((guint64*)&(((ucontext_t*)(ctx))->uc_mcontext.gregs)) #endif @@ -194,7 +301,7 @@ #define UCONTEXT_REG_LNK(ctx) ((ctx)->uc_mcontext.mc_lr) #endif -#elif defined(__arm__) +#elif defined(TARGET_ARM) #if defined(__APPLE__) typedef ucontext_t arm_ucontext; @@ -214,6 +321,8 @@ #define UCONTEXT_REG_R10(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__r[10]) #define UCONTEXT_REG_R11(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__r[11]) #define UCONTEXT_REG_R12(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__r[12]) + #define UCONTEXT_REG_CPSR(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__cpsr) + #define UCONTEXT_REG_VFPREGS(ctx) (double*)(((ucontext_t*)(ctx))->uc_mcontext->__fs.__r) #elif defined(__linux__) typedef struct arm_ucontext { unsigned long uc_flags; @@ -244,7 +353,81 @@ #define UCONTEXT_REG_R10(ctx) (((arm_ucontext*)(ctx))->sig_ctx.arm_r10) #define UCONTEXT_REG_R11(ctx) (((arm_ucontext*)(ctx))->sig_ctx.arm_fp) #define UCONTEXT_REG_R12(ctx) (((arm_ucontext*)(ctx))->sig_ctx.arm_ip) + #define UCONTEXT_REG_CPSR(ctx) (((arm_ucontext*)(ctx))->sig_ctx.arm_cpsr) #endif + +#elif defined(TARGET_ARM64) + +#if defined(MONO_CROSS_COMPILE) + #define UCONTEXT_REG_PC(ctx) NULL + #define UCONTEXT_REG_SP(ctx) NULL + #define UCONTEXT_REG_R0(ctx) NULL + #define UCONTEXT_GREGS(ctx) NULL +#elif defined(__APPLE__) +#include +#include + /* mach/arm/_structs.h */ + #define UCONTEXT_REG_PC(ctx) (((ucontext64_t*)(ctx))->uc_mcontext64->__ss.__pc) + #define UCONTEXT_REG_SP(ctx) (((ucontext64_t*)(ctx))->uc_mcontext64->__ss.__sp) + #define UCONTEXT_REG_R0(ctx) (((ucontext64_t*)(ctx))->uc_mcontext64->__ss.__x [ARMREG_R0]) + #define UCONTEXT_GREGS(ctx) (&(((ucontext64_t*)(ctx))->uc_mcontext64->__ss.__x)) +#else +#include + #define UCONTEXT_REG_PC(ctx) (((ucontext_t*)(ctx))->uc_mcontext.pc) + #define UCONTEXT_REG_SP(ctx) (((ucontext_t*)(ctx))->uc_mcontext.sp) + #define UCONTEXT_REG_R0(ctx) (((ucontext_t*)(ctx))->uc_mcontext.regs [ARMREG_R0]) + #define UCONTEXT_GREGS(ctx) (&(((ucontext_t*)(ctx))->uc_mcontext.regs)) +#endif + +#elif defined(__mips__) + +# if HAVE_UCONTEXT_H +# include +# endif + +/* No ucontext.h */ +#if defined(TARGET_ANDROID) + +#define NGREG 32 +#define NFPREG 32 + +typedef unsigned long gregset_t[NGREG]; + +typedef struct fpregset { + union { + double fp_dregs[NFPREG]; + struct { + float _fp_fregs; + unsigned int _fp_pad; + } fp_fregs[NFPREG]; + } fp_r; +} fpregset_t; + +typedef struct + { + unsigned int regmask; + unsigned int status; + unsigned long pc; + gregset_t gregs; + fpregset_t fpregs; + /* missing fields follow */ +} mcontext_t; + +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + /* missing fields follow */ + } ucontext_t; + +#endif + +# define UCONTEXT_GREGS(ctx) (((ucontext_t *)(ctx))->uc_mcontext.gregs) +# define UCONTEXT_FPREGS(ctx) (((ucontext_t *)(ctx))->uc_mcontext.fpregs.fp_r.fp_dregs) +# define UCONTEXT_REG_PC(ctx) (((ucontext_t *)(ctx))->uc_mcontext.pc) + #elif defined(__s390x__) # if HAVE_UCONTEXT_H