|  | // Copyright 2015 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | #include "textflag.h" | 
|  |  | 
|  | // xx_cgo_panicmem is the entrypoint for SIGSEGV as intercepted via a | 
|  | // mach thread port as EXC_BAD_ACCESS. As the segfault may have happened | 
|  | // in C code, we first need to load_g then call xx_cgo_panicmem. | 
|  | // | 
|  | //	R1 - LR at moment of fault | 
|  | //	R2 - PC at moment of fault | 
|  | TEXT xx_cgo_panicmem(SB),NOSPLIT|NOFRAME,$0 | 
|  | // If in external C code, we need to load the g register. | 
|  | BL  runtime·load_g(SB) | 
|  | CMP $0, g | 
|  | BNE ongothread | 
|  |  | 
|  | // On a foreign thread. | 
|  | // TODO(crawshaw): call badsignal | 
|  | MOVD.W $0, -16(RSP) | 
|  | MOVW $139, R1 | 
|  | MOVW R1, 8(RSP) | 
|  | B    runtime·exit(SB) | 
|  |  | 
|  | ongothread: | 
|  | // Trigger a SIGSEGV panic. | 
|  | // | 
|  | // The goal is to arrange the stack so it looks like the runtime | 
|  | // function sigpanic was called from the PC that faulted. It has | 
|  | // to be sigpanic, as the stack unwinding code in traceback.go | 
|  | // looks explicitly for it. | 
|  | // | 
|  | // To do this we call into runtime·setsigsegv, which sets the | 
|  | // appropriate state inside the g object. We give it the faulting | 
|  | // PC on the stack, then put it in the LR before calling sigpanic. | 
|  |  | 
|  | // Build a 32-byte stack frame for us for this call. | 
|  | // Saved LR (none available) is at the bottom, | 
|  | // then the PC argument for setsigsegv, | 
|  | // then a copy of the LR for us to restore. | 
|  | MOVD.W $0, -32(RSP) | 
|  | MOVD R1, 8(RSP) | 
|  | MOVD R2, 16(RSP) | 
|  | BL runtime·setsigsegv(SB) | 
|  | MOVD 8(RSP), R1 | 
|  | MOVD 16(RSP), R2 | 
|  |  | 
|  | // Build a 16-byte stack frame for the simulated | 
|  | // call to sigpanic, by taking 16 bytes away from the | 
|  | // 32-byte stack frame above. | 
|  | // The saved LR in this frame is the LR at time of fault, | 
|  | // and the LR on entry to sigpanic is the PC at time of fault. | 
|  | MOVD.W R1, 16(RSP) | 
|  | MOVD R2, R30 | 
|  | B runtime·sigpanic(SB) |