Fix wrong conditional
[mono.git] / mono / utils / mono-context.h
index 6a8fb6eb8ac3c511e9926bee0616adda7536e604..a1395f0d8090f7fc109edbb150ee20e01186cbb7 100644 (file)
@@ -25,7 +25,7 @@
  * MONO_CONTEXT_GET_CURRENT captures the current context as close as possible. One reg might be clobbered
  *  to hold the address of the target MonoContext. It will be a caller save one, so should not be a problem.
  */
-#if defined(__i386__)
+#if (defined(__i386__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_X86))
 
 /*HACK, move this to an eventual mono-signal.c*/
 #if defined( __linux__) || defined(__sun) || defined(__APPLE__) || defined(__NetBSD__) || \
@@ -121,8 +121,11 @@ typedef struct {
        : "a" (&(ctx))  \
        : "memory")
 
+#if !defined(HOST_WIN32)
+#define MONO_ARCH_HAS_MONO_CONTEXT 1
+#endif
 
-#elif defined(__x86_64__) /* defined(__i386__) */
+#elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */
 
 
 #if !defined( HOST_WIN32 ) && !defined(__native_client__) && !defined(__native_client_codegen__)
@@ -159,6 +162,31 @@ typedef struct {
 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->rbp))
 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->rsp))
 
+#if defined(__native_client__)
+#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 %%rsi, %%nacl:0x30(%%r15, %0, 1)\n"       \
+               "movq %%rdi, %%nacl:0x38(%%r15, %0, 1)\n"       \
+               "movq %%r8,  %%nacl:0x40(%%r15, %0, 1)\n"       \
+               "movq %%r9,  %%nacl:0x48(%%r15, %0, 1)\n"       \
+               "movq %%r10, %%nacl:0x50(%%r15, %0, 1)\n"       \
+               "movq %%r11, %%nacl:0x58(%%r15, %0, 1)\n"       \
+               "movq %%r12, %%nacl:0x60(%%r15, %0, 1)\n"       \
+               "movq %%r13, %%nacl:0x68(%%r15, %0, 1)\n"       \
+               "movq %%r14, %%nacl:0x70(%%r15, %0, 1)\n"       \
+               "movq %%r15, %%nacl:0x78(%%r15, %0, 1)\n"       \
+               "leaq (%%rip), %%rdx\n" \
+               "movq %%rdx, %%nacl:0x80(%%r15, %0, 1)\n"       \
+               :       \
+               : "a" ((int64_t)&(ctx)) \
+               : "rdx", "memory")
+#else
 #define MONO_CONTEXT_GET_CURRENT(ctx)  \
        __asm__ __volatile__(   \
                "movq $0x0,  0x00(%0)\n"        \
@@ -182,6 +210,11 @@ typedef struct {
                :       \
                : "a" (&(ctx))  \
                : "rdx", "memory")
+#endif
+
+#if !defined(HOST_WIN32)
+#define MONO_ARCH_HAS_MONO_CONTEXT 1
+#endif
 
 #elif defined(__arm__) /* defined(__x86_64__) */
 
@@ -190,6 +223,7 @@ typedef struct {
        gulong esp;          // sp
        gulong regs [16];
        double fregs [8];
+       gulong cpsr;
 } MonoContext;
 
 /* we have the stack pointer, not the base pointer in sigcontext */
@@ -354,6 +388,8 @@ typedef struct {
 
 #elif defined(__s390x__)
 
+#define MONO_ARCH_HAS_MONO_CONTEXT 1
+
 typedef struct ucontext MonoContext;
 
 #define MONO_CONTEXT_SET_IP(ctx,ip)                                    \
@@ -375,24 +411,8 @@ typedef struct ucontext MonoContext;
 
 #define MONO_CONTEXT_GET_CURRENT(ctx)  \
        __asm__ __volatile__(   \
-               "stg    %%r0,0x00(%0)\n\t"      \
-               "stg    %%r1,0x08(%0)\n\t"      \
-               "stg    %%r2,0x10(%0)\n\t"      \
-               "stg    %%r3,0x18(%0)\n\t"      \
-               "stg    %%r4,0x20(%0)\n\t"      \
-               "stg    %%r5,0x28(%0)\n\t"      \
-               "stg    %%r6,0x30(%0)\n\t"      \
-               "stg    %%r7,0x38(%0)\n\t"      \
-               "stg    %%r8,0x40(%0)\n\t"      \
-               "stg    %%r9,0x48(%0)\n\t"      \
-               "stg    %%r10,0x50(%0)\n\t"     \
-               "stg    %%r11,0x58(%0)\n\t"     \
-               "stg    %%r12,0x60(%0)\n\t"     \
-               "stg    %%r13,0x68(%0)\n\t"     \
-               "stg    %%r14,0x70(%0)\n\t"     \
-               "stg    %%r15,0x78(%0)\n"       \
-               : "=&a" (ptr)                   \
-               : "0" (cur_thread_regs)         \
+               "stmg   %%r0,%%r15,0(%0)\n"     \
+               : : "r" (&(ctx).uc_mcontext.gregs[0])   \
                : "memory"                      \
        )