github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/src/runtime/cgo/signal_darwin_arm.s (about)

     1  // Copyright 2015 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  #include "textflag.h"
     6  
     7  // xx_cgo_panicmem is the entrypoint for SIGSEGV as intercepted via a
     8  // mach thread port as EXC_BAD_ACCESS. As the segfault may have happened
     9  // in C code, we first need to load_g then call xx_cgo_panicmem.
    10  //
    11  //	R1 - LR at moment of fault
    12  //	R2 - PC at moment of fault
    13  TEXT xx_cgo_panicmem(SB),NOSPLIT,$-4
    14  	// If in external C code, we need to load the g register.
    15  	BL  runtime·load_g(SB)
    16  	CMP $0, g
    17  	BNE ongothread
    18  
    19  	// On a foreign thread. We call badsignal, which will, if all
    20  	// goes according to plan, not return.
    21  	SUB  $4, R13
    22  	MOVW $11, R1
    23  	MOVW $11, R2
    24  	MOVM.DB.W [R1,R2], (R13)
    25  	// TODO: badsignal should not return, but it does. Issue #10139.
    26  	//BL runtime·badsignal(SB)
    27  	MOVW $139, R1
    28  	MOVW R1, 4(R13)
    29  	B    runtime·exit(SB)
    30  
    31  ongothread:
    32  	// Trigger a SIGSEGV panic.
    33  	//
    34  	// The goal is to arrange the stack so it looks like the runtime
    35  	// function sigpanic was called from the PC that faulted. It has
    36  	// to be sigpanic, as the stack unwinding code in traceback.go
    37  	// looks explicitly for it.
    38  	//
    39  	// To do this we call into runtime·setsigsegv, which sets the
    40  	// appropriate state inside the g object. We give it the faulting
    41  	// PC on the stack, then put it in the LR before calling sigpanic.
    42  	MOVM.DB.W [R1,R2], (R13)
    43  	BL runtime·setsigsegv(SB)
    44  	MOVM.IA.W (R13), [R1,R2]
    45  
    46  	SUB $4, R13
    47  	MOVW R1, 0(R13)
    48  	MOVW R2, R14
    49  	B runtime·sigpanic(SB)