]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/stack.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / src / runtime / stack.go
1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package runtime
6
7 import (
8         "internal/abi"
9         "internal/cpu"
10         "internal/goarch"
11         "internal/goos"
12         "runtime/internal/atomic"
13         "runtime/internal/sys"
14         "unsafe"
15 )
16
17 /*
18 Stack layout parameters.
19 Included both by runtime (compiled via 6c) and linkers (compiled via gcc).
20
21 The per-goroutine g->stackguard is set to point StackGuard bytes
22 above the bottom of the stack.  Each function compares its stack
23 pointer against g->stackguard to check for overflow.  To cut one
24 instruction from the check sequence for functions with tiny frames,
25 the stack is allowed to protrude StackSmall bytes below the stack
26 guard.  Functions with large frames don't bother with the check and
27 always call morestack.  The sequences are (for amd64, others are
28 similar):
29
30         guard = g->stackguard
31         frame = function's stack frame size
32         argsize = size of function arguments (call + return)
33
34         stack frame size <= StackSmall:
35                 CMPQ guard, SP
36                 JHI 3(PC)
37                 MOVQ m->morearg, $(argsize << 32)
38                 CALL morestack(SB)
39
40         stack frame size > StackSmall but < StackBig
41                 LEAQ (frame-StackSmall)(SP), R0
42                 CMPQ guard, R0
43                 JHI 3(PC)
44                 MOVQ m->morearg, $(argsize << 32)
45                 CALL morestack(SB)
46
47         stack frame size >= StackBig:
48                 MOVQ m->morearg, $((argsize << 32) | frame)
49                 CALL morestack(SB)
50
51 The bottom StackGuard - StackSmall bytes are important: there has
52 to be enough room to execute functions that refuse to check for
53 stack overflow, either because they need to be adjacent to the
54 actual caller's frame (deferproc) or because they handle the imminent
55 stack overflow (morestack).
56
57 For example, deferproc might call malloc, which does one of the
58 above checks (without allocating a full frame), which might trigger
59 a call to morestack.  This sequence needs to fit in the bottom
60 section of the stack.  On amd64, morestack's frame is 40 bytes, and
61 deferproc's frame is 56 bytes.  That fits well within the
62 StackGuard - StackSmall bytes at the bottom.
63 The linkers explore all possible call traces involving non-splitting
64 functions to make sure that this limit cannot be violated.
65 */
66
67 const (
68         // stackSystem is a number of additional bytes to add
69         // to each stack below the usual guard area for OS-specific
70         // purposes like signal handling. Used on Windows, Plan 9,
71         // and iOS because they do not use a separate stack.
72         stackSystem = goos.IsWindows*512*goarch.PtrSize + goos.IsPlan9*512 + goos.IsIos*goarch.IsArm64*1024
73
74         // The minimum size of stack used by Go code
75         stackMin = 2048
76
77         // The minimum stack size to allocate.
78         // The hackery here rounds fixedStack0 up to a power of 2.
79         fixedStack0 = stackMin + stackSystem
80         fixedStack1 = fixedStack0 - 1
81         fixedStack2 = fixedStack1 | (fixedStack1 >> 1)
82         fixedStack3 = fixedStack2 | (fixedStack2 >> 2)
83         fixedStack4 = fixedStack3 | (fixedStack3 >> 4)
84         fixedStack5 = fixedStack4 | (fixedStack4 >> 8)
85         fixedStack6 = fixedStack5 | (fixedStack5 >> 16)
86         fixedStack  = fixedStack6 + 1
87
88         // stackNosplit is the maximum number of bytes that a chain of NOSPLIT
89         // functions can use.
90         // This arithmetic must match that in cmd/internal/objabi/stack.go:StackNosplit.
91         stackNosplit = abi.StackNosplitBase * sys.StackGuardMultiplier
92
93         // The stack guard is a pointer this many bytes above the
94         // bottom of the stack.
95         //
96         // The guard leaves enough room for a stackNosplit chain of NOSPLIT calls
97         // plus one stackSmall frame plus stackSystem bytes for the OS.
98         // This arithmetic must match that in cmd/internal/objabi/stack.go:StackLimit.
99         stackGuard = stackNosplit + stackSystem + abi.StackSmall
100 )
101
102 const (
103         // stackDebug == 0: no logging
104         //            == 1: logging of per-stack operations
105         //            == 2: logging of per-frame operations
106         //            == 3: logging of per-word updates
107         //            == 4: logging of per-word reads
108         stackDebug       = 0
109         stackFromSystem  = 0 // allocate stacks from system memory instead of the heap
110         stackFaultOnFree = 0 // old stacks are mapped noaccess to detect use after free
111         stackNoCache     = 0 // disable per-P small stack caches
112
113         // check the BP links during traceback.
114         debugCheckBP = false
115 )
116
117 var (
118         stackPoisonCopy = 0 // fill stack that should not be accessed with garbage, to detect bad dereferences during copy
119 )
120
121 const (
122         uintptrMask = 1<<(8*goarch.PtrSize) - 1
123
124         // The values below can be stored to g.stackguard0 to force
125         // the next stack check to fail.
126         // These are all larger than any real SP.
127
128         // Goroutine preemption request.
129         // 0xfffffade in hex.
130         stackPreempt = uintptrMask & -1314
131
132         // Thread is forking. Causes a split stack check failure.
133         // 0xfffffb2e in hex.
134         stackFork = uintptrMask & -1234
135
136         // Force a stack movement. Used for debugging.
137         // 0xfffffeed in hex.
138         stackForceMove = uintptrMask & -275
139
140         // stackPoisonMin is the lowest allowed stack poison value.
141         stackPoisonMin = uintptrMask & -4096
142 )
143
144 // Global pool of spans that have free stacks.
145 // Stacks are assigned an order according to size.
146 //
147 //      order = log_2(size/FixedStack)
148 //
149 // There is a free list for each order.
150 var stackpool [_NumStackOrders]struct {
151         item stackpoolItem
152         _    [(cpu.CacheLinePadSize - unsafe.Sizeof(stackpoolItem{})%cpu.CacheLinePadSize) % cpu.CacheLinePadSize]byte
153 }
154
155 type stackpoolItem struct {
156         _    sys.NotInHeap
157         mu   mutex
158         span mSpanList
159 }
160
161 // Global pool of large stack spans.
162 var stackLarge struct {
163         lock mutex
164         free [heapAddrBits - pageShift]mSpanList // free lists by log_2(s.npages)
165 }
166
167 func stackinit() {
168         if _StackCacheSize&_PageMask != 0 {
169                 throw("cache size must be a multiple of page size")
170         }
171         for i := range stackpool {
172                 stackpool[i].item.span.init()
173                 lockInit(&stackpool[i].item.mu, lockRankStackpool)
174         }
175         for i := range stackLarge.free {
176                 stackLarge.free[i].init()
177                 lockInit(&stackLarge.lock, lockRankStackLarge)
178         }
179 }
180
181 // stacklog2 returns ⌊log_2(n)⌋.
182 func stacklog2(n uintptr) int {
183         log2 := 0
184         for n > 1 {
185                 n >>= 1
186                 log2++
187         }
188         return log2
189 }
190
191 // Allocates a stack from the free pool. Must be called with
192 // stackpool[order].item.mu held.
193 func stackpoolalloc(order uint8) gclinkptr {
194         list := &stackpool[order].item.span
195         s := list.first
196         lockWithRankMayAcquire(&mheap_.lock, lockRankMheap)
197         if s == nil {
198                 // no free stacks. Allocate another span worth.
199                 s = mheap_.allocManual(_StackCacheSize>>_PageShift, spanAllocStack)
200                 if s == nil {
201                         throw("out of memory")
202                 }
203                 if s.allocCount != 0 {
204                         throw("bad allocCount")
205                 }
206                 if s.manualFreeList.ptr() != nil {
207                         throw("bad manualFreeList")
208                 }
209                 osStackAlloc(s)
210                 s.elemsize = fixedStack << order
211                 for i := uintptr(0); i < _StackCacheSize; i += s.elemsize {
212                         x := gclinkptr(s.base() + i)
213                         x.ptr().next = s.manualFreeList
214                         s.manualFreeList = x
215                 }
216                 list.insert(s)
217         }
218         x := s.manualFreeList
219         if x.ptr() == nil {
220                 throw("span has no free stacks")
221         }
222         s.manualFreeList = x.ptr().next
223         s.allocCount++
224         if s.manualFreeList.ptr() == nil {
225                 // all stacks in s are allocated.
226                 list.remove(s)
227         }
228         return x
229 }
230
231 // Adds stack x to the free pool. Must be called with stackpool[order].item.mu held.
232 func stackpoolfree(x gclinkptr, order uint8) {
233         s := spanOfUnchecked(uintptr(x))
234         if s.state.get() != mSpanManual {
235                 throw("freeing stack not in a stack span")
236         }
237         if s.manualFreeList.ptr() == nil {
238                 // s will now have a free stack
239                 stackpool[order].item.span.insert(s)
240         }
241         x.ptr().next = s.manualFreeList
242         s.manualFreeList = x
243         s.allocCount--
244         if gcphase == _GCoff && s.allocCount == 0 {
245                 // Span is completely free. Return it to the heap
246                 // immediately if we're sweeping.
247                 //
248                 // If GC is active, we delay the free until the end of
249                 // GC to avoid the following type of situation:
250                 //
251                 // 1) GC starts, scans a SudoG but does not yet mark the SudoG.elem pointer
252                 // 2) The stack that pointer points to is copied
253                 // 3) The old stack is freed
254                 // 4) The containing span is marked free
255                 // 5) GC attempts to mark the SudoG.elem pointer. The
256                 //    marking fails because the pointer looks like a
257                 //    pointer into a free span.
258                 //
259                 // By not freeing, we prevent step #4 until GC is done.
260                 stackpool[order].item.span.remove(s)
261                 s.manualFreeList = 0
262                 osStackFree(s)
263                 mheap_.freeManual(s, spanAllocStack)
264         }
265 }
266
267 // stackcacherefill/stackcacherelease implement a global pool of stack segments.
268 // The pool is required to prevent unlimited growth of per-thread caches.
269 //
270 //go:systemstack
271 func stackcacherefill(c *mcache, order uint8) {
272         if stackDebug >= 1 {
273                 print("stackcacherefill order=", order, "\n")
274         }
275
276         // Grab some stacks from the global cache.
277         // Grab half of the allowed capacity (to prevent thrashing).
278         var list gclinkptr
279         var size uintptr
280         lock(&stackpool[order].item.mu)
281         for size < _StackCacheSize/2 {
282                 x := stackpoolalloc(order)
283                 x.ptr().next = list
284                 list = x
285                 size += fixedStack << order
286         }
287         unlock(&stackpool[order].item.mu)
288         c.stackcache[order].list = list
289         c.stackcache[order].size = size
290 }
291
292 //go:systemstack
293 func stackcacherelease(c *mcache, order uint8) {
294         if stackDebug >= 1 {
295                 print("stackcacherelease order=", order, "\n")
296         }
297         x := c.stackcache[order].list
298         size := c.stackcache[order].size
299         lock(&stackpool[order].item.mu)
300         for size > _StackCacheSize/2 {
301                 y := x.ptr().next
302                 stackpoolfree(x, order)
303                 x = y
304                 size -= fixedStack << order
305         }
306         unlock(&stackpool[order].item.mu)
307         c.stackcache[order].list = x
308         c.stackcache[order].size = size
309 }
310
311 //go:systemstack
312 func stackcache_clear(c *mcache) {
313         if stackDebug >= 1 {
314                 print("stackcache clear\n")
315         }
316         for order := uint8(0); order < _NumStackOrders; order++ {
317                 lock(&stackpool[order].item.mu)
318                 x := c.stackcache[order].list
319                 for x.ptr() != nil {
320                         y := x.ptr().next
321                         stackpoolfree(x, order)
322                         x = y
323                 }
324                 c.stackcache[order].list = 0
325                 c.stackcache[order].size = 0
326                 unlock(&stackpool[order].item.mu)
327         }
328 }
329
330 // stackalloc allocates an n byte stack.
331 //
332 // stackalloc must run on the system stack because it uses per-P
333 // resources and must not split the stack.
334 //
335 //go:systemstack
336 func stackalloc(n uint32) stack {
337         // Stackalloc must be called on scheduler stack, so that we
338         // never try to grow the stack during the code that stackalloc runs.
339         // Doing so would cause a deadlock (issue 1547).
340         thisg := getg()
341         if thisg != thisg.m.g0 {
342                 throw("stackalloc not on scheduler stack")
343         }
344         if n&(n-1) != 0 {
345                 throw("stack size not a power of 2")
346         }
347         if stackDebug >= 1 {
348                 print("stackalloc ", n, "\n")
349         }
350
351         if debug.efence != 0 || stackFromSystem != 0 {
352                 n = uint32(alignUp(uintptr(n), physPageSize))
353                 v := sysAlloc(uintptr(n), &memstats.stacks_sys)
354                 if v == nil {
355                         throw("out of memory (stackalloc)")
356                 }
357                 return stack{uintptr(v), uintptr(v) + uintptr(n)}
358         }
359
360         // Small stacks are allocated with a fixed-size free-list allocator.
361         // If we need a stack of a bigger size, we fall back on allocating
362         // a dedicated span.
363         var v unsafe.Pointer
364         if n < fixedStack<<_NumStackOrders && n < _StackCacheSize {
365                 order := uint8(0)
366                 n2 := n
367                 for n2 > fixedStack {
368                         order++
369                         n2 >>= 1
370                 }
371                 var x gclinkptr
372                 if stackNoCache != 0 || thisg.m.p == 0 || thisg.m.preemptoff != "" {
373                         // thisg.m.p == 0 can happen in the guts of exitsyscall
374                         // or procresize. Just get a stack from the global pool.
375                         // Also don't touch stackcache during gc
376                         // as it's flushed concurrently.
377                         lock(&stackpool[order].item.mu)
378                         x = stackpoolalloc(order)
379                         unlock(&stackpool[order].item.mu)
380                 } else {
381                         c := thisg.m.p.ptr().mcache
382                         x = c.stackcache[order].list
383                         if x.ptr() == nil {
384                                 stackcacherefill(c, order)
385                                 x = c.stackcache[order].list
386                         }
387                         c.stackcache[order].list = x.ptr().next
388                         c.stackcache[order].size -= uintptr(n)
389                 }
390                 v = unsafe.Pointer(x)
391         } else {
392                 var s *mspan
393                 npage := uintptr(n) >> _PageShift
394                 log2npage := stacklog2(npage)
395
396                 // Try to get a stack from the large stack cache.
397                 lock(&stackLarge.lock)
398                 if !stackLarge.free[log2npage].isEmpty() {
399                         s = stackLarge.free[log2npage].first
400                         stackLarge.free[log2npage].remove(s)
401                 }
402                 unlock(&stackLarge.lock)
403
404                 lockWithRankMayAcquire(&mheap_.lock, lockRankMheap)
405
406                 if s == nil {
407                         // Allocate a new stack from the heap.
408                         s = mheap_.allocManual(npage, spanAllocStack)
409                         if s == nil {
410                                 throw("out of memory")
411                         }
412                         osStackAlloc(s)
413                         s.elemsize = uintptr(n)
414                 }
415                 v = unsafe.Pointer(s.base())
416         }
417
418         if raceenabled {
419                 racemalloc(v, uintptr(n))
420         }
421         if msanenabled {
422                 msanmalloc(v, uintptr(n))
423         }
424         if asanenabled {
425                 asanunpoison(v, uintptr(n))
426         }
427         if stackDebug >= 1 {
428                 print("  allocated ", v, "\n")
429         }
430         return stack{uintptr(v), uintptr(v) + uintptr(n)}
431 }
432
433 // stackfree frees an n byte stack allocation at stk.
434 //
435 // stackfree must run on the system stack because it uses per-P
436 // resources and must not split the stack.
437 //
438 //go:systemstack
439 func stackfree(stk stack) {
440         gp := getg()
441         v := unsafe.Pointer(stk.lo)
442         n := stk.hi - stk.lo
443         if n&(n-1) != 0 {
444                 throw("stack not a power of 2")
445         }
446         if stk.lo+n < stk.hi {
447                 throw("bad stack size")
448         }
449         if stackDebug >= 1 {
450                 println("stackfree", v, n)
451                 memclrNoHeapPointers(v, n) // for testing, clobber stack data
452         }
453         if debug.efence != 0 || stackFromSystem != 0 {
454                 if debug.efence != 0 || stackFaultOnFree != 0 {
455                         sysFault(v, n)
456                 } else {
457                         sysFree(v, n, &memstats.stacks_sys)
458                 }
459                 return
460         }
461         if msanenabled {
462                 msanfree(v, n)
463         }
464         if asanenabled {
465                 asanpoison(v, n)
466         }
467         if n < fixedStack<<_NumStackOrders && n < _StackCacheSize {
468                 order := uint8(0)
469                 n2 := n
470                 for n2 > fixedStack {
471                         order++
472                         n2 >>= 1
473                 }
474                 x := gclinkptr(v)
475                 if stackNoCache != 0 || gp.m.p == 0 || gp.m.preemptoff != "" {
476                         lock(&stackpool[order].item.mu)
477                         stackpoolfree(x, order)
478                         unlock(&stackpool[order].item.mu)
479                 } else {
480                         c := gp.m.p.ptr().mcache
481                         if c.stackcache[order].size >= _StackCacheSize {
482                                 stackcacherelease(c, order)
483                         }
484                         x.ptr().next = c.stackcache[order].list
485                         c.stackcache[order].list = x
486                         c.stackcache[order].size += n
487                 }
488         } else {
489                 s := spanOfUnchecked(uintptr(v))
490                 if s.state.get() != mSpanManual {
491                         println(hex(s.base()), v)
492                         throw("bad span state")
493                 }
494                 if gcphase == _GCoff {
495                         // Free the stack immediately if we're
496                         // sweeping.
497                         osStackFree(s)
498                         mheap_.freeManual(s, spanAllocStack)
499                 } else {
500                         // If the GC is running, we can't return a
501                         // stack span to the heap because it could be
502                         // reused as a heap span, and this state
503                         // change would race with GC. Add it to the
504                         // large stack cache instead.
505                         log2npage := stacklog2(s.npages)
506                         lock(&stackLarge.lock)
507                         stackLarge.free[log2npage].insert(s)
508                         unlock(&stackLarge.lock)
509                 }
510         }
511 }
512
513 var maxstacksize uintptr = 1 << 20 // enough until runtime.main sets it for real
514
515 var maxstackceiling = maxstacksize
516
517 var ptrnames = []string{
518         0: "scalar",
519         1: "ptr",
520 }
521
522 // Stack frame layout
523 //
524 // (x86)
525 // +------------------+
526 // | args from caller |
527 // +------------------+ <- frame->argp
528 // |  return address  |
529 // +------------------+
530 // |  caller's BP (*) | (*) if framepointer_enabled && varp > sp
531 // +------------------+ <- frame->varp
532 // |     locals       |
533 // +------------------+
534 // |  args to callee  |
535 // +------------------+ <- frame->sp
536 //
537 // (arm)
538 // +------------------+
539 // | args from caller |
540 // +------------------+ <- frame->argp
541 // | caller's retaddr |
542 // +------------------+
543 // |  caller's FP (*) | (*) on ARM64, if framepointer_enabled && varp > sp
544 // +------------------+ <- frame->varp
545 // |     locals       |
546 // +------------------+
547 // |  args to callee  |
548 // +------------------+
549 // |  return address  |
550 // +------------------+ <- frame->sp
551 //
552 // varp > sp means that the function has a frame;
553 // varp == sp means frameless function.
554
555 type adjustinfo struct {
556         old   stack
557         delta uintptr // ptr distance from old to new stack (newbase - oldbase)
558
559         // sghi is the highest sudog.elem on the stack.
560         sghi uintptr
561 }
562
563 // adjustpointer checks whether *vpp is in the old stack described by adjinfo.
564 // If so, it rewrites *vpp to point into the new stack.
565 func adjustpointer(adjinfo *adjustinfo, vpp unsafe.Pointer) {
566         pp := (*uintptr)(vpp)
567         p := *pp
568         if stackDebug >= 4 {
569                 print("        ", pp, ":", hex(p), "\n")
570         }
571         if adjinfo.old.lo <= p && p < adjinfo.old.hi {
572                 *pp = p + adjinfo.delta
573                 if stackDebug >= 3 {
574                         print("        adjust ptr ", pp, ":", hex(p), " -> ", hex(*pp), "\n")
575                 }
576         }
577 }
578
579 // Information from the compiler about the layout of stack frames.
580 // Note: this type must agree with reflect.bitVector.
581 type bitvector struct {
582         n        int32 // # of bits
583         bytedata *uint8
584 }
585
586 // ptrbit returns the i'th bit in bv.
587 // ptrbit is less efficient than iterating directly over bitvector bits,
588 // and should only be used in non-performance-critical code.
589 // See adjustpointers for an example of a high-efficiency walk of a bitvector.
590 func (bv *bitvector) ptrbit(i uintptr) uint8 {
591         b := *(addb(bv.bytedata, i/8))
592         return (b >> (i % 8)) & 1
593 }
594
595 // bv describes the memory starting at address scanp.
596 // Adjust any pointers contained therein.
597 func adjustpointers(scanp unsafe.Pointer, bv *bitvector, adjinfo *adjustinfo, f funcInfo) {
598         minp := adjinfo.old.lo
599         maxp := adjinfo.old.hi
600         delta := adjinfo.delta
601         num := uintptr(bv.n)
602         // If this frame might contain channel receive slots, use CAS
603         // to adjust pointers. If the slot hasn't been received into
604         // yet, it may contain stack pointers and a concurrent send
605         // could race with adjusting those pointers. (The sent value
606         // itself can never contain stack pointers.)
607         useCAS := uintptr(scanp) < adjinfo.sghi
608         for i := uintptr(0); i < num; i += 8 {
609                 if stackDebug >= 4 {
610                         for j := uintptr(0); j < 8; j++ {
611                                 print("        ", add(scanp, (i+j)*goarch.PtrSize), ":", ptrnames[bv.ptrbit(i+j)], ":", hex(*(*uintptr)(add(scanp, (i+j)*goarch.PtrSize))), " # ", i, " ", *addb(bv.bytedata, i/8), "\n")
612                         }
613                 }
614                 b := *(addb(bv.bytedata, i/8))
615                 for b != 0 {
616                         j := uintptr(sys.TrailingZeros8(b))
617                         b &= b - 1
618                         pp := (*uintptr)(add(scanp, (i+j)*goarch.PtrSize))
619                 retry:
620                         p := *pp
621                         if f.valid() && 0 < p && p < minLegalPointer && debug.invalidptr != 0 {
622                                 // Looks like a junk value in a pointer slot.
623                                 // Live analysis wrong?
624                                 getg().m.traceback = 2
625                                 print("runtime: bad pointer in frame ", funcname(f), " at ", pp, ": ", hex(p), "\n")
626                                 throw("invalid pointer found on stack")
627                         }
628                         if minp <= p && p < maxp {
629                                 if stackDebug >= 3 {
630                                         print("adjust ptr ", hex(p), " ", funcname(f), "\n")
631                                 }
632                                 if useCAS {
633                                         ppu := (*unsafe.Pointer)(unsafe.Pointer(pp))
634                                         if !atomic.Casp1(ppu, unsafe.Pointer(p), unsafe.Pointer(p+delta)) {
635                                                 goto retry
636                                         }
637                                 } else {
638                                         *pp = p + delta
639                                 }
640                         }
641                 }
642         }
643 }
644
645 // Note: the argument/return area is adjusted by the callee.
646 func adjustframe(frame *stkframe, adjinfo *adjustinfo) {
647         if frame.continpc == 0 {
648                 // Frame is dead.
649                 return
650         }
651         f := frame.fn
652         if stackDebug >= 2 {
653                 print("    adjusting ", funcname(f), " frame=[", hex(frame.sp), ",", hex(frame.fp), "] pc=", hex(frame.pc), " continpc=", hex(frame.continpc), "\n")
654         }
655
656         // Adjust saved frame pointer if there is one.
657         if (goarch.ArchFamily == goarch.AMD64 || goarch.ArchFamily == goarch.ARM64) && frame.argp-frame.varp == 2*goarch.PtrSize {
658                 if stackDebug >= 3 {
659                         print("      saved bp\n")
660                 }
661                 if debugCheckBP {
662                         // Frame pointers should always point to the next higher frame on
663                         // the Go stack (or be nil, for the top frame on the stack).
664                         bp := *(*uintptr)(unsafe.Pointer(frame.varp))
665                         if bp != 0 && (bp < adjinfo.old.lo || bp >= adjinfo.old.hi) {
666                                 println("runtime: found invalid frame pointer")
667                                 print("bp=", hex(bp), " min=", hex(adjinfo.old.lo), " max=", hex(adjinfo.old.hi), "\n")
668                                 throw("bad frame pointer")
669                         }
670                 }
671                 // On AMD64, this is the caller's frame pointer saved in the current
672                 // frame.
673                 // On ARM64, this is the frame pointer of the caller's caller saved
674                 // by the caller in its frame (one word below its SP).
675                 adjustpointer(adjinfo, unsafe.Pointer(frame.varp))
676         }
677
678         locals, args, objs := frame.getStackMap(true)
679
680         // Adjust local variables if stack frame has been allocated.
681         if locals.n > 0 {
682                 size := uintptr(locals.n) * goarch.PtrSize
683                 adjustpointers(unsafe.Pointer(frame.varp-size), &locals, adjinfo, f)
684         }
685
686         // Adjust arguments.
687         if args.n > 0 {
688                 if stackDebug >= 3 {
689                         print("      args\n")
690                 }
691                 adjustpointers(unsafe.Pointer(frame.argp), &args, adjinfo, funcInfo{})
692         }
693
694         // Adjust pointers in all stack objects (whether they are live or not).
695         // See comments in mgcmark.go:scanframeworker.
696         if frame.varp != 0 {
697                 for i := range objs {
698                         obj := &objs[i]
699                         off := obj.off
700                         base := frame.varp // locals base pointer
701                         if off >= 0 {
702                                 base = frame.argp // arguments and return values base pointer
703                         }
704                         p := base + uintptr(off)
705                         if p < frame.sp {
706                                 // Object hasn't been allocated in the frame yet.
707                                 // (Happens when the stack bounds check fails and
708                                 // we call into morestack.)
709                                 continue
710                         }
711                         ptrdata := obj.ptrdata()
712                         gcdata := obj.gcdata()
713                         var s *mspan
714                         if obj.useGCProg() {
715                                 // See comments in mgcmark.go:scanstack
716                                 s = materializeGCProg(ptrdata, gcdata)
717                                 gcdata = (*byte)(unsafe.Pointer(s.startAddr))
718                         }
719                         for i := uintptr(0); i < ptrdata; i += goarch.PtrSize {
720                                 if *addb(gcdata, i/(8*goarch.PtrSize))>>(i/goarch.PtrSize&7)&1 != 0 {
721                                         adjustpointer(adjinfo, unsafe.Pointer(p+i))
722                                 }
723                         }
724                         if s != nil {
725                                 dematerializeGCProg(s)
726                         }
727                 }
728         }
729 }
730
731 func adjustctxt(gp *g, adjinfo *adjustinfo) {
732         adjustpointer(adjinfo, unsafe.Pointer(&gp.sched.ctxt))
733         if !framepointer_enabled {
734                 return
735         }
736         if debugCheckBP {
737                 bp := gp.sched.bp
738                 if bp != 0 && (bp < adjinfo.old.lo || bp >= adjinfo.old.hi) {
739                         println("runtime: found invalid top frame pointer")
740                         print("bp=", hex(bp), " min=", hex(adjinfo.old.lo), " max=", hex(adjinfo.old.hi), "\n")
741                         throw("bad top frame pointer")
742                 }
743         }
744         oldfp := gp.sched.bp
745         adjustpointer(adjinfo, unsafe.Pointer(&gp.sched.bp))
746         if GOARCH == "arm64" {
747                 // On ARM64, the frame pointer is saved one word *below* the SP,
748                 // which is not copied or adjusted in any frame. Do it explicitly
749                 // here.
750                 if oldfp == gp.sched.sp-goarch.PtrSize {
751                         memmove(unsafe.Pointer(gp.sched.bp), unsafe.Pointer(oldfp), goarch.PtrSize)
752                         adjustpointer(adjinfo, unsafe.Pointer(gp.sched.bp))
753                 }
754         }
755 }
756
757 func adjustdefers(gp *g, adjinfo *adjustinfo) {
758         // Adjust pointers in the Defer structs.
759         // We need to do this first because we need to adjust the
760         // defer.link fields so we always work on the new stack.
761         adjustpointer(adjinfo, unsafe.Pointer(&gp._defer))
762         for d := gp._defer; d != nil; d = d.link {
763                 adjustpointer(adjinfo, unsafe.Pointer(&d.fn))
764                 adjustpointer(adjinfo, unsafe.Pointer(&d.sp))
765                 adjustpointer(adjinfo, unsafe.Pointer(&d.link))
766         }
767 }
768
769 func adjustpanics(gp *g, adjinfo *adjustinfo) {
770         // Panics are on stack and already adjusted.
771         // Update pointer to head of list in G.
772         adjustpointer(adjinfo, unsafe.Pointer(&gp._panic))
773 }
774
775 func adjustsudogs(gp *g, adjinfo *adjustinfo) {
776         // the data elements pointed to by a SudoG structure
777         // might be in the stack.
778         for s := gp.waiting; s != nil; s = s.waitlink {
779                 adjustpointer(adjinfo, unsafe.Pointer(&s.elem))
780         }
781 }
782
783 func fillstack(stk stack, b byte) {
784         for p := stk.lo; p < stk.hi; p++ {
785                 *(*byte)(unsafe.Pointer(p)) = b
786         }
787 }
788
789 func findsghi(gp *g, stk stack) uintptr {
790         var sghi uintptr
791         for sg := gp.waiting; sg != nil; sg = sg.waitlink {
792                 p := uintptr(sg.elem) + uintptr(sg.c.elemsize)
793                 if stk.lo <= p && p < stk.hi && p > sghi {
794                         sghi = p
795                 }
796         }
797         return sghi
798 }
799
800 // syncadjustsudogs adjusts gp's sudogs and copies the part of gp's
801 // stack they refer to while synchronizing with concurrent channel
802 // operations. It returns the number of bytes of stack copied.
803 func syncadjustsudogs(gp *g, used uintptr, adjinfo *adjustinfo) uintptr {
804         if gp.waiting == nil {
805                 return 0
806         }
807
808         // Lock channels to prevent concurrent send/receive.
809         var lastc *hchan
810         for sg := gp.waiting; sg != nil; sg = sg.waitlink {
811                 if sg.c != lastc {
812                         // There is a ranking cycle here between gscan bit and
813                         // hchan locks. Normally, we only allow acquiring hchan
814                         // locks and then getting a gscan bit. In this case, we
815                         // already have the gscan bit. We allow acquiring hchan
816                         // locks here as a special case, since a deadlock can't
817                         // happen because the G involved must already be
818                         // suspended. So, we get a special hchan lock rank here
819                         // that is lower than gscan, but doesn't allow acquiring
820                         // any other locks other than hchan.
821                         lockWithRank(&sg.c.lock, lockRankHchanLeaf)
822                 }
823                 lastc = sg.c
824         }
825
826         // Adjust sudogs.
827         adjustsudogs(gp, adjinfo)
828
829         // Copy the part of the stack the sudogs point in to
830         // while holding the lock to prevent races on
831         // send/receive slots.
832         var sgsize uintptr
833         if adjinfo.sghi != 0 {
834                 oldBot := adjinfo.old.hi - used
835                 newBot := oldBot + adjinfo.delta
836                 sgsize = adjinfo.sghi - oldBot
837                 memmove(unsafe.Pointer(newBot), unsafe.Pointer(oldBot), sgsize)
838         }
839
840         // Unlock channels.
841         lastc = nil
842         for sg := gp.waiting; sg != nil; sg = sg.waitlink {
843                 if sg.c != lastc {
844                         unlock(&sg.c.lock)
845                 }
846                 lastc = sg.c
847         }
848
849         return sgsize
850 }
851
852 // Copies gp's stack to a new stack of a different size.
853 // Caller must have changed gp status to Gcopystack.
854 func copystack(gp *g, newsize uintptr) {
855         if gp.syscallsp != 0 {
856                 throw("stack growth not allowed in system call")
857         }
858         old := gp.stack
859         if old.lo == 0 {
860                 throw("nil stackbase")
861         }
862         used := old.hi - gp.sched.sp
863         // Add just the difference to gcController.addScannableStack.
864         // g0 stacks never move, so this will never account for them.
865         // It's also fine if we have no P, addScannableStack can deal with
866         // that case.
867         gcController.addScannableStack(getg().m.p.ptr(), int64(newsize)-int64(old.hi-old.lo))
868
869         // allocate new stack
870         new := stackalloc(uint32(newsize))
871         if stackPoisonCopy != 0 {
872                 fillstack(new, 0xfd)
873         }
874         if stackDebug >= 1 {
875                 print("copystack gp=", gp, " [", hex(old.lo), " ", hex(old.hi-used), " ", hex(old.hi), "]", " -> [", hex(new.lo), " ", hex(new.hi-used), " ", hex(new.hi), "]/", newsize, "\n")
876         }
877
878         // Compute adjustment.
879         var adjinfo adjustinfo
880         adjinfo.old = old
881         adjinfo.delta = new.hi - old.hi
882
883         // Adjust sudogs, synchronizing with channel ops if necessary.
884         ncopy := used
885         if !gp.activeStackChans {
886                 if newsize < old.hi-old.lo && gp.parkingOnChan.Load() {
887                         // It's not safe for someone to shrink this stack while we're actively
888                         // parking on a channel, but it is safe to grow since we do that
889                         // ourselves and explicitly don't want to synchronize with channels
890                         // since we could self-deadlock.
891                         throw("racy sudog adjustment due to parking on channel")
892                 }
893                 adjustsudogs(gp, &adjinfo)
894         } else {
895                 // sudogs may be pointing in to the stack and gp has
896                 // released channel locks, so other goroutines could
897                 // be writing to gp's stack. Find the highest such
898                 // pointer so we can handle everything there and below
899                 // carefully. (This shouldn't be far from the bottom
900                 // of the stack, so there's little cost in handling
901                 // everything below it carefully.)
902                 adjinfo.sghi = findsghi(gp, old)
903
904                 // Synchronize with channel ops and copy the part of
905                 // the stack they may interact with.
906                 ncopy -= syncadjustsudogs(gp, used, &adjinfo)
907         }
908
909         // Copy the stack (or the rest of it) to the new location
910         memmove(unsafe.Pointer(new.hi-ncopy), unsafe.Pointer(old.hi-ncopy), ncopy)
911
912         // Adjust remaining structures that have pointers into stacks.
913         // We have to do most of these before we traceback the new
914         // stack because gentraceback uses them.
915         adjustctxt(gp, &adjinfo)
916         adjustdefers(gp, &adjinfo)
917         adjustpanics(gp, &adjinfo)
918         if adjinfo.sghi != 0 {
919                 adjinfo.sghi += adjinfo.delta
920         }
921
922         // Swap out old stack for new one
923         gp.stack = new
924         gp.stackguard0 = new.lo + stackGuard // NOTE: might clobber a preempt request
925         gp.sched.sp = new.hi - used
926         gp.stktopsp += adjinfo.delta
927
928         // Adjust pointers in the new stack.
929         var u unwinder
930         for u.init(gp, 0); u.valid(); u.next() {
931                 adjustframe(&u.frame, &adjinfo)
932         }
933
934         // free old stack
935         if stackPoisonCopy != 0 {
936                 fillstack(old, 0xfc)
937         }
938         stackfree(old)
939 }
940
941 // round x up to a power of 2.
942 func round2(x int32) int32 {
943         s := uint(0)
944         for 1<<s < x {
945                 s++
946         }
947         return 1 << s
948 }
949
950 // Called from runtime·morestack when more stack is needed.
951 // Allocate larger stack and relocate to new stack.
952 // Stack growth is multiplicative, for constant amortized cost.
953 //
954 // g->atomicstatus will be Grunning or Gscanrunning upon entry.
955 // If the scheduler is trying to stop this g, then it will set preemptStop.
956 //
957 // This must be nowritebarrierrec because it can be called as part of
958 // stack growth from other nowritebarrierrec functions, but the
959 // compiler doesn't check this.
960 //
961 //go:nowritebarrierrec
962 func newstack() {
963         thisg := getg()
964         // TODO: double check all gp. shouldn't be getg().
965         if thisg.m.morebuf.g.ptr().stackguard0 == stackFork {
966                 throw("stack growth after fork")
967         }
968         if thisg.m.morebuf.g.ptr() != thisg.m.curg {
969                 print("runtime: newstack called from g=", hex(thisg.m.morebuf.g), "\n"+"\tm=", thisg.m, " m->curg=", thisg.m.curg, " m->g0=", thisg.m.g0, " m->gsignal=", thisg.m.gsignal, "\n")
970                 morebuf := thisg.m.morebuf
971                 traceback(morebuf.pc, morebuf.sp, morebuf.lr, morebuf.g.ptr())
972                 throw("runtime: wrong goroutine in newstack")
973         }
974
975         gp := thisg.m.curg
976
977         if thisg.m.curg.throwsplit {
978                 // Update syscallsp, syscallpc in case traceback uses them.
979                 morebuf := thisg.m.morebuf
980                 gp.syscallsp = morebuf.sp
981                 gp.syscallpc = morebuf.pc
982                 pcname, pcoff := "(unknown)", uintptr(0)
983                 f := findfunc(gp.sched.pc)
984                 if f.valid() {
985                         pcname = funcname(f)
986                         pcoff = gp.sched.pc - f.entry()
987                 }
988                 print("runtime: newstack at ", pcname, "+", hex(pcoff),
989                         " sp=", hex(gp.sched.sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n",
990                         "\tmorebuf={pc:", hex(morebuf.pc), " sp:", hex(morebuf.sp), " lr:", hex(morebuf.lr), "}\n",
991                         "\tsched={pc:", hex(gp.sched.pc), " sp:", hex(gp.sched.sp), " lr:", hex(gp.sched.lr), " ctxt:", gp.sched.ctxt, "}\n")
992
993                 thisg.m.traceback = 2 // Include runtime frames
994                 traceback(morebuf.pc, morebuf.sp, morebuf.lr, gp)
995                 throw("runtime: stack split at bad time")
996         }
997
998         morebuf := thisg.m.morebuf
999         thisg.m.morebuf.pc = 0
1000         thisg.m.morebuf.lr = 0
1001         thisg.m.morebuf.sp = 0
1002         thisg.m.morebuf.g = 0
1003
1004         // NOTE: stackguard0 may change underfoot, if another thread
1005         // is about to try to preempt gp. Read it just once and use that same
1006         // value now and below.
1007         stackguard0 := atomic.Loaduintptr(&gp.stackguard0)
1008
1009         // Be conservative about where we preempt.
1010         // We are interested in preempting user Go code, not runtime code.
1011         // If we're holding locks, mallocing, or preemption is disabled, don't
1012         // preempt.
1013         // This check is very early in newstack so that even the status change
1014         // from Grunning to Gwaiting and back doesn't happen in this case.
1015         // That status change by itself can be viewed as a small preemption,
1016         // because the GC might change Gwaiting to Gscanwaiting, and then
1017         // this goroutine has to wait for the GC to finish before continuing.
1018         // If the GC is in some way dependent on this goroutine (for example,
1019         // it needs a lock held by the goroutine), that small preemption turns
1020         // into a real deadlock.
1021         preempt := stackguard0 == stackPreempt
1022         if preempt {
1023                 if !canPreemptM(thisg.m) {
1024                         // Let the goroutine keep running for now.
1025                         // gp->preempt is set, so it will be preempted next time.
1026                         gp.stackguard0 = gp.stack.lo + stackGuard
1027                         gogo(&gp.sched) // never return
1028                 }
1029         }
1030
1031         if gp.stack.lo == 0 {
1032                 throw("missing stack in newstack")
1033         }
1034         sp := gp.sched.sp
1035         if goarch.ArchFamily == goarch.AMD64 || goarch.ArchFamily == goarch.I386 || goarch.ArchFamily == goarch.WASM {
1036                 // The call to morestack cost a word.
1037                 sp -= goarch.PtrSize
1038         }
1039         if stackDebug >= 1 || sp < gp.stack.lo {
1040                 print("runtime: newstack sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n",
1041                         "\tmorebuf={pc:", hex(morebuf.pc), " sp:", hex(morebuf.sp), " lr:", hex(morebuf.lr), "}\n",
1042                         "\tsched={pc:", hex(gp.sched.pc), " sp:", hex(gp.sched.sp), " lr:", hex(gp.sched.lr), " ctxt:", gp.sched.ctxt, "}\n")
1043         }
1044         if sp < gp.stack.lo {
1045                 print("runtime: gp=", gp, ", goid=", gp.goid, ", gp->status=", hex(readgstatus(gp)), "\n ")
1046                 print("runtime: split stack overflow: ", hex(sp), " < ", hex(gp.stack.lo), "\n")
1047                 throw("runtime: split stack overflow")
1048         }
1049
1050         if preempt {
1051                 if gp == thisg.m.g0 {
1052                         throw("runtime: preempt g0")
1053                 }
1054                 if thisg.m.p == 0 && thisg.m.locks == 0 {
1055                         throw("runtime: g is running but p is not")
1056                 }
1057
1058                 if gp.preemptShrink {
1059                         // We're at a synchronous safe point now, so
1060                         // do the pending stack shrink.
1061                         gp.preemptShrink = false
1062                         shrinkstack(gp)
1063                 }
1064
1065                 if gp.preemptStop {
1066                         preemptPark(gp) // never returns
1067                 }
1068
1069                 // Act like goroutine called runtime.Gosched.
1070                 gopreempt_m(gp) // never return
1071         }
1072
1073         // Allocate a bigger segment and move the stack.
1074         oldsize := gp.stack.hi - gp.stack.lo
1075         newsize := oldsize * 2
1076
1077         // Make sure we grow at least as much as needed to fit the new frame.
1078         // (This is just an optimization - the caller of morestack will
1079         // recheck the bounds on return.)
1080         if f := findfunc(gp.sched.pc); f.valid() {
1081                 max := uintptr(funcMaxSPDelta(f))
1082                 needed := max + stackGuard
1083                 used := gp.stack.hi - gp.sched.sp
1084                 for newsize-used < needed {
1085                         newsize *= 2
1086                 }
1087         }
1088
1089         if stackguard0 == stackForceMove {
1090                 // Forced stack movement used for debugging.
1091                 // Don't double the stack (or we may quickly run out
1092                 // if this is done repeatedly).
1093                 newsize = oldsize
1094         }
1095
1096         if newsize > maxstacksize || newsize > maxstackceiling {
1097                 if maxstacksize < maxstackceiling {
1098                         print("runtime: goroutine stack exceeds ", maxstacksize, "-byte limit\n")
1099                 } else {
1100                         print("runtime: goroutine stack exceeds ", maxstackceiling, "-byte limit\n")
1101                 }
1102                 print("runtime: sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n")
1103                 throw("stack overflow")
1104         }
1105
1106         // The goroutine must be executing in order to call newstack,
1107         // so it must be Grunning (or Gscanrunning).
1108         casgstatus(gp, _Grunning, _Gcopystack)
1109
1110         // The concurrent GC will not scan the stack while we are doing the copy since
1111         // the gp is in a Gcopystack status.
1112         copystack(gp, newsize)
1113         if stackDebug >= 1 {
1114                 print("stack grow done\n")
1115         }
1116         casgstatus(gp, _Gcopystack, _Grunning)
1117         gogo(&gp.sched)
1118 }
1119
1120 //go:nosplit
1121 func nilfunc() {
1122         *(*uint8)(nil) = 0
1123 }
1124
1125 // adjust Gobuf as if it executed a call to fn
1126 // and then stopped before the first instruction in fn.
1127 func gostartcallfn(gobuf *gobuf, fv *funcval) {
1128         var fn unsafe.Pointer
1129         if fv != nil {
1130                 fn = unsafe.Pointer(fv.fn)
1131         } else {
1132                 fn = unsafe.Pointer(abi.FuncPCABIInternal(nilfunc))
1133         }
1134         gostartcall(gobuf, fn, unsafe.Pointer(fv))
1135 }
1136
1137 // isShrinkStackSafe returns whether it's safe to attempt to shrink
1138 // gp's stack. Shrinking the stack is only safe when we have precise
1139 // pointer maps for all frames on the stack.
1140 func isShrinkStackSafe(gp *g) bool {
1141         // We can't copy the stack if we're in a syscall.
1142         // The syscall might have pointers into the stack and
1143         // often we don't have precise pointer maps for the innermost
1144         // frames.
1145         //
1146         // We also can't copy the stack if we're at an asynchronous
1147         // safe-point because we don't have precise pointer maps for
1148         // all frames.
1149         //
1150         // We also can't *shrink* the stack in the window between the
1151         // goroutine calling gopark to park on a channel and
1152         // gp.activeStackChans being set.
1153         return gp.syscallsp == 0 && !gp.asyncSafePoint && !gp.parkingOnChan.Load()
1154 }
1155
1156 // Maybe shrink the stack being used by gp.
1157 //
1158 // gp must be stopped and we must own its stack. It may be in
1159 // _Grunning, but only if this is our own user G.
1160 func shrinkstack(gp *g) {
1161         if gp.stack.lo == 0 {
1162                 throw("missing stack in shrinkstack")
1163         }
1164         if s := readgstatus(gp); s&_Gscan == 0 {
1165                 // We don't own the stack via _Gscan. We could still
1166                 // own it if this is our own user G and we're on the
1167                 // system stack.
1168                 if !(gp == getg().m.curg && getg() != getg().m.curg && s == _Grunning) {
1169                         // We don't own the stack.
1170                         throw("bad status in shrinkstack")
1171                 }
1172         }
1173         if !isShrinkStackSafe(gp) {
1174                 throw("shrinkstack at bad time")
1175         }
1176         // Check for self-shrinks while in a libcall. These may have
1177         // pointers into the stack disguised as uintptrs, but these
1178         // code paths should all be nosplit.
1179         if gp == getg().m.curg && gp.m.libcallsp != 0 {
1180                 throw("shrinking stack in libcall")
1181         }
1182
1183         if debug.gcshrinkstackoff > 0 {
1184                 return
1185         }
1186         f := findfunc(gp.startpc)
1187         if f.valid() && f.funcID == abi.FuncID_gcBgMarkWorker {
1188                 // We're not allowed to shrink the gcBgMarkWorker
1189                 // stack (see gcBgMarkWorker for explanation).
1190                 return
1191         }
1192
1193         oldsize := gp.stack.hi - gp.stack.lo
1194         newsize := oldsize / 2
1195         // Don't shrink the allocation below the minimum-sized stack
1196         // allocation.
1197         if newsize < fixedStack {
1198                 return
1199         }
1200         // Compute how much of the stack is currently in use and only
1201         // shrink the stack if gp is using less than a quarter of its
1202         // current stack. The currently used stack includes everything
1203         // down to the SP plus the stack guard space that ensures
1204         // there's room for nosplit functions.
1205         avail := gp.stack.hi - gp.stack.lo
1206         if used := gp.stack.hi - gp.sched.sp + stackNosplit; used >= avail/4 {
1207                 return
1208         }
1209
1210         if stackDebug > 0 {
1211                 print("shrinking stack ", oldsize, "->", newsize, "\n")
1212         }
1213
1214         copystack(gp, newsize)
1215 }
1216
1217 // freeStackSpans frees unused stack spans at the end of GC.
1218 func freeStackSpans() {
1219         // Scan stack pools for empty stack spans.
1220         for order := range stackpool {
1221                 lock(&stackpool[order].item.mu)
1222                 list := &stackpool[order].item.span
1223                 for s := list.first; s != nil; {
1224                         next := s.next
1225                         if s.allocCount == 0 {
1226                                 list.remove(s)
1227                                 s.manualFreeList = 0
1228                                 osStackFree(s)
1229                                 mheap_.freeManual(s, spanAllocStack)
1230                         }
1231                         s = next
1232                 }
1233                 unlock(&stackpool[order].item.mu)
1234         }
1235
1236         // Free large stack spans.
1237         lock(&stackLarge.lock)
1238         for i := range stackLarge.free {
1239                 for s := stackLarge.free[i].first; s != nil; {
1240                         next := s.next
1241                         stackLarge.free[i].remove(s)
1242                         osStackFree(s)
1243                         mheap_.freeManual(s, spanAllocStack)
1244                         s = next
1245                 }
1246         }
1247         unlock(&stackLarge.lock)
1248 }
1249
1250 // A stackObjectRecord is generated by the compiler for each stack object in a stack frame.
1251 // This record must match the generator code in cmd/compile/internal/liveness/plive.go:emitStackObjects.
1252 type stackObjectRecord struct {
1253         // offset in frame
1254         // if negative, offset from varp
1255         // if non-negative, offset from argp
1256         off       int32
1257         size      int32
1258         _ptrdata  int32  // ptrdata, or -ptrdata is GC prog is used
1259         gcdataoff uint32 // offset to gcdata from moduledata.rodata
1260 }
1261
1262 func (r *stackObjectRecord) useGCProg() bool {
1263         return r._ptrdata < 0
1264 }
1265
1266 func (r *stackObjectRecord) ptrdata() uintptr {
1267         x := r._ptrdata
1268         if x < 0 {
1269                 return uintptr(-x)
1270         }
1271         return uintptr(x)
1272 }
1273
1274 // gcdata returns pointer map or GC prog of the type.
1275 func (r *stackObjectRecord) gcdata() *byte {
1276         ptr := uintptr(unsafe.Pointer(r))
1277         var mod *moduledata
1278         for datap := &firstmoduledata; datap != nil; datap = datap.next {
1279                 if datap.gofunc <= ptr && ptr < datap.end {
1280                         mod = datap
1281                         break
1282                 }
1283         }
1284         // If you get a panic here due to a nil mod,
1285         // you may have made a copy of a stackObjectRecord.
1286         // You must use the original pointer.
1287         res := mod.rodata + uintptr(r.gcdataoff)
1288         return (*byte)(unsafe.Pointer(res))
1289 }
1290
1291 // This is exported as ABI0 via linkname so obj can call it.
1292 //
1293 //go:nosplit
1294 //go:linkname morestackc
1295 func morestackc() {
1296         throw("attempt to execute system stack code on user stack")
1297 }
1298
1299 // startingStackSize is the amount of stack that new goroutines start with.
1300 // It is a power of 2, and between _FixedStack and maxstacksize, inclusive.
1301 // startingStackSize is updated every GC by tracking the average size of
1302 // stacks scanned during the GC.
1303 var startingStackSize uint32 = fixedStack
1304
1305 func gcComputeStartingStackSize() {
1306         if debug.adaptivestackstart == 0 {
1307                 return
1308         }
1309         // For details, see the design doc at
1310         // https://docs.google.com/document/d/1YDlGIdVTPnmUiTAavlZxBI1d9pwGQgZT7IKFKlIXohQ/edit?usp=sharing
1311         // The basic algorithm is to track the average size of stacks
1312         // and start goroutines with stack equal to that average size.
1313         // Starting at the average size uses at most 2x the space that
1314         // an ideal algorithm would have used.
1315         // This is just a heuristic to avoid excessive stack growth work
1316         // early in a goroutine's lifetime. See issue 18138. Stacks that
1317         // are allocated too small can still grow, and stacks allocated
1318         // too large can still shrink.
1319         var scannedStackSize uint64
1320         var scannedStacks uint64
1321         for _, p := range allp {
1322                 scannedStackSize += p.scannedStackSize
1323                 scannedStacks += p.scannedStacks
1324                 // Reset for next time
1325                 p.scannedStackSize = 0
1326                 p.scannedStacks = 0
1327         }
1328         if scannedStacks == 0 {
1329                 startingStackSize = fixedStack
1330                 return
1331         }
1332         avg := scannedStackSize/scannedStacks + stackGuard
1333         // Note: we add stackGuard to ensure that a goroutine that
1334         // uses the average space will not trigger a growth.
1335         if avg > uint64(maxstacksize) {
1336                 avg = uint64(maxstacksize)
1337         }
1338         if avg < fixedStack {
1339                 avg = fixedStack
1340         }
1341         // Note: maxstacksize fits in 30 bits, so avg also does.
1342         startingStackSize = uint32(round2(int32(avg)))
1343 }