github.com/aloncn/graphics-go@v0.0.1/src/runtime/signal_freebsd.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, "SIGILL: illegal instruction"},
    20  	/* 5 */ {_SigThrow, "SIGTRAP: trace trap"},
    21  	/* 6 */ {_SigNotify + _SigThrow, "SIGABRT: abort"},
    22  	/* 7 */ {_SigThrow, "SIGEMT: emulate instruction executed"},
    23  	/* 8 */ {_SigPanic, "SIGFPE: floating-point exception"},
    24  	/* 9 */ {0, "SIGKILL: kill"},
    25  	/* 10 */ {_SigPanic, "SIGBUS: bus error"},
    26  	/* 11 */ {_SigPanic, "SIGSEGV: segmentation violation"},
    27  	/* 12 */ {_SigNotify, "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, "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, "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  	/* 32 */ {_SigNotify, "SIGTHR: reserved"},
    48  }
    49  
    50  //go:nosplit
    51  //go:nowritebarrierrec
    52  func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
    53  	if sigfwdgo(sig, info, ctx) {
    54  		return
    55  	}
    56  	g := getg()
    57  	if g == nil {
    58  		badsignal(uintptr(sig))
    59  		return
    60  	}
    61  
    62  	// If some non-Go code called sigaltstack, adjust.
    63  	sp := uintptr(unsafe.Pointer(&sig))
    64  	if sp < g.m.gsignal.stack.lo || sp >= g.m.gsignal.stack.hi {
    65  		var st stackt
    66  		sigaltstack(nil, &st)
    67  		if st.ss_flags&_SS_DISABLE != 0 {
    68  			setg(nil)
    69  			cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig))
    70  		}
    71  		stsp := uintptr(unsafe.Pointer(st.ss_sp))
    72  		if sp < stsp || sp >= stsp+st.ss_size {
    73  			setg(nil)
    74  			cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig))
    75  		}
    76  		g.m.gsignal.stack.lo = stsp
    77  		g.m.gsignal.stack.hi = stsp + st.ss_size
    78  		g.m.gsignal.stackguard0 = stsp + _StackGuard
    79  		g.m.gsignal.stackguard1 = stsp + _StackGuard
    80  		g.m.gsignal.stackAlloc = st.ss_size
    81  		g.m.gsignal.stktopsp = getcallersp(unsafe.Pointer(&sig))
    82  	}
    83  
    84  	setg(g.m.gsignal)
    85  	sighandler(sig, info, ctx, g)
    86  	setg(g)
    87  }