runtime: provide initcontext and fixcontext for NetBSD
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Nov 2012 17:41:07 +0000 (17:41 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Nov 2012 17:41:07 +0000 (17:41 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193173 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/proc.c

index 8e82d12..43071e5 100644 (file)
@@ -82,7 +82,7 @@ fixcontext(ucontext_t *c __attribute__ ((unused)))
 {
 }
 
-# else
+#else
 
 # if defined(__x86_64__) && defined(__sun__)
 
@@ -110,6 +110,28 @@ fixcontext(ucontext_t* c)
        c->uc_mcontext.gregs[REG_FSBASE] = fs;
 }
 
+# elif defined(__NetBSD__)
+
+// NetBSD has a bug: setcontext clobbers tlsbase, we need to save
+// and restore it ourselves.
+
+static __thread __greg_t tlsbase;
+
+static inline void
+initcontext(void)
+{
+       ucontext_t c;
+
+       getcontext(&c);
+       tlsbase = c.uc_mcontext._mc_tlsbase;
+}
+
+static inline void
+fixcontext(ucontext_t* c)
+{
+       c->uc_mcontext._mc_tlsbase = tlsbase;
+}
+
 # else
 
 #  error unknown case for SETCONTEXT_CLOBBERS_TLS