...

Text file src/pkg/runtime/cgo/signal_darwin_arm.s

     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|NOFRAME,$0
    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)

View as plain text