summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2002-02-22 19:19:28 +0000
committerderaadt <deraadt@openbsd.org>2002-02-22 19:19:28 +0000
commit35461e313ebf147ac039ad48ba54721c6ca27dec (patch)
tree3ae6615db5c4d79ec5d20d2afb15af20caeb79c0
parentFrom NetBSD: (diff)
downloadwireguard-openbsd-35461e313ebf147ac039ad48ba54721c6ca27dec.tar.xz
wireguard-openbsd-35461e313ebf147ac039ad48ba54721c6ca27dec.zip
include a siginfo_t with ktrace PSIG information, so that kdump can print
fault addresses and other information. (a small bug exists: in some signal delivery cases, two PSIG records may be inserted, because postsig() is unaware a PSIG record has already been placed. but this small bug can stay since the siginfo_t information helps us find and fix other bugs)
-rw-r--r--sys/kern/kern_ktrace.c8
-rw-r--r--sys/kern/kern_sig.c25
-rw-r--r--sys/sys/ktrace.h6
-rw-r--r--usr.bin/kdump/kdump.c22
4 files changed, 43 insertions, 18 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 456fc6c9316..e9e5944f139 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_ktrace.c,v 1.25 2001/11/06 19:53:20 miod Exp $ */
+/* $OpenBSD: kern_ktrace.c,v 1.26 2002/02/22 19:19:28 deraadt Exp $ */
/* $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $ */
/*
@@ -244,14 +244,15 @@ ktrgenio(p, fd, rw, iov, len, error)
}
void
-ktrpsig(p, sig, action, mask, code)
+ktrpsig(p, sig, action, mask, code, si)
struct proc *p;
int sig;
sig_t action;
int mask, code;
+ siginfo_t *si;
{
struct ktr_header kth;
- struct ktr_psig kp;
+ struct ktr_psig kp;
p->p_traceflag |= KTRFAC_ACTIVE;
ktrinitheader(&kth, p, KTR_PSIG);
@@ -259,6 +260,7 @@ ktrpsig(p, sig, action, mask, code)
kp.action = action;
kp.mask = mask;
kp.code = code;
+ kp.si = *si;
kth.ktr_buf = (caddr_t)&kp;
kth.ktr_len = sizeof (struct ktr_psig);
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 989ba8c085f..450aa0df795 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.54 2002/01/31 02:12:18 weingart Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.55 2002/02/22 19:19:28 deraadt Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -719,15 +719,19 @@ trapsignal(p, signum, code, type, sigval)
register struct sigacts *ps = p->p_sigacts;
int mask;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_PSIG)) {
+ siginfo_t si;
+
+ initsiginfo(&si, signum, code, type, sigval);
+ ktrpsig(p, signum, ps->ps_sigact[signum],
+ p->p_sigmask, code, &si);
+ }
+#endif
mask = sigmask(signum);
if ((p->p_flag & P_TRACED) == 0 && (p->p_sigcatch & mask) != 0 &&
(p->p_sigmask & mask) == 0) {
p->p_stats->p_ru.ru_nsignals++;
-#ifdef KTRACE
- if (KTRPOINT(p, KTR_PSIG))
- ktrpsig(p, signum, ps->ps_sigact[signum],
- p->p_sigmask, code);
-#endif
(*p->p_emul->e_sendsig)(ps->ps_sigact[signum], signum,
p->p_sigmask, code, type, sigval);
p->p_sigmask |= ps->ps_catchmask[signum];
@@ -1151,9 +1155,14 @@ postsig(signum)
p->p_siglist &= ~mask;
action = ps->ps_sigact[signum];
#ifdef KTRACE
- if (KTRPOINT(p, KTR_PSIG))
+ if (KTRPOINT(p, KTR_PSIG)) {
+ siginfo_t si;
+
+ null_sigval.sival_ptr = 0;
+ initsiginfo(&si, signum, 0, SI_USER, null_sigval);
ktrpsig(p, signum, action, ps->ps_flags & SAS_OLDMASK ?
- ps->ps_oldmask : p->p_sigmask, 0);
+ ps->ps_oldmask : p->p_sigmask, code, &si);
+ }
#endif
if (action == SIG_DFL) {
/*
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index bf8d744d06c..9524c799fcf 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ktrace.h,v 1.5 2001/07/04 21:54:27 espie Exp $ */
+/* $OpenBSD: ktrace.h,v 1.6 2002/02/22 19:19:31 deraadt Exp $ */
/* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */
/*
@@ -120,6 +120,7 @@ struct ktr_psig {
sig_t action;
int mask;
int code;
+ siginfo_t si;
};
/*
@@ -137,6 +138,7 @@ struct ktr_csw {
#define KTR_EMUL 7
/* record contains emulation name */
+
/*
* kernel trace points (in p_traceflag)
*/
@@ -169,7 +171,7 @@ void ktrcsw __P((struct proc *, int, int));
void ktremul __P((struct proc *, char *));
void ktrgenio __P((struct proc *, int, enum uio_rw, struct iovec *, int, int));
void ktrnamei __P((struct proc *, char *));
-void ktrpsig __P((struct proc *, int, sig_t, int, int));
+void ktrpsig __P((struct proc *, int, sig_t, int, int, siginfo_t *));
void ktrsyscall __P((struct proc *, register_t, size_t, register_t []));
void ktrsysret __P((struct proc *, register_t, int, register_t));
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index c212e649b72..b24e26e9022 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kdump.c,v 1.13 2002/02/16 21:27:47 millert Exp $ */
+/* $OpenBSD: kdump.c,v 1.14 2002/02/22 19:19:32 deraadt Exp $ */
/*-
* Copyright (c) 1988, 1993
@@ -43,7 +43,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)kdump.c 8.4 (Berkeley) 4/28/95";
#endif
-static char *rcsid = "$OpenBSD: kdump.c,v 1.13 2002/02/16 21:27:47 millert Exp $";
+static char *rcsid = "$OpenBSD: kdump.c,v 1.14 2002/02/22 19:19:32 deraadt Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -521,10 +521,22 @@ ktrpsig(psig)
{
(void)printf("SIG%s ", sys_signame[psig->signo]);
if (psig->action == SIG_DFL)
- (void)printf("SIG_DFL\n");
+ (void)printf("SIG_DFL code %d", psig->code);
else
- (void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
- (u_long)psig->action, psig->mask, psig->code);
+ (void)printf("caught handler=0x%lx mask=0x%x",
+ (u_long)psig->action, psig->mask);
+ switch (psig->signo) {
+ case SIGSEGV:
+ case SIGILL:
+ case SIGBUS:
+ case SIGFPE:
+ printf(" addr=%p trapno=%d", psig->si.si_addr,
+ psig->si.si_trapno);
+ break;
+ default:
+ break;
+ }
+ printf("\n");
}
static void