@@ -398,6 +398,35 @@ bad:
398
398
CALL AX
399
399
INT $3
400
400
401
+ // func switchToCrashStack0(fn func())
402
+ TEXT runtime·switchToCrashStack0(SB), NOSPLIT, $0 -4
403
+ MOVL fn+0 (FP), AX
404
+
405
+ get_tls(CX)
406
+ MOVL g(CX), BX // BX = g
407
+ MOVL g_m(BX), DX // DX = curm
408
+
409
+ // set g to gcrash
410
+ LEAL runtime·gcrash(SB), BX // g = &gcrash
411
+ MOVL DX, g_m(BX) // g.m = curm
412
+ MOVL BX, m_g0(DX) // curm.g0 = g
413
+ get_tls(CX)
414
+ MOVL BX, g(CX)
415
+
416
+ // switch to crashstack
417
+ MOVL (g_stack+stack_hi)(BX), DX
418
+ SUBL $(4*8 ), DX
419
+ MOVL DX, SP
420
+
421
+ // call target function
422
+ MOVL AX, DX
423
+ MOVL 0 (AX), AX
424
+ CALL AX
425
+
426
+ // should never return
427
+ CALL runtime·abort(SB)
428
+ UNDEF
429
+
401
430
/*
402
431
* support for morestack
403
432
*/
@@ -408,11 +437,19 @@ bad:
408
437
// the top of a stack (for example, morestack calling newstack
409
438
// calling the scheduler calling newm calling gc), so we must
410
439
// record an argument size. For that purpose, it has no arguments.
411
- TEXT runtime·morestack(SB),NOSPLIT,$0 -0
440
+ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME ,$0 -0
412
441
// Cannot grow scheduler stack (m->g0).
413
442
get_tls(CX)
414
- MOVL g(CX), BX
415
- MOVL g_m(BX), BX
443
+ MOVL g(CX), DI
444
+ MOVL g_m(DI), BX
445
+
446
+ // Set g->sched to context in f.
447
+ MOVL 0 (SP), AX // f's PC
448
+ MOVL AX, (g_sched+gobuf_pc)(DI)
449
+ LEAL 4 (SP), AX // f's SP
450
+ MOVL AX, (g_sched+gobuf_sp)(DI)
451
+ MOVL DX, (g_sched+gobuf_ctxt)(DI)
452
+
416
453
MOVL m_g0(BX), SI
417
454
CMPL g(CX), SI
418
455
JNE 3 (PC)
@@ -437,13 +474,6 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
437
474
MOVL g(CX), SI
438
475
MOVL SI, (m_morebuf+gobuf_g)(BX)
439
476
440
- // Set g->sched to context in f.
441
- MOVL 0 (SP), AX // f's PC
442
- MOVL AX, (g_sched+gobuf_pc)(SI)
443
- LEAL 4 (SP), AX // f's SP
444
- MOVL AX, (g_sched+gobuf_sp)(SI)
445
- MOVL DX, (g_sched+gobuf_ctxt)(SI)
446
-
447
477
// Call newstack on m->g0's stack.
448
478
MOVL m_g0(BX), BP
449
479
MOVL BP, g(CX)
0 commit comments