diff options
Diffstat (limited to 'src/runtime/sys_windows_amd64.s')
| -rw-r--r-- | src/runtime/sys_windows_amd64.s | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/runtime/sys_windows_amd64.s b/src/runtime/sys_windows_amd64.s index 4e00f64fae..777726f7c1 100644 --- a/src/runtime/sys_windows_amd64.s +++ b/src/runtime/sys_windows_amd64.s @@ -8,6 +8,9 @@ #include "time_windows.h" #include "cgo/abi_amd64.h" +// Offsets into Thread Environment Block (pointer in GS) +#define TEB_TlsSlots 0x1480 + // void runtime·asmstdcall(void *c); TEXT runtime·asmstdcall(SB),NOSPLIT|NOFRAME,$0 // asmcgocall will put first argument into CX. @@ -303,10 +306,10 @@ TEXT runtime·tstart_stdcall(SB),NOSPLIT,$0 MOVQ AX, g_stackguard1(DX) // Set up tls. - LEAQ m_tls(CX), SI - MOVQ SI, 0x28(GS) + LEAQ m_tls(CX), DI MOVQ CX, g_m(DX) - MOVQ DX, g(SI) + MOVQ DX, g(DI) + CALL runtime·settls(SB) // clobbers CX CALL runtime·stackcheck(SB) // clobbers AX,CX CALL runtime·mstart(SB) @@ -318,7 +321,8 @@ TEXT runtime·tstart_stdcall(SB),NOSPLIT,$0 // set tls base to DI TEXT runtime·settls(SB),NOSPLIT,$0 - MOVQ DI, 0x28(GS) + MOVQ runtime·tls_g(SB), CX + MOVQ DI, 0(CX)(GS) RET // Runs on OS stack. @@ -404,3 +408,32 @@ TEXT runtime·osSetupTLS(SB),NOSPLIT,$0-8 LEAQ m_tls(AX), DI CALL runtime·settls(SB) RET + +// This is called from rt0_go, which runs on the system stack +// using the initial stack allocated by the OS. +TEXT runtime·wintls(SB),NOSPLIT|NOFRAME,$0 + // Allocate a TLS slot to hold g across calls to external code + MOVQ SP, AX + ANDQ $~15, SP // alignment as per Windows requirement + SUBQ $48, SP // room for SP and 4 args as per Windows requirement + // plus one extra word to keep stack 16 bytes aligned + MOVQ AX, 32(SP) + MOVQ runtime·_TlsAlloc(SB), AX + CALL AX + MOVQ 32(SP), SP + + MOVQ AX, CX // TLS index + + // Assert that slot is less than 64 so we can use _TEB->TlsSlots + CMPQ CX, $64 + JB ok + CALL runtime·abort(SB) +ok: + // Convert the TLS index at CX into + // an offset from TEB_TlsSlots. + SHLQ $3, CX + + // Save offset from TLS into tls_g. + ADDQ $TEB_TlsSlots, CX + MOVQ CX, runtime·tls_g(SB) + RET |
