Merge pull request #704 from jgagnon/master
[mono.git] / mono / utils / mono-context.h
index 33a821a198a9bd57851f752fb29a49cd3619b75d..dc53e857aae60158bae7474d76c8a662dcdd8465 100644 (file)
@@ -17,7 +17,7 @@
 #include <signal.h>
 #endif
 
-#ifdef HOST_WATCHOS
+#if defined (HOST_WATCHOS) || defined (HOST_APPLETVOS)
 #include <libunwind.h>
 #endif
 
@@ -183,11 +183,11 @@ extern void mono_context_get_current (void *);
 #define MONO_CONTEXT_GET_CURRENT(ctx)  \
        __asm__ __volatile__(   \
                "movq $0x0,  %%nacl:0x00(%%r15, %0, 1)\n"       \
-               "movq %%rbx, %%nacl:0x08(%%r15, %0, 1)\n"       \
-               "movq %%rcx, %%nacl:0x10(%%r15, %0, 1)\n"       \
-               "movq %%rdx, %%nacl:0x18(%%r15, %0, 1)\n"       \
-               "movq %%rbp, %%nacl:0x20(%%r15, %0, 1)\n"       \
-               "movq %%rsp, %%nacl:0x28(%%r15, %0, 1)\n"       \
+               "movq %%rcx, %%nacl:0x08(%%r15, %0, 1)\n"       \
+               "movq %%rdx, %%nacl:0x10(%%r15, %0, 1)\n"       \
+               "movq %%rbx, %%nacl:0x18(%%r15, %0, 1)\n"       \
+               "movq %%rsp, %%nacl:0x20(%%r15, %0, 1)\n"       \
+               "movq %%rbp, %%nacl:0x28(%%r15, %0, 1)\n"       \
                "movq %%rsi, %%nacl:0x30(%%r15, %0, 1)\n"       \
                "movq %%rdi, %%nacl:0x38(%%r15, %0, 1)\n"       \
                "movq %%r8,  %%nacl:0x40(%%r15, %0, 1)\n"       \
@@ -204,14 +204,15 @@ extern void mono_context_get_current (void *);
                : "a" ((int64_t)&(ctx)) \
                : "rdx", "memory")
 #else
+
 #define MONO_CONTEXT_GET_CURRENT(ctx)  \
        __asm__ __volatile__(   \
                "movq $0x0,  0x00(%0)\n"        \
-               "movq %%rbx, 0x08(%0)\n"        \
-               "movq %%rcx, 0x10(%0)\n"        \
-               "movq %%rdx, 0x18(%0)\n"        \
-               "movq %%rbp, 0x20(%0)\n"        \
-               "movq %%rsp, 0x28(%0)\n"        \
+               "movq %%rcx, 0x08(%0)\n"        \
+               "movq %%rdx, 0x10(%0)\n"        \
+               "movq %%rbx, 0x18(%0)\n"        \
+               "movq %%rsp, 0x20(%0)\n"        \
+               "movq %%rbp, 0x28(%0)\n"        \
                "movq %%rsi, 0x30(%0)\n"        \
                "movq %%rdi, 0x38(%0)\n"        \
                "movq %%r8,  0x40(%0)\n"        \
@@ -324,6 +325,15 @@ 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_APPLETVOS)
+
+#define MONO_CONTEXT_GET_CURRENT(ctx) do { \
+       fprintf (stderr, "MONO_CONTEXT_GET_CURRENT: Not implemented"); \
+       g_error ("MONO_CONTEXT_GET_CURRENT: Not implemented"); \
+} while (0);
+
+#else
+
 #define MONO_CONTEXT_GET_CURRENT(ctx)  do {    \
        __asm__ __volatile__(                   \
                "mov x16, %0\n" \
@@ -350,14 +360,16 @@ typedef struct {
                : "x30", "memory"                       \
        );                                                              \
        __asm__ __volatile__( \
-               "adr %0, L0\n" \
-               "L0:\n" \
+               "adr %0, L0%=\n" \
+               "L0%=:\n"       \
                : "=r" (ctx.pc)         \
                :                                       \
                : "memory"                       \
        ); \
 } while (0)
 
+#endif
+
 #define MONO_ARCH_HAS_MONO_CONTEXT 1
 
 #elif defined(__mono_ppc__) /* defined(__arm__) */
