| // Copyright 2016 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. | 
 |  | 
 | // +build cgo | 
 | // +build linux | 
 |  | 
 | #include <stdint.h> | 
 |  | 
 | struct cgoTracebackArg { | 
 | 	uintptr_t  Context; | 
 | 	uintptr_t  SigContext; | 
 | 	uintptr_t* Buf; | 
 | 	uintptr_t  Max; | 
 | }; | 
 |  | 
 | // Call the user's traceback function and then call sigtramp. | 
 | // The runtime signal handler will jump to this code. | 
 | // We do it this way so that the user's traceback function will be called | 
 | // by a C function with proper unwind info. | 
 | void | 
 | x_cgo_callers(uintptr_t sig, void *info, void *context, void (*cgoTraceback)(struct cgoTracebackArg*), uintptr_t* cgoCallers, void (*sigtramp)(uintptr_t, void*, void*)) { | 
 | 	struct cgoTracebackArg arg; | 
 |  | 
 | 	arg.Context = 0; | 
 | 	arg.SigContext = (uintptr_t)(context); | 
 | 	arg.Buf = cgoCallers; | 
 | 	arg.Max = 32; // must match len(runtime.cgoCallers) | 
 | 	(*cgoTraceback)(&arg); | 
 | 	sigtramp(sig, info, context); | 
 | } |