]> Cypherpunks.ru repositories - gostls13.git/commit
runtime: set stackguard1 on extra M g0
authorMichael Pratt <mpratt@google.com>
Fri, 8 Sep 2023 18:54:29 +0000 (14:54 -0400)
committerGopher Robot <gobot@golang.org>
Tue, 19 Sep 2023 19:32:22 +0000 (19:32 +0000)
commit2b462646edefe47650851e8ba23cc787c57ae745
tree2c3eab4497b568063b2d8f4a6dc0317ebfff01c3
parenta56e4969f5e40c5a13216d7bc9d70695e9a2f6ce
runtime: set stackguard1 on extra M g0

[This is an unmodified redo of CL 527056.]

Standard Ms set g0.stackguard1 to the same value as stackguard0 in
mstart0. For consistency, extra Ms should do the same for their g0. Do
this in needm -> callbackUpdateSystemStack.

Background: getg().stackguard1 is used as the stack guard for the stack
growth prolouge in functions marked //go:systemstack [1]. User Gs set
stackguard1 to ^uintptr(0) so that the check always fail, calling
morestackc, which throws to report a //go:systemstack function call on a
user stack.

g0 setting stackguard1 is unnecessary for this functionality. 0 would be
sufficient, as g0 is always allowed to call //go:systemstack functions.
However, since we have the check anyway, setting stackguard1 to the
actual stack bound is useful to detect actual stack overflows on g0
(though morestackc doesn't detect this case and would report a
misleading message about user stacks).

[1] cmd/internal/obj calls //go:systemstack functions AttrCFunc. This is
a holdover from when the runtime contained actual C functions. But since
CL 2275, it has simply meant "pretend this is a C function, which would
thus need to use the system stack". Hence the name morestackc. At this
point, this terminology is pretty far removed from reality and should
probably be updated to something more intuitive.

Change-Id: If315677217354465fbbfbd0d406d79be20db0cc3
Reviewed-on: https://go-review.googlesource.com/c/go/+/527716
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/runtime/cgocall.go
src/runtime/runtime2.go