]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: update newosproc asm to access m.id directly
authorMatthew Dempsky <mdempsky@google.com>
Thu, 12 Nov 2015 22:26:19 +0000 (14:26 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 12 Nov 2015 23:16:33 +0000 (23:16 +0000)
darwin/386, freebsd/386, and linux/386 use a setldt system call to
setup each M's thread-local storage area, and they need access to the
M's id for this.  The current code copies m.id into m.tls[0] (and this
logic has been cargo culted to OSes like NetBSD and OpenBSD, which
don't even need m.id to configure TLS), and then the 386 assembly
loads m.tls[0]... but since the assembly code already has a pointer to
the M, it might as well just load m.id directly.

Change-Id: I1a7278f1ec8ebda8d1de3aa3a61993070e3a8cdf
Reviewed-on: https://go-review.googlesource.com/16881
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/os1_darwin.go
src/runtime/os1_dragonfly.go
src/runtime/os1_freebsd.go
src/runtime/os1_linux.go
src/runtime/os1_netbsd.go
src/runtime/os1_openbsd.go
src/runtime/sys_darwin_386.s
src/runtime/sys_freebsd_386.s
src/runtime/sys_linux_386.s

index e07022997c81b56b79e150a154e8b81325afb75b..be710599df4fd09f1a0208621d9d8c8c186f9a7b 100644 (file)
@@ -78,9 +78,8 @@ func goenvs() {
 // May run with m.p==nil, so write barriers are not allowed.
 //go:nowritebarrier
 func newosproc(mp *m, stk unsafe.Pointer) {
-       mp.tls[0] = uintptr(mp.id) // so 386 asm can find it
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, "/", int(mp.tls[0]), " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n")
        }
 
        var oset uint32
index f96c78ca80a52370916d0e9ef15b63ffc9bd9d59..a1be981f56b88c4fc9417d683767df263cab1703 100644 (file)
@@ -74,7 +74,7 @@ func lwp_start(uintptr)
 //go:nowritebarrier
 func newosproc(mp *m, stk unsafe.Pointer) {
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " lwp_start=", funcPC(lwp_start), " id=", mp.id, "/", mp.tls[0], " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " lwp_start=", funcPC(lwp_start), " id=", mp.id, " ostk=", &mp, "\n")
        }
 
        var oset sigset
@@ -88,8 +88,6 @@ func newosproc(mp *m, stk unsafe.Pointer) {
                tid2:       nil,
        }
 
-       mp.tls[0] = uintptr(mp.id) // XXX so 386 asm can find it
-
        lwp_create(&params)
        sigprocmask(_SIG_SETMASK, &oset, nil)
 }
index faf27f411cf33af31e89e0d7e965d61771159fa4..a325620fe6d02cd79af47d4a9f4889e26ae784bd 100644 (file)
@@ -73,7 +73,7 @@ func thr_start()
 //go:nowritebarrier
 func newosproc(mp *m, stk unsafe.Pointer) {
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " thr_start=", funcPC(thr_start), " id=", mp.id, "/", mp.tls[0], " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " thr_start=", funcPC(thr_start), " id=", mp.id, " ostk=", &mp, "\n")
        }
 
        // NOTE(rsc): This code is confused. stackbase is the top of the stack
@@ -88,7 +88,6 @@ func newosproc(mp *m, stk unsafe.Pointer) {
                tls_base:   unsafe.Pointer(&mp.tls[0]),
                tls_size:   unsafe.Sizeof(mp.tls),
        }
-       mp.tls[0] = uintptr(mp.id) // so 386 asm can find it
 
        var oset sigset
        sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
index aa62faa0f1d0beb0f9c2f1bf5d624a74ad9265d8..8b5cdd346557daef0ac631cfbea3295a28e9cb09 100644 (file)
@@ -133,9 +133,8 @@ func newosproc(mp *m, stk unsafe.Pointer) {
        /*
         * note: strace gets confused if we use CLONE_PTRACE here.
         */
-       mp.tls[0] = uintptr(mp.id) // so 386 asm can find it
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " clone=", funcPC(clone), " id=", mp.id, "/", mp.tls[0], " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " clone=", funcPC(clone), " id=", mp.id, " ostk=", &mp, "\n")
        }
 
        // Disable signals during clone, so that the new thread starts
index 6e6a77f79939714d04b206e1b6b63c1eaf087cd1..b127c64ff4d9e5fed2ef00e3f8e2b9b11b9c13b1 100644 (file)
@@ -95,11 +95,9 @@ func semawakeup(mp *m) {
 //go:nowritebarrier
 func newosproc(mp *m, stk unsafe.Pointer) {
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, "/", int32(mp.tls[0]), " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n")
        }
 
-       mp.tls[0] = uintptr(mp.id) // so 386 asm can find it
-
        var uc ucontextt
        getcontext(unsafe.Pointer(&uc))
 
index 2eb6e8beddf5feb7c5a75a42fc8b9b9257df9120..beda59789c035499f258ac507ddad9d1bcd2e679 100644 (file)
@@ -105,11 +105,9 @@ func semawakeup(mp *m) {
 //go:nowritebarrier
 func newosproc(mp *m, stk unsafe.Pointer) {
        if false {
-               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, "/", int32(mp.tls[0]), " ostk=", &mp, "\n")
+               print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n")
        }
 
-       mp.tls[0] = uintptr(mp.id) // so 386 asm can find it
-
        param := tforkt{
                tf_tcb:   unsafe.Pointer(&mp.tls[0]),
                tf_tid:   (*int32)(unsafe.Pointer(&mp.procid)),
index abc5d3297ab3ea57aad6538c42a02bc01ef61b10..87a9038041e786a067d2a116220445ff7532fb7f 100644 (file)
@@ -361,10 +361,8 @@ TEXT runtime·bsdthread_create(SB),NOSPLIT,$32
 //     SP = stack - C_32_STK_ALIGN
 TEXT runtime·bsdthread_start(SB),NOSPLIT,$0
        // set up ldt 7+id to point at m->tls.
-       // m->tls is at m+40.  newosproc left
-       // the m->id in tls[0].
        LEAL    m_tls(DX), BP
-       MOVL    0(BP), DI
+       MOVL    m_id(DX), DI
        ADDL    $7, DI  // m0 is LDT#7. count up.
        // setldt(tls#, &tls, sizeof tls)
        PUSHAL  // save registers
index b2dd7802df33939e001b29df0ac51a1816c97343..3aaeede6be987a0eaa7bae5f38eb9d7e63667e0f 100644 (file)
@@ -25,7 +25,7 @@ TEXT runtime·thr_start(SB),NOSPLIT,$0
        MOVL    mm+0(FP), AX
        MOVL    m_g0(AX), BX
        LEAL    m_tls(AX), BP
-       MOVL    0(BP), DI
+       MOVL    m_id(AX), DI
        ADDL    $7, DI
        PUSHAL
        PUSHL   $32
index ae8e3dc3b77a8302f9401b2a793cde0b2f7a69a2..d26b25e987b7f4a18348b850d4c1fd6acf676f19 100644 (file)
@@ -334,9 +334,8 @@ TEXT runtime·clone(SB),NOSPLIT,$0
        MOVL    AX, m_procid(BX)        // save tid as m->procid
 
        // set up ldt 7+id to point at m->tls.
-       // newosproc left the id in tls[0].
        LEAL    m_tls(BX), BP
-       MOVL    0(BP), DI
+       MOVL    m_id(BX), DI
        ADDL    $7, DI  // m0 is LDT#7. count up.
        // setldt(tls#, &tls, sizeof tls)
        PUSHAL  // save registers