Index: fusl/arch/sh/src/__set_thread_area.c |
diff --git a/fusl/arch/sh/src/__set_thread_area.c b/fusl/arch/sh/src/__set_thread_area.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d3e02258b622850b30a62e176d8b150a4596797 |
--- /dev/null |
+++ b/fusl/arch/sh/src/__set_thread_area.c |
@@ -0,0 +1,34 @@ |
+#include "pthread_impl.h" |
+#include "libc.h" |
+#include "sh_atomic.h" |
+#include <elf.h> |
+ |
+/* Also perform sh-specific init */ |
+ |
+#define CPU_HAS_LLSC 0x0040 |
+ |
+__attribute__((__visibility__("hidden"))) unsigned __sh_atomic_model, __sh_nommu; |
+ |
+int __set_thread_area(void *p) |
+{ |
+ size_t *aux; |
+ __asm__ __volatile__ ( "ldc %0, gbr" : : "r"(p) : "memory" ); |
+#ifndef __SH4A__ |
+ if (__hwcap & CPU_HAS_LLSC) { |
+ __sh_atomic_model = SH_A_LLSC; |
+ return 0; |
+ } |
+#if !defined(__SH3__) && !defined(__SH4__) |
+ for (aux=libc.auxv; *aux; aux+=2) { |
+ if (*aux != AT_PLATFORM) continue; |
+ const char *s = (void *)aux[1]; |
+ if (s[0]!='s' || s[1]!='h' || s[2]!='2' || s[3]-'0'<10u) break; |
+ __sh_atomic_model = SH_A_IMASK; |
+ __sh_nommu = 1; |
+ return 0; |
+ } |
+#endif |
+ /* __sh_atomic_model = SH_A_GUSA; */ /* 0, default */ |
+#endif |
+ return 0; |
+} |