Commit eb268cb3 authored by Ian Lance Taylor's avatar Ian Lance Taylor

runtime: minor simplifications to signal code

Change setsig, setsigstack, getsig, raise, raiseproc to take uint32 for
signal number parameter, as that is the type mostly used for signal
numbers.  Same for dieFromSignal, sigInstallGoHandler, raisebadsignal.

Remove setsig restart parameter, as it is always either true or
irrelevant.

Don't check the handler in setsigstack, as the only caller does that
anyhow.

Don't bother to convert the handler from sigtramp to sighandler in
getsig, as it will never be called when the handler is sigtramp or
sighandler.

Don't check the return value from rt_sigaction in the GNU/Linux version
of setsigstack; no other setsigstack checks it, and it never fails.

Change-Id: I6bbd677e048a77eddf974dd3d017bc3c560fbd48
Reviewed-on: https://go-review.googlesource.com/29953
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 594cddd6
...@@ -252,14 +252,10 @@ func sigtramp() ...@@ -252,14 +252,10 @@ func sigtramp()
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = sigset_all sa.sa_mask = sigset_all
if fn == funcPC(sighandler) { if fn == funcPC(sighandler) {
fn = funcPC(sigtramp) fn = funcPC(sigtramp)
...@@ -270,11 +266,10 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -270,11 +266,10 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
handler := *((*uintptr)(unsafe.Pointer(&sa._funcptr))) if sa.sa_flags&_SA_ONSTACK != 0 {
if handler == 0 || handler == _SIG_DFL || handler == _SIG_IGN || sa.sa_flags&_SA_ONSTACK != 0 {
return return
} }
sa.sa_flags |= _SA_ONSTACK sa.sa_flags |= _SA_ONSTACK
...@@ -283,12 +278,9 @@ func setsigstack(i int32) { ...@@ -283,12 +278,9 @@ func setsigstack(i int32) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
if *((*uintptr)(unsafe.Pointer(&sa._funcptr))) == funcPC(sigtramp) {
return funcPC(sighandler)
}
return *((*uintptr)(unsafe.Pointer(&sa._funcptr))) return *((*uintptr)(unsafe.Pointer(&sa._funcptr)))
} }
...@@ -465,11 +457,11 @@ func pthread_create(thread *pthread, attr *pthreadattr, fn uintptr, arg unsafe.P ...@@ -465,11 +457,11 @@ func pthread_create(thread *pthread, attr *pthreadattr, fn uintptr, arg unsafe.P
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func raise(sig int32) /* int32 */ { func raise(sig uint32) /* int32 */ {
sysvicall1(&libc_raise, uintptr(sig)) sysvicall1(&libc_raise, uintptr(sig))
} }
func raiseproc(sig int32) /* int32 */ { func raiseproc(sig uint32) /* int32 */ {
pid := sysvicall0(&libc_getpid) pid := sysvicall0(&libc_getpid)
sysvicall2(&libc_kill, pid, uintptr(sig)) sysvicall2(&libc_kill, pid, uintptr(sig))
} }
...@@ -505,7 +497,7 @@ func setitimer(which int32, value *itimerval, ovalue *itimerval) /* int32 */ { ...@@ -505,7 +497,7 @@ func setitimer(which int32, value *itimerval, ovalue *itimerval) /* int32 */ {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigaction(sig int32, act *sigactiont, oact *sigactiont) /* int32 */ { func sigaction(sig uint32, act *sigactiont, oact *sigactiont) /* int32 */ {
sysvicall3(&libc_sigaction, uintptr(sig), uintptr(unsafe.Pointer(act)), uintptr(unsafe.Pointer(oact))) sysvicall3(&libc_sigaction, uintptr(sig), uintptr(unsafe.Pointer(act)), uintptr(unsafe.Pointer(oact)))
} }
......
...@@ -488,8 +488,8 @@ func sigtramp(fn uintptr, infostyle, sig uint32, info *siginfo, ctx unsafe.Point ...@@ -488,8 +488,8 @@ func sigtramp(fn uintptr, infostyle, sig uint32, info *siginfo, ctx unsafe.Point
//go:noescape //go:noescape
func setitimer(mode int32, new, old *itimerval) func setitimer(mode int32, new, old *itimerval)
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//extern SigTabTT runtime·sigtab[]; //extern SigTabTT runtime·sigtab[];
...@@ -499,25 +499,22 @@ var sigset_all = ^sigset(0) ...@@ -499,25 +499,22 @@ var sigset_all = ^sigset(0)
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = ^uint32(0) sa.sa_mask = ^uint32(0)
sa.sa_tramp = unsafe.Pointer(funcPC(sigtramp)) // runtime·sigtramp's job is to call into real handler sa.sa_tramp = unsafe.Pointer(funcPC(sigtramp)) // runtime·sigtramp's job is to call into real handler
*(*uintptr)(unsafe.Pointer(&sa.__sigaction_u)) = fn *(*uintptr)(unsafe.Pointer(&sa.__sigaction_u)) = fn
sigaction(uint32(i), &sa, nil) sigaction(i, &sa, nil)
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
var osa usigactiont var osa usigactiont
sigaction(uint32(i), nil, &osa) sigaction(i, nil, &osa)
handler := *(*uintptr)(unsafe.Pointer(&osa.__sigaction_u)) handler := *(*uintptr)(unsafe.Pointer(&osa.__sigaction_u))
if handler == 0 || handler == _SIG_DFL || handler == _SIG_IGN || osa.sa_flags&_SA_ONSTACK != 0 { if osa.sa_flags&_SA_ONSTACK != 0 {
return return
} }
var sa sigactiont var sa sigactiont
...@@ -525,14 +522,14 @@ func setsigstack(i int32) { ...@@ -525,14 +522,14 @@ func setsigstack(i int32) {
sa.sa_tramp = unsafe.Pointer(funcPC(sigtramp)) sa.sa_tramp = unsafe.Pointer(funcPC(sigtramp))
sa.sa_mask = osa.sa_mask sa.sa_mask = osa.sa_mask
sa.sa_flags = osa.sa_flags | _SA_ONSTACK sa.sa_flags = osa.sa_flags | _SA_ONSTACK
sigaction(uint32(i), &sa, nil) sigaction(i, &sa, nil)
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa usigactiont var sa usigactiont
sigaction(uint32(i), nil, &sa) sigaction(i, nil, &sa)
return *(*uintptr)(unsafe.Pointer(&sa.__sigaction_u)) return *(*uintptr)(unsafe.Pointer(&sa.__sigaction_u))
} }
......
...@@ -25,7 +25,7 @@ func lwp_create(param *lwpparams) int32 ...@@ -25,7 +25,7 @@ func lwp_create(param *lwpparams) int32
func sigaltstack(new, old *stackt) func sigaltstack(new, old *stackt)
//go:noescape //go:noescape
func sigaction(sig int32, new, old *sigactiont) func sigaction(sig uint32, new, old *sigactiont)
//go:noescape //go:noescape
func sigprocmask(how int32, new, old *sigset) func sigprocmask(how int32, new, old *sigset)
...@@ -39,8 +39,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds ...@@ -39,8 +39,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds
//go:noescape //go:noescape
func getrlimit(kind int32, limit unsafe.Pointer) int32 func getrlimit(kind int32, limit unsafe.Pointer) int32
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func sys_umtx_sleep(addr *uint32, val, timeout int32) int32 func sys_umtx_sleep(addr *uint32, val, timeout int32) int32
...@@ -234,12 +234,9 @@ type sigactiont struct { ...@@ -234,12 +234,9 @@ type sigactiont struct {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = sigset_all sa.sa_mask = sigset_all
if fn == funcPC(sighandler) { if fn == funcPC(sighandler) {
fn = funcPC(sigtramp) fn = funcPC(sigtramp)
...@@ -250,18 +247,15 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -250,18 +247,15 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
throw("setsigstack") throw("setsigstack")
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
if sa.sa_sigaction == funcPC(sigtramp) {
return funcPC(sighandler)
}
return sa.sa_sigaction return sa.sa_sigaction
} }
......
...@@ -18,7 +18,7 @@ func thr_new(param *thrparam, size int32) ...@@ -18,7 +18,7 @@ func thr_new(param *thrparam, size int32)
func sigaltstack(new, old *stackt) func sigaltstack(new, old *stackt)
//go:noescape //go:noescape
func sigaction(sig int32, new, old *sigactiont) func sigaction(sig uint32, new, old *sigactiont)
//go:noescape //go:noescape
func sigprocmask(how int32, new, old *sigset) func sigprocmask(how int32, new, old *sigset)
...@@ -31,8 +31,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds ...@@ -31,8 +31,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds
//go:noescape //go:noescape
func getrlimit(kind int32, limit unsafe.Pointer) int32 func getrlimit(kind int32, limit unsafe.Pointer) int32
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func sys_umtx_op(addr *uint32, mode int32, val uint32, ptr2, ts *timespec) int32 func sys_umtx_op(addr *uint32, mode int32, val uint32, ptr2, ts *timespec) int32
...@@ -224,12 +224,9 @@ type sigactiont struct { ...@@ -224,12 +224,9 @@ type sigactiont struct {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = sigset_all sa.sa_mask = sigset_all
if fn == funcPC(sighandler) { if fn == funcPC(sighandler) {
fn = funcPC(sigtramp) fn = funcPC(sigtramp)
...@@ -240,18 +237,15 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -240,18 +237,15 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
throw("setsigstack") throw("setsigstack")
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
if sa.sa_handler == funcPC(sigtramp) {
return funcPC(sighandler)
}
return sa.sa_handler return sa.sa_handler
} }
......
...@@ -329,8 +329,8 @@ func sigprocmask(how int32, new, old *sigset) { ...@@ -329,8 +329,8 @@ func sigprocmask(how int32, new, old *sigset) {
//go:noescape //go:noescape
func getrlimit(kind int32, limit unsafe.Pointer) int32 func getrlimit(kind int32, limit unsafe.Pointer) int32
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func sched_getaffinity(pid, len uintptr, buf *uintptr) int32 func sched_getaffinity(pid, len uintptr, buf *uintptr) int32
...@@ -338,12 +338,9 @@ func osyield() ...@@ -338,12 +338,9 @@ func osyield()
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTORER sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTORER | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sigfillset(&sa.sa_mask) sigfillset(&sa.sa_mask)
// Although Linux manpage says "sa_restorer element is obsolete and // Although Linux manpage says "sa_restorer element is obsolete and
// should not be used". x86_64 kernel requires it. Only use it on // should not be used". x86_64 kernel requires it. Only use it on
...@@ -364,30 +361,23 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -364,30 +361,23 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
var sa sigactiont var sa sigactiont
if rt_sigaction(uintptr(i), nil, &sa, unsafe.Sizeof(sa.sa_mask)) != 0 { rt_sigaction(uintptr(i), nil, &sa, unsafe.Sizeof(sa.sa_mask))
throw("rt_sigaction failure") if sa.sa_flags&_SA_ONSTACK != 0 {
}
if sa.sa_handler == 0 || sa.sa_handler == _SIG_DFL || sa.sa_handler == _SIG_IGN || sa.sa_flags&_SA_ONSTACK != 0 {
return return
} }
sa.sa_flags |= _SA_ONSTACK sa.sa_flags |= _SA_ONSTACK
if rt_sigaction(uintptr(i), &sa, nil, unsafe.Sizeof(sa.sa_mask)) != 0 { rt_sigaction(uintptr(i), &sa, nil, unsafe.Sizeof(sa.sa_mask))
throw("rt_sigaction failure")
}
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
if rt_sigaction(uintptr(i), nil, &sa, unsafe.Sizeof(sa.sa_mask)) != 0 { if rt_sigaction(uintptr(i), nil, &sa, unsafe.Sizeof(sa.sa_mask)) != 0 {
throw("rt_sigaction read failure") throw("rt_sigaction read failure")
} }
if sa.sa_handler == funcPC(sigtramp) || sa.sa_handler == funcPC(cgoSigtramp) {
return funcPC(sighandler)
}
return sa.sa_handler return sa.sa_handler
} }
......
...@@ -45,7 +45,7 @@ func os_sigpipe() { ...@@ -45,7 +45,7 @@ func os_sigpipe() {
throw("too many writes on closed pipe") throw("too many writes on closed pipe")
} }
func dieFromSignal(sig int32) { func dieFromSignal(sig uint32) {
exit(2) exit(2)
} }
...@@ -60,7 +60,7 @@ func sigpanic() { ...@@ -60,7 +60,7 @@ func sigpanic() {
panicmem() panicmem()
} }
func raiseproc(sig int32) { func raiseproc(sig uint32) {
} }
// Stubs so tests can link correctly. These should never be called. // Stubs so tests can link correctly. These should never be called.
...@@ -254,7 +254,7 @@ func badsignalgo(sig uintptr) { ...@@ -254,7 +254,7 @@ func badsignalgo(sig uintptr) {
if !sigsend(uint32(sig)) { if !sigsend(uint32(sig)) {
// A foreign thread received the signal sig, and the // A foreign thread received the signal sig, and the
// Go code does not want to handle it. // Go code does not want to handle it.
raisebadsignal(int32(sig)) raisebadsignal(uint32(sig))
} }
} }
...@@ -267,7 +267,7 @@ func badsignal2() { ...@@ -267,7 +267,7 @@ func badsignal2() {
var badsignal1 = []byte("runtime: signal received on thread not created by Go.\n") var badsignal1 = []byte("runtime: signal received on thread not created by Go.\n")
func raisebadsignal(sig int32) { func raisebadsignal(sig uint32) {
badsignal2() badsignal2()
} }
......
...@@ -32,7 +32,7 @@ type mOS struct { ...@@ -32,7 +32,7 @@ type mOS struct {
func setitimer(mode int32, new, old *itimerval) func setitimer(mode int32, new, old *itimerval)
//go:noescape //go:noescape
func sigaction(sig int32, new, old *sigactiont) func sigaction(sig uint32, new, old *sigactiont)
//go:noescape //go:noescape
func sigaltstack(new, old *stackt) func sigaltstack(new, old *stackt)
...@@ -45,8 +45,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds ...@@ -45,8 +45,8 @@ func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, nds
func lwp_tramp() func lwp_tramp()
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func getcontext(ctxt unsafe.Pointer) func getcontext(ctxt unsafe.Pointer)
...@@ -262,12 +262,9 @@ type sigactiont struct { ...@@ -262,12 +262,9 @@ type sigactiont struct {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = sigset_all sa.sa_mask = sigset_all
if fn == funcPC(sighandler) { if fn == funcPC(sighandler) {
fn = funcPC(sigtramp) fn = funcPC(sigtramp)
...@@ -278,18 +275,15 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -278,18 +275,15 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
throw("setsigstack") throw("setsigstack")
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
if sa.sa_sigaction == funcPC(sigtramp) {
return funcPC(sighandler)
}
return sa.sa_sigaction return sa.sa_sigaction
} }
......
...@@ -17,7 +17,7 @@ type mOS struct { ...@@ -17,7 +17,7 @@ type mOS struct {
func setitimer(mode int32, new, old *itimerval) func setitimer(mode int32, new, old *itimerval)
//go:noescape //go:noescape
func sigaction(sig int32, new, old *sigactiont) func sigaction(sig uint32, new, old *sigactiont)
//go:noescape //go:noescape
func sigaltstack(new, old *stackt) func sigaltstack(new, old *stackt)
...@@ -41,8 +41,8 @@ func sigprocmask(how int32, new, old *sigset) { ...@@ -41,8 +41,8 @@ func sigprocmask(how int32, new, old *sigset) {
//go:noescape //go:noescape
func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
func raise(sig int32) func raise(sig uint32)
func raiseproc(sig int32) func raiseproc(sig uint32)
//go:noescape //go:noescape
func tfork(param *tforkt, psize uintptr, mm *m, gg *g, fn uintptr) int32 func tfork(param *tforkt, psize uintptr, mm *m, gg *g, fn uintptr) int32
...@@ -240,12 +240,9 @@ type sigactiont struct { ...@@ -240,12 +240,9 @@ type sigactiont struct {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsig(i int32, fn uintptr, restart bool) { func setsig(i uint32, fn uintptr) {
var sa sigactiont var sa sigactiont
sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK sa.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
if restart {
sa.sa_flags |= _SA_RESTART
}
sa.sa_mask = uint32(sigset_all) sa.sa_mask = uint32(sigset_all)
if fn == funcPC(sighandler) { if fn == funcPC(sighandler) {
fn = funcPC(sigtramp) fn = funcPC(sigtramp)
...@@ -256,18 +253,15 @@ func setsig(i int32, fn uintptr, restart bool) { ...@@ -256,18 +253,15 @@ func setsig(i int32, fn uintptr, restart bool) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func setsigstack(i int32) { func setsigstack(i uint32) {
throw("setsigstack") throw("setsigstack")
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func getsig(i int32) uintptr { func getsig(i uint32) uintptr {
var sa sigactiont var sa sigactiont
sigaction(i, nil, &sa) sigaction(i, nil, &sa)
if sa.sa_sigaction == funcPC(sigtramp) {
return funcPC(sighandler)
}
return sa.sa_sigaction return sa.sa_sigaction
} }
......
...@@ -467,7 +467,7 @@ func badsignal2() { ...@@ -467,7 +467,7 @@ func badsignal2() {
exits(&_badsignal[0]) exits(&_badsignal[0])
} }
func raisebadsignal(sig int32) { func raisebadsignal(sig uint32) {
badsignal2() badsignal2()
} }
......
...@@ -67,7 +67,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) { ...@@ -67,7 +67,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
} }
if flags&_SigKill != 0 { if flags&_SigKill != 0 {
dieFromSignal(int32(sig)) dieFromSignal(sig)
} }
if flags&_SigThrow == 0 { if flags&_SigThrow == 0 {
......
...@@ -71,7 +71,7 @@ func initsig(preinit bool) { ...@@ -71,7 +71,7 @@ func initsig(preinit bool) {
return return
} }
for i := int32(0); i < _NSIG; i++ { for i := uint32(0); i < _NSIG; i++ {
t := &sigtable[i] t := &sigtable[i]
if t.flags == 0 || t.flags&_SigDefault != 0 { if t.flags == 0 || t.flags&_SigDefault != 0 {
continue continue
...@@ -88,13 +88,13 @@ func initsig(preinit bool) { ...@@ -88,13 +88,13 @@ func initsig(preinit bool) {
} }
t.flags |= _SigHandling t.flags |= _SigHandling
setsig(i, funcPC(sighandler), true) setsig(i, funcPC(sighandler))
} }
} }
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigInstallGoHandler(sig int32) bool { func sigInstallGoHandler(sig uint32) bool {
// For some signals, we respect an inherited SIG_IGN handler // For some signals, we respect an inherited SIG_IGN handler
// rather than insist on installing our own default handler. // rather than insist on installing our own default handler.
// Even these signals can be fetched using the os/signal package. // Even these signals can be fetched using the os/signal package.
...@@ -131,8 +131,8 @@ func sigenable(sig uint32) { ...@@ -131,8 +131,8 @@ func sigenable(sig uint32) {
<-maskUpdatedChan <-maskUpdatedChan
if t.flags&_SigHandling == 0 { if t.flags&_SigHandling == 0 {
t.flags |= _SigHandling t.flags |= _SigHandling
fwdSig[sig] = getsig(int32(sig)) fwdSig[sig] = getsig(sig)
setsig(int32(sig), funcPC(sighandler), true) setsig(sig, funcPC(sighandler))
} }
} }
} }
...@@ -151,9 +151,9 @@ func sigdisable(sig uint32) { ...@@ -151,9 +151,9 @@ func sigdisable(sig uint32) {
// If initsig does not install a signal handler for a // If initsig does not install a signal handler for a
// signal, then to go back to the state before Notify // signal, then to go back to the state before Notify
// we should remove the one we installed. // we should remove the one we installed.
if !sigInstallGoHandler(int32(sig)) { if !sigInstallGoHandler(sig) {
t.flags &^= _SigHandling t.flags &^= _SigHandling
setsig(int32(sig), fwdSig[sig], true) setsig(sig, fwdSig[sig])
} }
} }
} }
...@@ -166,7 +166,7 @@ func sigignore(sig uint32) { ...@@ -166,7 +166,7 @@ func sigignore(sig uint32) {
t := &sigtable[sig] t := &sigtable[sig]
if t.flags&_SigNotify != 0 { if t.flags&_SigNotify != 0 {
t.flags &^= _SigHandling t.flags &^= _SigHandling
setsig(int32(sig), _SIG_IGN, true) setsig(sig, _SIG_IGN)
} }
} }
...@@ -295,8 +295,8 @@ func sigpanic() { ...@@ -295,8 +295,8 @@ func sigpanic() {
// This is only called with fatal signals expected to kill the process. // This is only called with fatal signals expected to kill the process.
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func dieFromSignal(sig int32) { func dieFromSignal(sig uint32) {
setsig(sig, _SIG_DFL, false) setsig(sig, _SIG_DFL)
unblocksig(sig) unblocksig(sig)
raise(sig) raise(sig)
...@@ -316,7 +316,7 @@ func dieFromSignal(sig int32) { ...@@ -316,7 +316,7 @@ func dieFromSignal(sig int32) {
// raisebadsignal is called when a signal is received on a non-Go // raisebadsignal is called when a signal is received on a non-Go
// thread, and the Go program does not want to handle it (that is, the // thread, and the Go program does not want to handle it (that is, the
// program has not called os/signal.Notify for the signal). // program has not called os/signal.Notify for the signal).
func raisebadsignal(sig int32, c *sigctxt) { func raisebadsignal(sig uint32, c *sigctxt) {
if sig == _SIGPROF { if sig == _SIGPROF {
// Ignore profiling signals that arrive on non-Go threads. // Ignore profiling signals that arrive on non-Go threads.
return return
...@@ -338,7 +338,7 @@ func raisebadsignal(sig int32, c *sigctxt) { ...@@ -338,7 +338,7 @@ func raisebadsignal(sig int32, c *sigctxt) {
// it. That means that we don't have to worry about blocking it // it. That means that we don't have to worry about blocking it
// again. // again.
unblocksig(sig) unblocksig(sig)
setsig(sig, handler, false) setsig(sig, handler)
// If we're linked into a non-Go program we want to try to // If we're linked into a non-Go program we want to try to
// avoid modifying the original context in which the signal // avoid modifying the original context in which the signal
...@@ -359,7 +359,7 @@ func raisebadsignal(sig int32, c *sigctxt) { ...@@ -359,7 +359,7 @@ func raisebadsignal(sig int32, c *sigctxt) {
// We may receive another instance of the signal before we // We may receive another instance of the signal before we
// restore the Go handler, but that is not so bad: we know // restore the Go handler, but that is not so bad: we know
// that the Go program has been ignoring the signal. // that the Go program has been ignoring the signal.
setsig(sig, funcPC(sighandler), true) setsig(sig, funcPC(sighandler))
} }
func crash() { func crash() {
...@@ -448,7 +448,7 @@ func badsignalgo(sig uintptr, c *sigctxt) { ...@@ -448,7 +448,7 @@ func badsignalgo(sig uintptr, c *sigctxt) {
if !sigsend(uint32(sig)) { if !sigsend(uint32(sig)) {
// A foreign thread received the signal sig, and the // A foreign thread received the signal sig, and the
// Go code does not want to handle it. // Go code does not want to handle it.
raisebadsignal(int32(sig), c) raisebadsignal(uint32(sig), c)
} }
} }
...@@ -473,7 +473,7 @@ func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool { ...@@ -473,7 +473,7 @@ func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool {
// at program startup, but the Go runtime has not yet // at program startup, but the Go runtime has not yet
// been initialized. // been initialized.
if fwdFn == _SIG_DFL { if fwdFn == _SIG_DFL {
dieFromSignal(int32(sig)) dieFromSignal(sig)
} else { } else {
sigfwd(fwdFn, sig, info, ctx) sigfwd(fwdFn, sig, info, ctx)
} }
...@@ -552,7 +552,7 @@ func sigblock() { ...@@ -552,7 +552,7 @@ func sigblock() {
// signal handler, on the signal stack, with no g available. // signal handler, on the signal stack, with no g available.
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func unblocksig(sig int32) { func unblocksig(sig uint32) {
var set sigset var set sigset
sigaddset(&set, int(sig)) sigaddset(&set, int(sig))
sigprocmask(_SIG_UNBLOCK, &set, nil) sigprocmask(_SIG_UNBLOCK, &set, nil)
......
...@@ -205,7 +205,7 @@ func sigignore(sig uint32) { ...@@ -205,7 +205,7 @@ func sigignore(sig uint32) {
func badsignal2() func badsignal2()
func raisebadsignal(sig int32) { func raisebadsignal(sig uint32) {
badsignal2() badsignal2()
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment