summaryrefslogtreecommitdiff
path: root/src/libcgo
diff options
context:
space:
mode:
authorDevon H. O'Dell <devon.odell@gmail.com>2009-11-18 16:51:59 -0800
committerDevon H. O'Dell <devon.odell@gmail.com>2009-11-18 16:51:59 -0800
commit3419c5d5da2456a276014cd49bbd3a997d8e800d (patch)
treeb352e4a4b26f78361493fada2a289b6b2d12045c /src/libcgo
parentad87c7b9f4fffa6c7985c204b39792f64f756eae (diff)
downloadgolang-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.c18
-rw-r--r--src/libcgo/freebsd_amd64.c3
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)
{