aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Guangjing <vcc.163@gmail.com>2010-09-27 09:44:56 -0400
committerRuss Cox <rsc@golang.org>2010-09-27 09:44:56 -0400
commit6a624fa5f5516d23db7ff2017271749f10e2b567 (patch)
tree0f22d5ef4f9f5b806af95525c5d6f4f4eb115e55
parentf2db47d427b898be77f0e02828b95ee7d834dbf9 (diff)
downloadgo-6a624fa5f5516d23db7ff2017271749f10e2b567.tar.xz
libcgo: set g, m in thread local storage for windows 386.
R=rsc CC=golang-dev, vcc https://golang.org/cl/2216051
-rwxr-xr-xsrc/libcgo/windows_386.c36
1 files 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;
}