...
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