@@ -368,6 +380,100 @@ typedef struct {
  * We might also want to add an additional field to propagate
  * the original context from the signal handler.
  */
+#ifdef __mono_ppc64__
+
+typedef struct {
+       gulong sc_ir;          // pc 
+       gulong sc_sp;          // r1
+       mgreg_t regs [32];
+       double fregs [32];
+} MonoContext;
+
+/* we have the stack pointer, not the base pointer in sigcontext */
+#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->sc_ir = (gulong)ip; } while (0);
+#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->sc_sp = (gulong)bp; } while (0);
+#define MONO_CONTEXT_SET_SP(ctx,sp) do { (ctx)->sc_sp = (gulong)sp; } while (0);
+
+#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->sc_ir))
+#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->regs [ppc_r31-13]))
+#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_sp))
+
+#define MONO_CONTEXT_GET_CURRENT(ctx)  \
+       __asm__ __volatile__(   \
+               "std 0, 0(%0)\n"        \
+               "std 1, 8(%0)\n"        \
+               "std 0, 8*0+16(%0)\n"   \
+               "std 1, 8*1+16(%0)\n"   \
+               "std 2, 8*2+16(%0)\n"   \
+               "std 3, 8*3+16(%0)\n"   \
+               "std 4, 8*4+16(%0)\n"   \
+               "std 5, 8*5+16(%0)\n"   \
+               "std 6, 8*6+16(%0)\n"   \
+               "std 7, 8*7+16(%0)\n"   \
+               "std 8, 8*8+16(%0)\n"   \
+               "std 9, 8*9+16(%0)\n"   \
+               "std 10, 8*10+16(%0)\n" \
+               "std 11, 8*11+16(%0)\n" \
+               "std 12, 8*12+16(%0)\n" \
+               "std 13, 8*13+16(%0)\n" \
+               "std 14, 8*14+16(%0)\n" \
+               "std 15, 8*15+16(%0)\n" \
+               "std 16, 8*16+16(%0)\n" \
+               "std 17, 8*17+16(%0)\n" \
+               "std 18, 8*18+16(%0)\n" \
+               "std 19, 8*19+16(%0)\n" \
+               "std 20, 8*20+16(%0)\n" \
+               "std 21, 8*21+16(%0)\n" \
+               "std 22, 8*22+16(%0)\n" \
+               "std 23, 8*23+16(%0)\n" \
+               "std 24, 8*24+16(%0)\n" \
+               "std 25, 8*25+16(%0)\n" \
+               "std 26, 8*26+16(%0)\n" \
+               "std 27, 8*27+16(%0)\n" \
+               "std 28, 8*28+16(%0)\n" \
+               "std 29, 8*29+16(%0)\n" \
+               "std 30, 8*30+16(%0)\n" \
+               "std 31, 8*31+16(%0)\n" \
+               "stfd 0, 8*0+8*32+16(%0)\n"     \
+               "stfd 1, 8*1+8*32+16(%0)\n"     \
+               "stfd 2, 8*2+8*32+16(%0)\n"     \
+               "stfd 3, 8*3+8*32+16(%0)\n"     \
+               "stfd 4, 8*4+8*32+16(%0)\n"     \
+               "stfd 5, 8*5+8*32+16(%0)\n"     \
+               "stfd 6, 8*6+8*32+16(%0)\n"     \
+               "stfd 7, 8*7+8*32+16(%0)\n"     \
+               "stfd 8, 8*8+8*32+16(%0)\n"     \
+               "stfd 9, 8*9+8*32+16(%0)\n"     \
+               "stfd 10, 8*10+8*32+16(%0)\n"   \
+               "stfd 11, 8*11+8*32+16(%0)\n"   \
+               "stfd 12, 8*12+8*32+16(%0)\n"   \
+               "stfd 13, 8*13+8*32+16(%0)\n"   \
+               "stfd 14, 8*14+8*32+16(%0)\n"   \
+               "stfd 15, 8*15+8*32+16(%0)\n"   \
+               "stfd 16, 8*16+8*32+16(%0)\n"   \
+               "stfd 17, 8*17+8*32+16(%0)\n"   \
+               "stfd 18, 8*18+8*32+16(%0)\n"   \
+               "stfd 19, 8*19+8*32+16(%0)\n"   \
+               "stfd 20, 8*20+8*32+16(%0)\n"   \
+               "stfd 21, 8*21+8*32+16(%0)\n"   \
+               "stfd 22, 8*22+8*32+16(%0)\n"   \
+               "stfd 23, 8*23+8*32+16(%0)\n"   \
+               "stfd 24, 8*24+8*32+16(%0)\n"   \
+               "stfd 25, 8*25+8*32+16(%0)\n"   \
+               "stfd 26, 8*26+8*32+16(%0)\n"   \
+               "stfd 27, 8*27+8*32+16(%0)\n"   \
+               "stfd 28, 8*28+8*32+16(%0)\n"   \
+               "stfd 29, 8*29+8*32+16(%0)\n"   \
+               "stfd 30, 8*30+8*32+16(%0)\n"   \
+               "stfd 31, 8*31+8*32+16(%0)\n"   \
+               : : "r" (&(ctx))        \
+               : "memory"                      \
+       )
+
+#define MONO_ARCH_HAS_MONO_CONTEXT 1
+
+#else 
+
 typedef struct {
        gulong sc_ir;          // pc 
        gulong sc_sp;          // r1
@@ -384,6 +490,7 @@ typedef struct {
 #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->sc_ir))
 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->regs [ppc_r31-13]))
 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_sp))
+#endif
 
 #elif defined(__sparc__) || defined(sparc) /* defined(__mono_ppc__) */