From 6a624fa5f5516d23db7ff2017271749f10e2b567 Mon Sep 17 00:00:00 2001 From: Wei Guangjing Date: Mon, 27 Sep 2010 09:44:56 -0400 Subject: [PATCH] libcgo: set g, m in thread local storage for windows 386. R=rsc CC=golang-dev, vcc https://golang.org/cl/2216051 --- src/libcgo/windows_386.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/libcgo/windows_386.c b/src/libcgo/windows_386.c index 62be9303ef..e221d69981 100755 --- a/src/libcgo/windows_386.c +++ b/src/libcgo/windows_386.c @@ -20,26 +20,36 @@ initcgo(void) void libcgo_sys_thread_start(ThreadStart *ts) { - ts->g->stackguard = STACKSIZE; - _beginthread(threadentry, STACKSIZE, ts); + ts->g->stackguard = STACKSIZE; + _beginthread(threadentry, STACKSIZE, ts); } static void* threadentry(void *v) { - ThreadStart ts; + ThreadStart ts; - ts = *(ThreadStart*)v; - free(v); + ts = *(ThreadStart*)v; + free(v); - ts.g->stackbase = (uintptr)&ts; + ts.g->stackbase = (uintptr)&ts; - /* - * libcgo_sys_thread_start set stackguard to stack size; - * change to actual guard pointer. - */ - ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; + /* + * libcgo_sys_thread_start set stackguard to stack size; + * change to actual guard pointer. + */ + ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; - crosscall_386(ts.fn); - return nil; + /* + * Set specific keys in thread local storage. + */ + asm volatile ( + "MOVL %%fs:0x2c, %%eax\n" // MOVL 0x24(FS), tmp + "movl %0, 0(%%eax)\n" // MOVL g, 0(FS) + "movl %1, 4(%%eax)\n" // MOVL m, 4(FS) + :: "r"(ts.g), "r"(ts.m) : "%eax" + ); + + crosscall_386(ts.fn); + return nil; }