runtime: pass signal context to cgo traceback function

When doing a backtrace from a signal that occurs in C code compiled
without using -fasynchronous-unwind-tables, we have to rely on frame
pointers. In order to do that, the traceback function needs the signal
context to reliably pick up the frame pointer.

Change-Id: I7b45930fced01685c337d108e0f146057928f876
Reviewed-on: https://go-review.googlesource.com/23494
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 279fb52..f9d9f21 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -858,15 +858,17 @@
 // pointer to a struct:
 //
 //	struct {
-//		Context uintptr
-//		Buf     *uintptr
-//		Max     uintptr
+//		Context    uintptr
+//		SigContext uintptr
+//		Buf        *uintptr
+//		Max        uintptr
 //	}
 //
 // In C syntax, this struct will be
 //
 //	struct {
 //		uintptr_t  Context;
+//		uintptr_t  SigContext;
 //		uintptr_t* Buf;
 //		uintptr_t  Max;
 //	};
@@ -887,6 +889,13 @@
 // result, if possible, the first time this is called for a specific
 // context value.
 //
+// If the traceback function is called from a signal handler on a Unix
+// system, SigContext will be the signal context argument passed to
+// the signal handler (a C ucontext_t* cast to uintptr_t). This may be
+// used to start tracing at the point where the signal occurred. If
+// the traceback function is not called from a signal handler,
+// SigContext will be zero.
+//
 // Buf is where the traceback information should be stored. It should
 // be PC values, such that Buf[0] is the PC of the caller, Buf[1] is
 // the PC of that function's caller, and so on.  Max is the maximum
@@ -973,9 +982,10 @@
 
 // cgoTracebackArg is the type passed to cgoTraceback.
 type cgoTracebackArg struct {
-	context uintptr
-	buf     *uintptr
-	max     uintptr
+	context    uintptr
+	sigContext uintptr
+	buf        *uintptr
+	max        uintptr
 }
 
 // cgoContextArg is the type passed to the context function.