X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-context.h;h=33a821a198a9bd57851f752fb29a49cd3619b75d;hb=8f385c26c22b19f5fb3ef68839307f1f34602a2b;hp=2b65b2b715b64b97f278fbd6dc7f1b546196b6ba;hpb=181093864f34faa597e994bbd4de7525035fb243;p=mono.git diff --git a/mono/utils/mono-context.h b/mono/utils/mono-context.h index 2b65b2b715b..33a821a198a 100644 --- a/mono/utils/mono-context.h +++ b/mono/utils/mono-context.h @@ -17,6 +17,10 @@ #include #endif +#ifdef HOST_WATCHOS +#include +#endif + /* * General notes about mono-context. * Each arch defines a MonoContext struct with all GPR regs + IP/PC. @@ -147,6 +151,7 @@ typedef struct { #elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */ +#include #if !defined( HOST_WIN32 ) && !defined(__native_client__) && !defined(__native_client_codegen__) @@ -157,32 +162,17 @@ typedef struct { #endif typedef struct { - mgreg_t rax; - mgreg_t rbx; - mgreg_t rcx; - mgreg_t rdx; - mgreg_t rbp; - mgreg_t rsp; - mgreg_t rsi; - mgreg_t rdi; - mgreg_t r8; - mgreg_t r9; - mgreg_t r10; - mgreg_t r11; - mgreg_t r12; - mgreg_t r13; - mgreg_t r14; - mgreg_t r15; - mgreg_t rip; + mgreg_t gregs [AMD64_NREG]; + double fregs [AMD64_XMM_NREG]; } MonoContext; -#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->rip = (mgreg_t)(ip); } while (0); -#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->rbp = (mgreg_t)(bp); } while (0); -#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->rsp = (mgreg_t)(esp); } while (0); +#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->gregs [AMD64_RIP] = (mgreg_t)(ip); } while (0); +#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->gregs [AMD64_RBP] = (mgreg_t)(bp); } while (0); +#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->gregs [AMD64_RSP] = (mgreg_t)(esp); } while (0); -#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->rip)) -#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->rbp)) -#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->rsp)) +#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->gregs [AMD64_RIP])) +#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->gregs [AMD64_RBP])) +#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->gregs [AMD64_RSP])) #if defined (HOST_WIN32) && !defined(__GNUC__) /* msvc doesn't support inline assembly, so have to use a separate .asm file */ @@ -262,6 +252,33 @@ typedef struct { #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->regs [ARMREG_FP])) #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->regs [ARMREG_SP])) +#if defined(HOST_WATCHOS) + +#define MONO_CONTEXT_GET_CURRENT(ctx) do { \ + unw_context_t uctx; \ + unw_cursor_t c; \ + unw_word_t data; \ + g_assert (unw_getcontext (&uctx) == 0); \ + g_assert (unw_init_local (&c, &uctx) == 0); \ + for (int reg = 0; reg < 13; ++reg) { \ + unw_get_reg (&c, (unw_regnum_t) UNW_ARM_R0 + reg, &data); \ + ctx.regs[reg] = data; \ + } \ + unw_get_reg (&c, UNW_ARM_SP, &data); \ + ctx.regs[ARMREG_SP] = data; \ + unw_get_reg (&c, UNW_ARM_LR, &data); \ + ctx.regs[ARMREG_LR] = data; \ + unw_get_reg (&c, UNW_ARM_IP, &data); \ + ctx.regs[ARMREG_PC] = data; \ + ctx.pc = ctx.regs[ARMREG_PC]; \ + for (int reg = 0; reg < 16; ++reg) { \ + unw_get_reg (&c, (unw_regnum_t) UNW_ARM_D0 + reg, &data); \ + ctx.fregs[reg] = data; \ + } \ +} while (0); + +#else + #define MONO_CONTEXT_GET_CURRENT(ctx) do { \ __asm__ __volatile__( \ "push {r0}\n" \ @@ -285,6 +302,8 @@ typedef struct { ctx.pc = ctx.regs [15]; \ } while (0) +#endif + #define MONO_ARCH_HAS_MONO_CONTEXT 1 #elif (defined(__aarch64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM64)) @@ -339,6 +358,8 @@ typedef struct { ); \ } while (0) +#define MONO_ARCH_HAS_MONO_CONTEXT 1 + #elif defined(__mono_ppc__) /* defined(__arm__) */ /* we define our own structure and we'll copy the data