diff options
| author | qmuntal <quimmuntal@gmail.com> | 2022-12-02 09:25:26 +0100 |
|---|---|---|
| committer | Quim Muntal <quimmuntal@gmail.com> | 2023-01-23 18:15:35 +0000 |
| commit | 28f8dbd7b941648aea311bb0cf331f88c02441b6 (patch) | |
| tree | 092c7e556a19d912f6665b9fefd0cb532b2671ae /src/runtime/asm_386.s | |
| parent | bb5ff5342d31723ecf245e8e53b79bce23b88839 (diff) | |
| download | go-28f8dbd7b941648aea311bb0cf331f88c02441b6.tar.xz | |
runtime,cmd/internal/obj/x86: use TEB TLS slots on windows/i386
This CL redesign how we get the TLS pointer on windows/i386.
It applies the same changes as done in CL 431775 for windows/amd64.
We were previously reading it from the [TEB] arbitrary data slot,
located at 0x14(FS), which can only hold 1 TLS pointer.
With this CL, we will read the TLS pointer from the TEB TLS slot array,
located at 0xE10(GS). The TLS slot array can hold multiple
TLS pointers, up to 64, so multiple Go runtimes running on the
same thread can coexists with different TLS.
Each new TLS slot has to be allocated via [TlsAlloc],
which returns the slot index. This index can then be used to get the
slot offset from GS with the following formula: 0xE10 + index*4.
The slot index is fixed per Go runtime, so we can store it
in runtime.tls_g and use it latter on to read/update the TLS pointer.
Loading the TLS pointer requires the following asm instructions:
MOVQ runtime.tls_g, AX
MOVQ AX(FS), AX
Notice that this approach will now be implemented in all the supported
windows arches.
[TEB]: https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
[TlsAlloc]: https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-tlsalloc
Change-Id: If4550b0d44694ee6480d4093b851f4991a088b32
Reviewed-on: https://go-review.googlesource.com/c/go/+/454675
Reviewed-by: Michael Pratt <mpratt@google.com>
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/runtime/asm_386.s')
| -rw-r--r-- | src/runtime/asm_386.s | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index e16880c950..02179d2ee9 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -171,8 +171,12 @@ nocpuinfo: MOVL $runtime·tls_g(SB), 8(SP) // arg 3: &tls_g #else MOVL $0, BX - MOVL BX, 12(SP) // arg 3,4: not used when using platform's TLS - MOVL BX, 8(SP) + MOVL BX, 12(SP) // arg 4: not used when using platform's TLS +#ifdef GOOS_windows + MOVL $runtime·tls_g(SB), 8(SP) // arg 3: &tls_g +#else + MOVL BX, 8(SP) // arg 3: not used when using platform's TLS +#endif #endif MOVL $setg_gcc<>(SB), BX MOVL BX, 4(SP) // arg 2: setg_gcc @@ -795,14 +799,15 @@ havem: TEXT runtime·setg(SB), NOSPLIT, $0-4 MOVL gg+0(FP), BX #ifdef GOOS_windows + MOVL runtime·tls_g(SB), CX CMPL BX, $0 JNE settls - MOVL $0, 0x14(FS) + MOVL $0, 0(CX)(FS) RET settls: MOVL g_m(BX), AX LEAL m_tls(AX), AX - MOVL AX, 0x14(FS) + MOVL AX, 0(CX)(FS) #endif get_tls(CX) MOVL BX, g(CX) @@ -867,6 +872,9 @@ rdtsc: JMP done TEXT ldt0setup<>(SB),NOSPLIT,$16-0 +#ifdef GOOS_windows + CALL runtime·wintls(SB) +#endif // set up ldt 7 to point at m0.tls // ldt 1 would be fine on Linux, but on OS X, 7 is as low as we can go. // the entry number is just a hint. setldt will set up GS with what it used. @@ -1577,3 +1585,6 @@ TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 DATA runtime·tls_g+0(SB)/4, $8 GLOBL runtime·tls_g+0(SB), NOPTR, $4 #endif +#ifdef GOOS_windows +GLOBL runtime·tls_g+0(SB), NOPTR, $4 +#endif |
