]> Cypherpunks repositories - gostls13.git/commitdiff
libcgo: set g, m in thread local storage for windows 386.
authorWei Guangjing <vcc.163@gmail.com>
Mon, 27 Sep 2010 13:44:56 +0000 (09:44 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 27 Sep 2010 13:44:56 +0000 (09:44 -0400)
R=rsc
CC=golang-dev, vcc
https://golang.org/cl/2216051

src/libcgo/windows_386.c

index 62be9303eff2804b5afcf9ae7db376372c4727b1..e221d69981077ca802674e6f926adba0d24d3d2a 100755 (executable)
@@ -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;
-
-    ts = *(ThreadStart*)v;
-    free(v);
-
-    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;
-
-    crosscall_386(ts.fn);
-    return nil;
+       ThreadStart ts;
+
+       ts = *(ThreadStart*)v;
+       free(v);
+
+       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;
+
+       /*
+        * 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;
 }