Hi,<div><br></div><div>  Applied to SVN HEAD/2.6 branch.</div><div><br></div><div>         thanks</div><div><br></div><div>                   Zoltan<br><br><div class="gmail_quote">On Thu, Mar 4, 2010 at 12:14 PM, David Miller <span dir="ltr">&lt;<a href="mailto:davem@davemloft.net">davem@davemloft.net</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
This was the minimal set of changes I needed to get mainline<br>
to build for me.<br>
<br>
libgc/<br>
<br>
2010-03-04  David S. Miller  &lt;<a href="mailto:davem@davemloft.net">davem@davemloft.net</a>&gt;<br>
<br>
        * include/private/gc_locks.h: Add SPARC implementations of<br>
        GC_compare_and_exchange and GC_memory_barrier.<br>
<br>
mono/mini/<br>
<br>
2010-03-04  David S. Miller  &lt;<a href="mailto:davem@davemloft.net">davem@davemloft.net</a>&gt;<br>
<br>
        * mini-sparc.h: Always use MONO_ARCH_USE_SIGACTION.  Linux kernels<br>
        that don&#39;t provide the siginfo in the second signal handler argument<br>
        are buggy, and this has been fixed for years.<br>
        * mini.h (GET_CONTEXT): Remove __sparc__ special case.<br>
        (SIG_HANDLER_SIGNATURE, SIG_HANDLER_PARMS): Likewise.<br>
<br>
diff --git a/libgc/include/private/gc_locks.h b/libgc/include/private/gc_locks.h<br>
index 23a506a..1cbcbd6 100644<br>
--- a/libgc/include/private/gc_locks.h<br>
+++ b/libgc/include/private/gc_locks.h<br>
@@ -500,6 +500,51 @@<br>
         }<br>
 #     endif /* POWERPC */<br>
<br>
+#     if defined(SPARC)<br>
+#      if !defined(GENERIC_COMPARE_AND_SWAP)<br>
+#       if CPP_WORDSZ == 64<br>
+        /* Returns TRUE if the comparison succeeded. */<br>
+        inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr,<br>
+            GC_word old, GC_word new_val)<br>
+        {<br>
+            unsigned long result;<br>
+            __asm__ __volatile__(<br>
+               &quot;casx [%2], %3, %0&quot;<br>
+                :  &quot;=r&quot; (result)<br>
+                :  &quot;0&quot; (new_val), &quot;r&quot; (addr), &quot;r&quot; (old)<br>
+                : &quot;memory&quot;);<br>
+            return (GC_bool) (result == old);<br>
+        }<br>
+#       else<br>
+        /* Returns TRUE if the comparison succeeded. */<br>
+        inline static GC_bool GC_compare_and_exchange(volatile GC_word *_addr,<br>
+            GC_word _old, GC_word _new_val)<br>
+        {<br>
+           register unsigned long result asm(&quot;o0&quot;);<br>
+           register unsigned long old asm(&quot;o1&quot;);<br>
+           register volatile GC_word *addr asm(&quot;o2&quot;);<br>
+           result = _new_val;<br>
+           old = _old;<br>
+           addr = _addr;<br>
+            __asm__ __volatile__(<br>
+               /* We encode the instruction directly so that it<br>
+                  doesn&#39;t taint the whole binary as v9-only.  */<br>
+               &quot;.word 0xd1e29009&quot; /* cas [%o2], %o1, %o0 */<br>
+                :  &quot;=r&quot; (result)<br>
+                :  &quot;0&quot; (result), &quot;r&quot; (addr), &quot;r&quot;(old)<br>
+                : &quot;memory&quot;);<br>
+            return (GC_bool) (result == old);<br>
+        }<br>
+#       endif<br>
+#      endif /* !GENERIC_COMPARE_AND_SWAP */<br>
+        inline static void GC_memory_barrier()<br>
+        {<br>
+           /* All sparc v9 chips provice procesor consistent ordering. */<br>
+           /* Thus a compiler barrier should suffice.                  */<br>
+            __asm__ __volatile__(&quot;&quot; : : : &quot;memory&quot;);<br>
+        }<br>
+#     endif /* SPARC */<br>
+<br>
 #     if defined(IA64)<br>
 #      if !defined(GENERIC_COMPARE_AND_SWAP)<br>
          inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr,<br>
diff --git a/mono/mini/mini-sparc.h b/mono/mini/mini-sparc.h<br>
index 5cc2ec4..3f3eefd 100644<br>
--- a/mono/mini/mini-sparc.h<br>
+++ b/mono/mini/mini-sparc.h<br>
@@ -100,14 +100,7 @@ typedef struct MonoCompileArch {<br>
                MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0));       \<br>
        } while (0)<br>
<br>
-#ifndef __linux__<br>
-/*<br>
- * Can&#39;t use sigaction on sparc/linux, since it doesn&#39;t support SA_SIGINFO. Instead, we<br>
- * have to use the obsolete sigcontext parameter:<br>
- * <a href="http://www.ussg.iu.edu/hypermail/linux/kernel/0110.3/1531.html" target="_blank">http://www.ussg.iu.edu/hypermail/linux/kernel/0110.3/1531.html</a>.<br>
- */<br>
 #define MONO_ARCH_USE_SIGACTION 1<br>
-#endif<br>
<br>
 #ifdef HAVE_WORKING_SIGALTSTACK<br>
 /*#define MONO_ARCH_SIGSEGV_ON_ALTSTACK*/<br>
diff --git a/mono/mini/mini.h b/mono/mini/mini.h<br>
index 2410f7b..17432be 100644<br>
--- a/mono/mini/mini.h<br>
+++ b/mono/mini/mini.h<br>
@@ -2061,9 +2061,6 @@ gboolean mono_gdb_render_native_backtraces (void) MONO_INTERNAL;<br>
 #ifdef MONO_ARCH_USE_SIGACTION<br>
 #define GET_CONTEXT \<br>
     void *ctx = context;<br>
-#elif defined(__sparc__)<br>
-#define GET_CONTEXT \<br>
-    void *ctx = sigctx;<br>
 #else<br>
 #define GET_CONTEXT \<br>
        void **_p = (void **)&amp;_dummy; \<br>
@@ -2078,9 +2075,6 @@ gboolean mono_gdb_render_native_backtraces (void) MONO_INTERNAL;<br>
 #elif defined(HOST_WIN32)<br>
 #define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy, EXCEPTION_RECORD *info, void *context)<br>
 #define SIG_HANDLER_PARAMS _dummy, info, context<br>
-#elif defined(__sparc__)<br>
-#define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy, void *sigctx)<br>
-#define SIG_HANDLER_PARAMS _dummy, sigctx<br>
 #else<br>
 #define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy)<br>
 #define SIG_HANDLER_PARAMS _dummy<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>