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