diff options
author | Devon H. O'Dell <devon.odell@gmail.com> | 2009-11-18 16:51:59 -0800 |
---|---|---|
committer | Devon H. O'Dell <devon.odell@gmail.com> | 2009-11-18 16:51:59 -0800 |
commit | 3419c5d5da2456a276014cd49bbd3a997d8e800d (patch) | |
tree | b352e4a4b26f78361493fada2a289b6b2d12045c /src/libcgo | |
parent | ad87c7b9f4fffa6c7985c204b39792f64f756eae (diff) | |
download | golang-3419c5d5da2456a276014cd49bbd3a997d8e800d.tar.gz |
More FreeBSD-touchups. Thundercats are GOOOOO!
R=rsc
CC=golang-dev
http://codereview.appspot.com/157074
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/libcgo')
-rw-r--r-- | src/libcgo/freebsd_386.c | 18 | ||||
-rw-r--r-- | src/libcgo/freebsd_amd64.c | 3 |
2 files changed, 15 insertions, 6 deletions
diff --git a/src/libcgo/freebsd_386.c b/src/libcgo/freebsd_386.c index 1f596f861..b445b940a 100644 --- a/src/libcgo/freebsd_386.c +++ b/src/libcgo/freebsd_386.c @@ -6,15 +6,13 @@ #include "libcgo.h" static void* threadentry(void*); -static pthread_key_t k1, k2; -/* gccism: arrange for inittls to be called at dynamic load time */ -static void inittls(void) __attribute__((constructor)); +char *environ[] = { 0 }; +char *__progname; static void inittls(void) { - /* unimplemented for now */ } void @@ -51,8 +49,16 @@ threadentry(void *v) */ ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; - pthread_setspecific(k1, (void*)ts.g); - pthread_setspecific(k2, (void*)ts.m); + /* + * Set specific keys. On FreeBSD/ELF, the thread local storage + * is just before %gs:0. Our dynamic 8.out's reserve 8 bytes + * for the two words g and m at %gs:-8 and %gs:-4. + */ + asm volatile ( + "movl %0, %%gs:-8\n" // MOVL g, -8(GS) + "movl %1, %%gs:-4\n" // MOVL m, -4(GS) + :: "r"(ts.g), "r"(ts.m) + ); crosscall_386(ts.fn); return nil; diff --git a/src/libcgo/freebsd_amd64.c b/src/libcgo/freebsd_amd64.c index 14a409f5e..4eb0e1ee5 100644 --- a/src/libcgo/freebsd_amd64.c +++ b/src/libcgo/freebsd_amd64.c @@ -7,6 +7,9 @@ static void* threadentry(void*); +char *environ[] = { 0 }; +char *__progname; + void initcgo(void) { |