Skip to content

Commit

Permalink
cmd/internal/obj/x86: mark 2-instruction TLS access nonpreemptible
Browse files Browse the repository at this point in the history
The 2-instruction TLS access sequence
	MOVQ TLS, BX
	MOVQ 0(BX)(TLS*1), BX
is not async preemptible, as if it is preempted and resumed on a
different thread, the TLS address may become invalid.

May fix #35349. (This is a rare failure and I haven't been able
to reproduce it.)

Change-Id: Ie1a366fd0d7d73627dc62ee2de01c0aa09365f2b
Reviewed-on: https://go-review.googlesource.com/c/go/+/206903
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Austin Clements <austin@google.com>
  • Loading branch information
cherrymui committed Nov 15, 2019
1 parent 03c58c9 commit 498eaee
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/cmd/internal/obj/x86/asm6.go
Expand Up @@ -1984,6 +1984,22 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) {
fmt.Printf(" rel %#.4x/%d %s%+d\n", uint32(r.Off), r.Siz, r.Sym.Name, r.Add)
}
}

// Mark nonpreemptible instruction sequences.
// The 2-instruction TLS access sequence
// MOVQ TLS, BX
// MOVQ 0(BX)(TLS*1), BX
// is not async preemptible, as if it is preempted and resumed on
// a different thread, the TLS address may become invalid.
if !CanUse1InsnTLS(ctxt) {
useTLS := func(p *obj.Prog) bool {
// Only need to mark the second instruction, which has
// REG_TLS as Index. (It is okay to interrupt and restart
// the first instruction.)
return p.From.Index == REG_TLS
}
obj.MarkUnsafePoints(ctxt, s.Func.Text, newprog, useTLS)
}
}

func instinit(ctxt *obj.Link) {
Expand Down

0 comments on commit 498eaee

Please sign in to comment.