summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2011-09-20 10:07:37 +0000
committerderaadt <deraadt@openbsd.org>2011-09-20 10:07:37 +0000
commite6201cb548517b2ad6aaab598055d0fb0ad4737c (patch)
tree5f8cc154fe84c885fba7ddac71cc6212b8dcc87d /sys/kern/kern_sig.c
parentClear RB_POWERDOWN early in boot() on systems which can not powerdown and (diff)
downloadwireguard-openbsd-e6201cb548517b2ad6aaab598055d0fb0ad4737c.tar.xz
wireguard-openbsd-e6201cb548517b2ad6aaab598055d0fb0ad4737c.zip
MD trap() passes a MD "traptype" and siginfo-style "code" up to the MI
layers. Then things get terribly confusing because the various MI layers swap variable names for parameters, local variables, and structure fields numerous times. Unconfuse all this mess. Note that exec_elf.c coredump cpi_sigcode used to contain the MD traptype but will now contain the MI siginfo-style "code" value. ok miod kettenis pirofti
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c47
1 files changed, 23 insertions, 24 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 3ee7dc8bbcd..d3bbc7671d4 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.126 2011/07/11 15:40:47 guenther Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.127 2011/09/20 10:07:37 deraadt Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -679,7 +679,7 @@ pgsignal(struct pgrp *pgrp, int signum, int checkctty)
* Otherwise, post it normally.
*/
void
-trapsignal(struct proc *p, int signum, u_long code, int type,
+trapsignal(struct proc *p, int signum, u_long trapno, int code,
union sigval sigval)
{
struct sigacts *ps = p->p_sigacts;
@@ -692,14 +692,14 @@ trapsignal(struct proc *p, int signum, u_long code, int type,
if (KTRPOINT(p, KTR_PSIG)) {
siginfo_t si;
- initsiginfo(&si, signum, code, type, sigval);
+ initsiginfo(&si, signum, trapno, code, sigval);
ktrpsig(p, signum, ps->ps_sigact[signum],
- p->p_sigmask, type, &si);
+ p->p_sigmask, code, &si);
}
#endif
p->p_stats->p_ru.ru_nsignals++;
(*p->p_emul->e_sendsig)(ps->ps_sigact[signum], signum,
- p->p_sigmask, code, type, sigval);
+ p->p_sigmask, trapno, code, sigval);
p->p_sigmask |= ps->ps_catchmask[signum];
if ((ps->ps_sigreset & mask) != 0) {
ps->ps_sigcatch &= ~mask;
@@ -709,8 +709,8 @@ trapsignal(struct proc *p, int signum, u_long code, int type,
}
} else {
p->p_sisig = signum;
- p->p_sicode = code; /* XXX for core dump/debugger */
- p->p_sitype = type;
+ p->p_sitrapno = trapno; /* XXX for core dump/debugger */
+ p->p_sicode = code;
p->p_sigval = sigval;
ptsignal(p, signum, STHREAD);
}
@@ -1195,10 +1195,10 @@ postsig(int signum)
struct proc *p = curproc;
struct sigacts *ps = p->p_sigacts;
sig_t action;
- u_long code;
+ u_long trapno;
int mask, returnmask;
union sigval sigval;
- int s, type;
+ int s, code;
#ifdef DIAGNOSTIC
if (signum == 0)
@@ -1211,15 +1211,14 @@ postsig(int signum)
atomic_clearbits_int(&p->p_siglist, mask);
action = ps->ps_sigact[signum];
sigval.sival_ptr = 0;
- type = SI_USER;
if (p->p_sisig != signum) {
- code = 0;
- type = SI_USER;
+ trapno = 0;
+ code = SI_USER;
sigval.sival_ptr = 0;
} else {
+ trapno = p->p_sitrapno;
code = p->p_sicode;
- type = p->p_sitype;
sigval = p->p_sigval;
}
@@ -1227,9 +1226,9 @@ postsig(int signum)
if (KTRPOINT(p, KTR_PSIG)) {
siginfo_t si;
- initsiginfo(&si, signum, code, type, sigval);
+ initsiginfo(&si, signum, trapno, code, sigval);
ktrpsig(p, signum, action, p->p_flag & P_SIGSUSPEND ?
- p->p_oldmask : p->p_sigmask, type, &si);
+ p->p_oldmask : p->p_sigmask, code, &si);
}
#endif
if (action == SIG_DFL) {
@@ -1277,13 +1276,13 @@ postsig(int signum)
p->p_stats->p_ru.ru_nsignals++;
if (p->p_sisig == signum) {
p->p_sisig = 0;
- p->p_sicode = 0;
- p->p_sitype = SI_USER;
+ p->p_sitrapno = 0;
+ p->p_sicode = SI_USER;
p->p_sigval.sival_ptr = NULL;
}
- (*p->p_emul->e_sendsig)(action, signum, returnmask, code,
- type, sigval);
+ (*p->p_emul->e_sendsig)(action, signum, returnmask, trapno,
+ code, sigval);
}
KERNEL_UNLOCK();
@@ -1431,7 +1430,7 @@ coredump_trad(struct proc *p, void *cookie)
strlcpy(core.c_name, p->p_comm, sizeof(core.c_name));
core.c_nseg = 0;
core.c_signo = p->p_sisig;
- core.c_ucode = p->p_sicode;
+ core.c_ucode = p->p_sitrapno;
core.c_cpusize = 0;
core.c_tsize = (u_long)ptoa(vm->vm_tsize);
core.c_dsize = (u_long)ptoa(vm->vm_dsize);
@@ -1561,13 +1560,13 @@ sys_thrsigdivert(struct proc *p, void *v, register_t *retval)
}
void
-initsiginfo(siginfo_t *si, int sig, u_long code, int type, union sigval val)
+initsiginfo(siginfo_t *si, int sig, u_long trapno, int code, union sigval val)
{
bzero(si, sizeof *si);
si->si_signo = sig;
- si->si_code = type;
- if (type == SI_USER) {
+ si->si_code = code;
+ if (code == SI_USER) {
si->si_value = val;
} else {
switch (sig) {
@@ -1576,7 +1575,7 @@ initsiginfo(siginfo_t *si, int sig, u_long code, int type, union sigval val)
case SIGBUS:
case SIGFPE:
si->si_addr = val.sival_ptr;
- si->si_trapno = code;
+ si->si_trapno = trapno;
break;
case SIGXFSZ:
break;