diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-11-05 17:41:07 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-11-05 17:41:07 +0000 |
commit | 0be1a5898f27445828da307df1c8cd62c800be03 (patch) | |
tree | f7b1e226211617dcc317d0413f922d7679e09a20 | |
parent | ae0b23e2ff5be275111cc9aa4ff46fafb0b93738 (diff) | |
download | gcc-0be1a5898f27445828da307df1c8cd62c800be03.zip gcc-0be1a5898f27445828da307df1c8cd62c800be03.tar.gz gcc-0be1a5898f27445828da307df1c8cd62c800be03.tar.bz2 |
runtime: provide initcontext and fixcontext for NetBSD
From-SVN: r193173
-rw-r--r-- | libgo/runtime/proc.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 8e82d12..43071e5 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -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 |