diff options
author | 2012-03-19 09:05:39 +0000 | |
---|---|---|
committer | 2012-03-19 09:05:39 +0000 | |
commit | 9ece112b761b1c2d5104e57320adb748e0eaebe5 (patch) | |
tree | f0ee962804583e8628dfa8b8a1196a9645223abe | |
parent | Move MSG_IDENTIFY to the last sent by the client, this will be needed by (diff) | |
download | wireguard-openbsd-9ece112b761b1c2d5104e57320adb748e0eaebe5.tar.xz wireguard-openbsd-9ece112b761b1c2d5104e57320adb748e0eaebe5.zip |
Add tracing and dumping of "pointer to struct" syscall arguments for
structs timespec, timeval, sigaction, and rlimit.
ok otto@ jsing@
-rw-r--r-- | sys/kern/kern_event.c | 7 | ||||
-rw-r--r-- | sys/kern/kern_ktrace.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_resource.c | 18 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 21 | ||||
-rw-r--r-- | sys/kern/kern_synch.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_time.c | 44 | ||||
-rw-r--r-- | sys/kern/sys_generic.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 11 | ||||
-rw-r--r-- | sys/sys/ktrace.h | 15 | ||||
-rw-r--r-- | usr.bin/kdump/kdump.c | 93 | ||||
-rw-r--r-- | usr.bin/kdump/kdump_subr.h | 3 | ||||
-rw-r--r-- | usr.bin/kdump/mksubr | 3 |
12 files changed, 215 insertions, 17 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 37753d694b9..619f4706cf8 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_event.c,v 1.43 2012/03/10 05:54:28 guenther Exp $ */ +/* $OpenBSD: kern_event.c,v 1.44 2012/03/19 09:05:39 guenther Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -41,6 +41,7 @@ #include <sys/queue.h> #include <sys/event.h> #include <sys/eventvar.h> +#include <sys/ktrace.h> #include <sys/pool.h> #include <sys/protosw.h> #include <sys/socket.h> @@ -470,6 +471,10 @@ sys_kevent(struct proc *p, void *v, register_t *retval) error = copyin(SCARG(uap, timeout), &ts, sizeof(ts)); if (error) goto done; +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrreltimespec(p, &ts); +#endif SCARG(uap, timeout) = &ts; } diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 6811cfb48a0..cc69df31a6a 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_ktrace.c,v 1.56 2011/12/14 07:32:16 guenther Exp $ */ +/* $OpenBSD: kern_ktrace.c,v 1.57 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $ */ /* @@ -316,6 +316,9 @@ ktrstruct(struct proc *p, const char *name, const void *data, size_t datalen) void *buf; size_t buflen; +#ifdef MULTIPROCESSOR + KASSERT(__mp_lock_held(&kernel_lock) > 0); +#endif atomic_setbits_int(&p->p_flag, P_INKTR); ktrinitheader(&kth, p, KTR_STRUCT); diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 15d66f5555b..ce3dfea9fdf 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_resource.c,v 1.37 2011/03/07 07:07:13 guenther Exp $ */ +/* $OpenBSD: kern_resource.c,v 1.38 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */ /*- @@ -44,6 +44,7 @@ #include <sys/resourcevar.h> #include <sys/pool.h> #include <sys/proc.h> +#include <sys/ktrace.h> #include <sys/sched.h> #include <sys/mount.h> @@ -218,6 +219,10 @@ sys_setrlimit(struct proc *p, void *v, register_t *retval) sizeof (struct rlimit)); if (error) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrrlimit(p, &alim); +#endif return (dosetrlimit(p, SCARG(uap, which), &alim)); } @@ -315,11 +320,18 @@ sys_getrlimit(struct proc *p, void *v, register_t *retval) syscallarg(int) which; syscallarg(struct rlimit *) rlp; } */ *uap = v; + struct rlimit *alimp; + int error; if (SCARG(uap, which) < 0 || SCARG(uap, which) >= RLIM_NLIMITS) return (EINVAL); - return (copyout((caddr_t)&p->p_rlimit[SCARG(uap, which)], - (caddr_t)SCARG(uap, rlp), sizeof (struct rlimit))); + alimp = &p->p_rlimit[SCARG(uap, which)]; + error = copyout(alimp, SCARG(uap, rlp), sizeof(struct rlimit)); +#ifdef KTRACE + if (error == 0 && KTRPOINT(p, KTR_STRUCT)) + ktrrlimit(p, alimp); +#endif + return (error); } /* diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index b3a92976985..5171bd7323e 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.136 2012/03/10 06:27:21 guenther Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.137 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -223,6 +223,9 @@ sys_sigaction(struct proc *p, void *v, register_t *retval) syscallarg(struct sigaction *) osa; } */ *uap = v; struct sigaction vec; +#ifdef KTRACE + struct sigaction ovec; +#endif struct sigaction *sa; const struct sigaction *nsa; struct sigaction *osa; @@ -263,13 +266,25 @@ sys_sigaction(struct proc *p, void *v, register_t *retval) error = copyout(sa, osa, sizeof (vec)); if (error) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ovec = vec; +#endif } if (nsa) { error = copyin(nsa, sa, sizeof (vec)); if (error) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrsigaction(p, sa); +#endif setsigvec(p, signum, sa); } +#ifdef KTRACE + if (osa && KTRPOINT(p, KTR_STRUCT)) + ktrsigaction(p, &ovec); +#endif return (0); } @@ -1557,6 +1572,10 @@ sys___thrsigdivert(struct proc *p, void *v, register_t *retval) struct timespec ts; if ((error = copyin(SCARG(uap, timeout), &ts, sizeof(ts))) != 0) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrreltimespec(p, &ts); +#endif to_ticks = (long long)hz * ts.tv_sec + ts.tv_nsec / (tick * 1000); if (to_ticks > INT_MAX) diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index 6b7f80ab747..031a46dfaee 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_synch.c,v 1.99 2012/01/17 02:34:18 guenther Exp $ */ +/* $OpenBSD: kern_synch.c,v 1.100 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */ /* @@ -435,6 +435,10 @@ sys___thrsleep(struct proc *p, void *v, register_t *retval) *retval = error; return (0); } +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrabstimespec(p, &ats); +#endif if (timespeccmp(&ats, &now, <)) { /* already passed: still do the unlock */ diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 3d2d36f4af9..180e76178fb 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_time.c,v 1.72 2012/03/10 05:54:28 guenther Exp $ */ +/* $OpenBSD: kern_time.c,v 1.73 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */ /* @@ -37,6 +37,7 @@ #include <sys/kernel.h> #include <sys/systm.h> #include <sys/proc.h> +#include <sys/ktrace.h> #include <sys/vnode.h> #include <sys/signalvar.h> #ifdef __HAVE_TIMECOUNTER @@ -219,7 +220,15 @@ sys_clock_gettime(struct proc *p, void *v, register_t *retval) if ((error = clock_gettime(p, SCARG(uap, clock_id), &ats)) != 0) return (error); - return copyout(&ats, SCARG(uap, tp), sizeof(ats)); + error = copyout(&ats, SCARG(uap, tp), sizeof(ats)); +#ifdef KTRACE + if (error == 0 && KTRPOINT(p, KTR_STRUCT)) { + KERNEL_LOCK(); + ktrabstimespec(p, &ats); + KERNEL_UNLOCK(); + } +#endif + return (error); } /* ARGSUSED */ @@ -275,8 +284,16 @@ sys_clock_getres(struct proc *p, void *v, register_t *retval) return (EINVAL); } - if (SCARG(uap, tp)) + if (SCARG(uap, tp)) { error = copyout(&ts, SCARG(uap, tp), sizeof (ts)); +#ifdef KTRACE + if (error == 0 && KTRPOINT(p, KTR_STRUCT)) { + KERNEL_LOCK(); + ktrreltimespec(p, &ts); + KERNEL_UNLOCK(); + } +#endif + } return error; } @@ -300,6 +317,13 @@ sys_nanosleep(struct proc *p, void *v, register_t *retval) error = copyin(SCARG(uap, rqtp), &rqt, sizeof(struct timespec)); if (error) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) { + KERNEL_LOCK(); + ktrreltimespec(p, &rqt); + KERNEL_UNLOCK(); + } +#endif TIMESPEC_TO_TIMEVAL(&tv, &rqt); if (itimerfix(&tv)) @@ -327,6 +351,13 @@ sys_nanosleep(struct proc *p, void *v, register_t *retval) error1 = copyout(&rmt, rmtp, sizeof(rmt)); if (error1 != 0) error = error1; +#ifdef KTRACE + if (error1 == 0 && KTRPOINT(p, KTR_STRUCT)) { + KERNEL_LOCK(); + ktrreltimespec(p, &rmt); + KERNEL_UNLOCK(); + } +#endif } return error; @@ -352,6 +383,13 @@ sys_gettimeofday(struct proc *p, void *v, register_t *retval) microtime(&atv); if ((error = copyout(&atv, tp, sizeof (atv)))) return (error); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) { + KERNEL_LOCK(); + ktrabstimeval(p, &atv); + KERNEL_UNLOCK(); + } +#endif } if (tzp) error = copyout(&tz, tzp, sizeof (tz)); diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 4fbc127dae0..1c20b4b93f9 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_generic.c,v 1.74 2012/02/15 04:26:27 guenther Exp $ */ +/* $OpenBSD: sys_generic.c,v 1.75 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */ /* @@ -579,6 +579,10 @@ sys_select(struct proc *p, void *v, register_t *retval) error = copyin(SCARG(uap, tv), &atv, sizeof (atv)); if (error) goto done; +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrreltimeval(p, &atv); +#endif if (itimerfix(&atv)) { error = EINVAL; goto done; diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 594916e142d..ef16e737321 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.180 2011/11/06 15:09:02 guenther Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.181 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -2287,6 +2287,15 @@ dovutimens(struct proc *p, struct vnode *vp, struct timespec ts[2], struct timespec now; int error; +#ifdef KTRACE + /* if they're both UTIME_NOW, then don't report either */ + if ((ts[0].tv_nsec != UTIME_NOW || ts[1].tv_nsec != UTIME_NOW) && + KTRPOINT(p, KTR_STRUCT)) { + ktrabstimespec(p, &ts[0]); + ktrabstimespec(p, &ts[1]); + } +#endif + VATTR_NULL(&vattr); if (ts[0].tv_nsec == UTIME_NOW || ts[1].tv_nsec == UTIME_NOW) { if (ts[0].tv_nsec == UTIME_NOW && ts[1].tv_nsec == UTIME_NOW) diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h index 40420511159..b30a93a1677 100644 --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ktrace.h,v 1.12 2011/12/14 07:32:16 guenther Exp $ */ +/* $OpenBSD: ktrace.h,v 1.13 2012/03/19 09:05:39 guenther Exp $ */ /* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */ /* @@ -190,6 +190,17 @@ void ktrstruct(struct proc *, const char *, const void *, size_t); ktrstruct((p), "sockaddr", (s), (l)) #define ktrstat(p, s) \ ktrstruct((p), "stat", (s), sizeof(struct stat)) - +#define ktrabstimespec(p, s) \ + ktrstruct((p), "abstimespec", (s), sizeof(struct timespec)) +#define ktrreltimespec(p, s) \ + ktrstruct((p), "reltimespec", (s), sizeof(struct timespec)) +#define ktrabstimeval(p, s) \ + ktrstruct((p), "abstimeval", (s), sizeof(struct timeval)) +#define ktrreltimeval(p, s) \ + ktrstruct((p), "reltimeval", (s), sizeof(struct timeval)) +#define ktrsigaction(p, s) \ + ktrstruct((p), "sigaction", (s), sizeof(struct sigaction)) +#define ktrrlimit(p, s) \ + ktrstruct((p), "rlimit", (s), sizeof(struct rlimit)) #endif /* !_KERNEL */ diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 6aacbf468b0..252eccd75eb 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kdump.c,v 1.64 2012/02/20 21:04:35 guenther Exp $ */ +/* $OpenBSD: kdump.c,v 1.65 2012/03/19 09:05:39 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -1364,6 +1364,67 @@ ktrstat(const struct stat *statp) } static void +ktrtimespec(const struct timespec *tsp, int relative) +{ + printf("struct timespec { "); + print_timespec(tsp, relative); + printf(" }\n"); +} + +static void +ktrtimeval(const struct timeval *tvp, int relative) +{ + printf("struct timeval { "); + print_time(tvp->tv_sec, relative); + if (tvp->tv_usec != 0) + printf(".%06ld", tvp->tv_usec); + printf(" }\n"); +} + +static void +ktrsigaction(const struct sigaction *sa) +{ + /* + * note: ktrstruct() has already verified that sa points to a + * buffer exactly sizeof(struct sigaction) bytes long. + */ + printf("struct sigaction { "); + if (sa->sa_handler == SIG_DFL) + printf("handler=SIG_DFL"); + else if (sa->sa_handler == SIG_IGN) + printf("handler=SIG_IGN"); + else if (sa->sa_flags & SA_SIGINFO) + printf("sigaction=%p", (void *)sa->sa_sigaction); + else + printf("handler=%p", (void *)sa->sa_handler); + printf(", mask="); + sigset(sa->sa_mask); + printf(", flags="); + sigactionflagname(sa->sa_flags); + printf(" }\n"); +} + +static void +print_rlim(rlim_t lim) +{ + if (lim == RLIM_INFINITY) + printf("infinite"); + else + printf("%llu", (unsigned long long)lim); +} + +static void +ktrrlimit(const struct rlimit *limp) +{ + printf("struct rlimit { "); + printf("cur="); + print_rlim(limp->rlim_cur); + printf(", max="); + print_rlim(limp->rlim_max); + printf(" }\n"); +} + +static void ktrstruct(char *buf, size_t buflen) { char *name, *data; @@ -1402,6 +1463,36 @@ ktrstruct(char *buf, size_t buflen) datalen < sizeof(struct sockaddr)) || datalen != ss.ss_len) goto invalid; ktrsockaddr((struct sockaddr *)&ss); + } else if (strcmp(name, "abstimespec") == 0 || + strcmp(name, "reltimespec") == 0) { + struct timespec ts; + + if (datalen != sizeof(ts)) + goto invalid; + memcpy(&ts, data, datalen); + ktrtimespec(&ts, name[0] == 'r'); + } else if (strcmp(name, "abstimeval") == 0 || + strcmp(name, "reltimeval") == 0) { + struct timeval tv; + + if (datalen != sizeof(tv)) + goto invalid; + memcpy(&tv, data, datalen); + ktrtimeval(&tv, name[0] == 'r'); + } else if (strcmp(name, "sigaction") == 0) { + struct sigaction sa; + + if (datalen != sizeof(sa)) + goto invalid; + memcpy(&sa, data, datalen); + ktrsigaction(&sa); + } else if (strcmp(name, "rlimit") == 0) { + struct rlimit lim; + + if (datalen != sizeof(lim)) + goto invalid; + memcpy(&lim, data, datalen); + ktrrlimit(&lim); } else { printf("unknown structure %s\n", name); } diff --git a/usr.bin/kdump/kdump_subr.h b/usr.bin/kdump/kdump_subr.h index 210d1c1e3a0..6772587ca58 100644 --- a/usr.bin/kdump/kdump_subr.h +++ b/usr.bin/kdump/kdump_subr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: kdump_subr.h,v 1.5 2012/02/20 21:04:35 guenther Exp $ */ +/* $OpenBSD: kdump_subr.h,v 1.6 2012/03/19 09:05:39 guenther Exp $ */ /* * Copyright(c) 2006 2006 David Kirchner <dpk@dpk.net> * @@ -62,6 +62,7 @@ void extattrctlname(int); void kldsymcmdname(int); void sendfileflagsname(int); void acltypename(int); +void sigactionflagname(int); void sigprocmaskhowname(int); void lio_listioname(int); void minheritname(int); diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr index f905b202f74..d3ece70c93c 100644 --- a/usr.bin/kdump/mksubr +++ b/usr.bin/kdump/mksubr @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: mksubr,v 1.8 2012/02/20 21:04:35 guenther Exp $ +# $OpenBSD: mksubr,v 1.9 2012/03/19 09:05:39 guenther Exp $ # # Copyright (c) 2006 David Kirchner <dpk@dpk.net> # @@ -430,6 +430,7 @@ auto_switch_type "clockname" "CLOCK_[A-Z]+[[:space:]]+[0-9]+" "sys/time.h" #auto_switch_type "kldsymcmdname" "KLDSYM_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h" #auto_switch_type "sendfileflagsname" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h" #auto_switch_type "acltypename" "ACL_TYPE_[A-Z4_]+[[:space:]]+0x[0-9]+" "sys/acl.h" +auto_orz_type "sigactionflagname" "SA_[A-Z]+[[:space:]]+0x[0-9]+" "sys/signal.h" auto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h" auto_switch_type "sigill_name" "ILL_[A-Z]+[[:space:]]+[0-9]+" "sys/siginfo.h" auto_switch_type "sigtrap_name" "TRAP_[A-Z]+[[:space:]]+[0-9]+" "sys/siginfo.h" |