copying the latest Sys.Web.Services from trunk.
[mono.git] / mono / mini / mini-sparc.h
index 0e8acbe71ce142c179305efeea6dd917e4db3b26..984f63d633e8c88381be7d90a12a38dd338dd87c 100644 (file)
@@ -49,9 +49,17 @@ typedef struct MonoCompileArch {
 #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->fp))
 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sp))
 
+#define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do {       \
+               mono_arch_flush_register_windows ();    \
+               MONO_CONTEXT_SET_IP ((ctx), (start_func));      \
+               MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0));       \
+       } while (0)
+
 #define MONO_ARCH_USE_SIGACTION 1
 
-//#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+#ifdef HAVE_WORKING_SIGALTSTACK
+#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+#endif
 
 #define MONO_ARCH_EMULATE_FCONV_TO_I8   1
 #define MONO_ARCH_EMULATE_LCONV_TO_R8   1
@@ -60,6 +68,7 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
 #define MONO_ARCH_EMULATE_FREM 1
 #define MONO_ARCH_NEED_DIV_CHECK 1
+#define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
 
 #ifdef SPARCV9
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
@@ -77,9 +86,15 @@ static void * __builtin_return_address(int depth)
        asm("sub     %i0, 1, %i0");
        asm("tst     %i0");
        asm("bne     retAddr_Start");
+#if SPARCV9
+       asm("ldx     [%l0+2159], %l0");
+       asm("retAddr_End:");
+       asm("ldx     [%l0+2167], %i0");
+#else
        asm("ld      [%l0+56], %l0");
        asm("retAddr_End:");
        asm("ld      [%l0+60], %i0");
+#endif
 }
 
 static void * __builtin_frame_address(int depth)
@@ -92,9 +107,15 @@ static void * __builtin_frame_address(int depth)
        asm("sub     %i0, 1, %i0");
        asm("tst     %i0");
        asm("bne     frameAddr_Start");
+#if SPARCV9
+       asm("ldx     [%l0+2159], %l0");
+       asm("frameAddr_End:");
+       asm("ldx     [%l0+2159], %i0");
+#else
        asm("ld      [%l0+56], %l0");
        asm("frameAddr_End:");
        asm("ld      [%l0+56], %i0");
+#endif
 }
 #endif