• Russ Cox's avatar
    runtime: save g to TLS more aggressively · b4bfa6c9
    Russ Cox authored
    This is one of those "how did this ever work?" bugs.
    The current build failures are happening because
    a fault comes up while executing on m->curg on a
    system-created thread using an m obtained from needm,
    but TLS is set to m->g0, not m->curg. On fault,
    sigtramp starts executing, assumes r10 (g) might be
    incorrect, reloads it from TLS, and gets m->g0, not
    m->curg. Then sighandler dutifully pushes a call to
    sigpanic onto the stack and returns to it.
    We're now executing on the m->curg stack but with
    g=m->g0. Sigpanic does a stack split check, sees that
    the SP is not in range (50% chance depending on relative
    ordering of m->g0's and m->curg's stacks), and then
    calls morestack. Morestack sees that g=m->g0 and
    crashes the program.
    
    The fix is to replace every change of g in asm_arm.s
    with a call to a function that both updates g and
    saves the updated g to TLS.
    
    Why did it start happening? That's unclear.
    Unfortunately there were other bugs in the initial
    checkin that mask exactly which of a sequence of
    CLs started the behavior where sigpanic would end
    up tripping the stack split.
    
    Fixes arm build.
    Fixes #8675.
    
    LGTM=iant
    R=golang-codereviews, iant
    CC=dave, golang-codereviews, khr, minux, r
    https://golang.org/cl/135570043
    b4bfa6c9
Name
Last commit
Last update
api Loading commit data...
doc Loading commit data...
include Loading commit data...
lib Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.hgignore Loading commit data...
.hgtags Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...