Skip to content

Commit 9af74e7

Browse files
committed
runtime: set stackguard1 on extra M g0
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: I8d0e5628ce31ac6a189a7d7a4124be85aef89862 Reviewed-on: https://go-review.googlesource.com/c/go/+/527056 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
1 parent a46b1ad commit 9af74e7

File tree

2 files changed

+3
-1
lines changed

2 files changed

+3
-1
lines changed

src/runtime/cgocall.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ func callbackUpdateSystemStack(mp *m, sp uintptr, signal bool) {
233233
g0.stack.hi = sp + 1024
234234
g0.stack.lo = sp - 32*1024
235235
g0.stackguard0 = g0.stack.lo + stackGuard
236+
g0.stackguard1 = g0.stackguard0
236237

237238
print("M ", mp.id, " procid ", mp.procid, " runtime: cgocallback with sp=", hex(sp), " out of bounds [", hex(lo), ", ", hex(hi), "]")
238239
print("\n")
@@ -271,6 +272,7 @@ func callbackUpdateSystemStack(mp *m, sp uintptr, signal bool) {
271272
}
272273
}
273274
g0.stackguard0 = g0.stack.lo + stackGuard
275+
g0.stackguard1 = g0.stackguard0
274276
}
275277

276278
// Call from C back to Go. fn must point to an ABIInternal Go entry-point.

src/runtime/runtime2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ type g struct {
423423
// stack describes the actual stack memory: [stack.lo, stack.hi).
424424
// stackguard0 is the stack pointer compared in the Go stack growth prologue.
425425
// It is stack.lo+StackGuard normally, but can be StackPreempt to trigger a preemption.
426-
// stackguard1 is the stack pointer compared in the C stack growth prologue.
426+
// stackguard1 is the stack pointer compared in the //go:systemstack stack growth prologue.
427427
// It is stack.lo+StackGuard on g0 and gsignal stacks.
428428
// It is ~0 on other goroutine stacks, to trigger a call to morestackc (and crash).
429429
stack stack // offset known to runtime/cgo

0 commit comments

Comments
 (0)