github.com/letsencrypt/go@v0.0.0-20160714163537-4054769a31f6/src/runtime/signal_darwin.go (about)

     1  // Copyright 2009 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  package runtime
     6  
     7  import "unsafe"
     8  
     9  type sigTabT struct {
    10  	flags int32
    11  	name  string
    12  }
    13  
    14  var sigtable = [...]sigTabT{
    15  	/* 0 */ {0, "SIGNONE: no trap"},
    16  	/* 1 */ {_SigNotify + _SigKill, "SIGHUP: terminal line hangup"},
    17  	/* 2 */ {_SigNotify + _SigKill, "SIGINT: interrupt"},
    18  	/* 3 */ {_SigNotify + _SigThrow, "SIGQUIT: quit"},
    19  	/* 4 */ {_SigThrow + _SigUnblock, "SIGILL: illegal instruction"},
    20  	/* 5 */ {_SigThrow + _SigUnblock, "SIGTRAP: trace trap"},
    21  	/* 6 */ {_SigNotify + _SigThrow, "SIGABRT: abort"},
    22  	/* 7 */ {_SigThrow, "SIGEMT: emulate instruction executed"},
    23  	/* 8 */ {_SigPanic + _SigUnblock, "SIGFPE: floating-point exception"},
    24  	/* 9 */ {0, "SIGKILL: kill"},
    25  	/* 10 */ {_SigPanic + _SigUnblock, "SIGBUS: bus error"},
    26  	/* 11 */ {_SigPanic + _SigUnblock, "SIGSEGV: segmentation violation"},
    27  	/* 12 */ {_SigThrow, "SIGSYS: bad system call"},
    28  	/* 13 */ {_SigNotify, "SIGPIPE: write to broken pipe"},
    29  	/* 14 */ {_SigNotify, "SIGALRM: alarm clock"},
    30  	/* 15 */ {_SigNotify + _SigKill, "SIGTERM: termination"},
    31  	/* 16 */ {_SigNotify, "SIGURG: urgent condition on socket"},
    32  	/* 17 */ {0, "SIGSTOP: stop"},
    33  	/* 18 */ {_SigNotify + _SigDefault, "SIGTSTP: keyboard stop"},
    34  	/* 19 */ {_SigNotify + _SigDefault, "SIGCONT: continue after stop"},
    35  	/* 20 */ {_SigNotify + _SigUnblock, "SIGCHLD: child status has changed"},
    36  	/* 21 */ {_SigNotify + _SigDefault, "SIGTTIN: background read from tty"},
    37  	/* 22 */ {_SigNotify + _SigDefault, "SIGTTOU: background write to tty"},
    38  	/* 23 */ {_SigNotify, "SIGIO: i/o now possible"},
    39  	/* 24 */ {_SigNotify, "SIGXCPU: cpu limit exceeded"},
    40  	/* 25 */ {_SigNotify, "SIGXFSZ: file size limit exceeded"},
    41  	/* 26 */ {_SigNotify, "SIGVTALRM: virtual alarm clock"},
    42  	/* 27 */ {_SigNotify + _SigUnblock, "SIGPROF: profiling alarm clock"},
    43  	/* 28 */ {_SigNotify, "SIGWINCH: window size change"},
    44  	/* 29 */ {_SigNotify, "SIGINFO: status request from keyboard"},
    45  	/* 30 */ {_SigNotify, "SIGUSR1: user-defined signal 1"},
    46  	/* 31 */ {_SigNotify, "SIGUSR2: user-defined signal 2"},
    47  }
    48  
    49  //go:noescape
    50  func sigreturn(ctx unsafe.Pointer, infostyle uint32)
    51  
    52  //go:nosplit
    53  //go:nowritebarrierrec
    54  func sigtrampgo(fn uintptr, infostyle, sig uint32, info *siginfo, ctx unsafe.Pointer) {
    55  	if sigfwdgo(sig, info, ctx) {
    56  		sigreturn(ctx, infostyle)
    57  		return
    58  	}
    59  	g := getg()
    60  	if g == nil {
    61  		badsignal(uintptr(sig), &sigctxt{info, ctx})
    62  		sigreturn(ctx, infostyle)
    63  		return
    64  	}
    65  
    66  	// If some non-Go code called sigaltstack, adjust.
    67  	sp := uintptr(unsafe.Pointer(&sig))
    68  	if sp < g.m.gsignal.stack.lo || sp >= g.m.gsignal.stack.hi {
    69  		var st stackt
    70  		sigaltstack(nil, &st)
    71  		if st.ss_flags&_SS_DISABLE != 0 {
    72  			setg(nil)
    73  			cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0)
    74  		}
    75  		stsp := uintptr(unsafe.Pointer(st.ss_sp))
    76  		if sp < stsp || sp >= stsp+st.ss_size {
    77  			setg(nil)
    78  			cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0)
    79  		}
    80  		g.m.gsignal.stack.lo = stsp
    81  		g.m.gsignal.stack.hi = stsp + st.ss_size
    82  		g.m.gsignal.stackguard0 = stsp + _StackGuard
    83  		g.m.gsignal.stackguard1 = stsp + _StackGuard
    84  		g.m.gsignal.stackAlloc = st.ss_size
    85  		g.m.gsignal.stktopsp = getcallersp(unsafe.Pointer(&sig))
    86  	}
    87  
    88  	setg(g.m.gsignal)
    89  	c := &sigctxt{info, ctx}
    90  	c.fixsigcode(sig)
    91  	sighandler(sig, info, ctx, g)
    92  	setg(g)
    93  	sigreturn(ctx, infostyle)
    94  }