summaryrefslogtreecommitdiffstats
path: root/lib/libkvm/kvm_proc.c
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2010-01-10 03:37:50 +0000
committerguenther <guenther@openbsd.org>2010-01-10 03:37:50 +0000
commit72596c46697f0ef984647282575f10aa7d92744a (patch)
treefcf74cb1793a725532f07ede1b0337d170afcf1e /lib/libkvm/kvm_proc.c
parentMy mistake. There was one more driver paranoid enough to check (diff)
downloadwireguard-openbsd-72596c46697f0ef984647282575f10aa7d92744a.tar.xz
wireguard-openbsd-72596c46697f0ef984647282575f10aa7d92744a.zip
Reimplement kvm_getproc2()'s support for reading crash dumps and
/dev/mem to be direct instead of going through kvm_getprocs(), as that function is going to get more an more broken as we move stuff from struct proc to struct process for rthreads. To minimize the code copying, put the common logic of filling in a kinfo_proc2 structure into a macro FILL_KPROC2() in <sys/sysctl.h> for use from both the kernel and user-space. This also hides the KERN_PROC #define behind "#if defined(_KERNEL)||defined(_LIBKVM)", as it's deprecated. Positive feedback from millert and blambert; so committing to unblock further rthreads work.
Diffstat (limited to 'lib/libkvm/kvm_proc.c')
-rw-r--r--lib/libkvm/kvm_proc.c200
1 files changed, 1 insertions, 199 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index d12202be2d4..9e35623f11a 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc.c,v 1.39 2009/10/27 23:59:28 deraadt Exp $ */
+/* $OpenBSD: kvm_proc.c,v 1.40 2010/01/10 03:37:50 guenther Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -134,8 +134,6 @@ struct miniproc {
} while (/*CONSTCOND*/0);
-#define PTRTOINT64(foo) ((u_int64_t)(u_long)(foo))
-
ssize_t kvm_uread(kvm_t *, const struct proc *, u_long, char *, size_t);
static char *_kvm_ureadm(kvm_t *, const struct miniproc *, u_long, u_long *);
@@ -402,202 +400,6 @@ kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc,
return (acnt + zcnt);
}
-struct kinfo_proc2 *
-kvm_getproc2(kvm_t *kd, int op, int arg, size_t esize, int *cnt)
-{
- int mib[6], st, nprocs;
- struct user user;
- size_t size;
-
- if ((ssize_t)esize < 0)
- return (NULL);
-
- if (kd->procbase2 != NULL) {
- free(kd->procbase2);
- /*
- * Clear this pointer in case this call fails. Otherwise,
- * kvm_close() will free it again.
- */
- kd->procbase2 = 0;
- }
-
- if (ISALIVE(kd)) {
- size = 0;
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC2;
- mib[2] = op;
- mib[3] = arg;
- mib[4] = esize;
- mib[5] = 0;
- st = sysctl(mib, 6, NULL, &size, NULL, 0);
- if (st == -1) {
- _kvm_syserr(kd, kd->program, "kvm_getproc2");
- return (NULL);
- }
-
- mib[5] = size / esize;
- kd->procbase2 = _kvm_malloc(kd, size);
- if (kd->procbase2 == 0)
- return (NULL);
- st = sysctl(mib, 6, kd->procbase2, &size, NULL, 0);
- if (st == -1) {
- _kvm_syserr(kd, kd->program, "kvm_getproc2");
- return (NULL);
- }
- nprocs = size / esize;
- } else {
- struct kinfo_proc2 kp2, *kp2p;
- struct kinfo_proc *kp;
- char *kp2c;
- int i;
-
- kp = kvm_getprocs(kd, op, arg, &nprocs);
- if (kp == NULL)
- return (NULL);
-
- kd->procbase2 = _kvm_malloc(kd, nprocs * esize);
- kp2c = (char *)kd->procbase2;
- kp2p = &kp2;
- for (i = 0; i < nprocs; i++, kp++) {
- memset(kp2p, 0, sizeof(kp2));
- kp2p->p_paddr = PTRTOINT64(kp->kp_eproc.e_paddr);
-
- kp2p->p_addr = PTRTOINT64(kp->kp_proc.p_addr);
- kp2p->p_fd = PTRTOINT64(kp->kp_proc.p_fd);
- kp2p->p_stats = PTRTOINT64(kp->kp_proc.p_stats);
- kp2p->p_limit = PTRTOINT64(kp->kp_eproc.e_limit);
- kp2p->p_vmspace = PTRTOINT64(kp->kp_proc.p_vmspace);
- kp2p->p_sigacts = PTRTOINT64(kp->kp_proc.p_sigacts);
- kp2p->p_sess = PTRTOINT64(kp->kp_eproc.e_sess);
- kp2p->p_tsess = 0;
- kp2p->p_ru = PTRTOINT64(kp->kp_proc.p_ru);
-
- kp2p->p_eflag = 0;
- kp2p->p_exitsig = kp->kp_proc.p_exitsig;
- kp2p->p_flag = kp->kp_proc.p_flag;
-
- kp2p->p_pid = kp->kp_proc.p_pid;
-
- kp2p->p_ppid = kp->kp_eproc.e_ppid;
-#if 0
- kp2p->p_sid = kp->kp_eproc.e_sid;
-#else
- kp2p->p_sid = -1; /* XXX */
-#endif
- kp2p->p__pgid = kp->kp_eproc.e_pgid;
-
- kp2p->p_tpgid = -1;
-
- kp2p->p_uid = kp->kp_eproc.e_ucred.cr_uid;
- kp2p->p_ruid = kp->kp_eproc.e_pcred.p_ruid;
- kp2p->p_gid = kp->kp_eproc.e_ucred.cr_gid;
- kp2p->p_rgid = kp->kp_eproc.e_pcred.p_rgid;
-
- memcpy(kp2p->p_groups, kp->kp_eproc.e_ucred.cr_groups,
- MIN(sizeof(kp2p->p_groups),
- sizeof(kp->kp_eproc.e_ucred.cr_groups)));
- kp2p->p_ngroups = kp->kp_eproc.e_ucred.cr_ngroups;
-
- kp2p->p_jobc = kp->kp_eproc.e_jobc;
- kp2p->p_tdev = kp->kp_eproc.e_tdev;
- kp2p->p_tpgid = kp->kp_eproc.e_tpgid;
- kp2p->p_tsess = PTRTOINT64(kp->kp_eproc.e_tsess);
-
- kp2p->p_estcpu = kp->kp_proc.p_estcpu;
- kp2p->p_rtime_sec = kp->kp_proc.p_estcpu;
- kp2p->p_rtime_usec = kp->kp_proc.p_estcpu;
- kp2p->p_cpticks = kp->kp_proc.p_cpticks;
- kp2p->p_pctcpu = kp->kp_proc.p_pctcpu;
- kp2p->p_swtime = kp->kp_proc.p_swtime;
- kp2p->p_slptime = kp->kp_proc.p_slptime;
- kp2p->p_schedflags = 0;
-
- kp2p->p_uticks = kp->kp_proc.p_uticks;
- kp2p->p_sticks = kp->kp_proc.p_sticks;
- kp2p->p_iticks = kp->kp_proc.p_iticks;
-
- kp2p->p_tracep = PTRTOINT64(kp->kp_proc.p_tracep);
- kp2p->p_traceflag = kp->kp_proc.p_traceflag;
-
- kp2p->p_holdcnt = 1;
-
- kp2p->p_siglist = kp->kp_proc.p_siglist;
- kp2p->p_sigmask = kp->kp_proc.p_sigmask;
- kp2p->p_sigignore = kp->kp_proc.p_sigignore;
- kp2p->p_sigcatch = kp->kp_proc.p_sigcatch;
-
- kp2p->p_stat = kp->kp_proc.p_stat;
- kp2p->p_priority = kp->kp_proc.p_priority;
- kp2p->p_usrpri = kp->kp_proc.p_usrpri;
- kp2p->p_nice = kp->kp_proc.p_nice;
-
- kp2p->p_xstat = kp->kp_proc.p_xstat;
- kp2p->p_acflag = kp->kp_proc.p_acflag;
-
- strncpy(kp2p->p_comm, kp->kp_proc.p_comm,
- MIN(sizeof(kp2p->p_comm), sizeof(kp->kp_proc.p_comm)));
-
- strncpy(kp2p->p_wmesg, kp->kp_eproc.e_wmesg,
- sizeof(kp2p->p_wmesg));
- kp2p->p_wchan = PTRTOINT64(kp->kp_proc.p_wchan);
-
- strncpy(kp2p->p_login, kp->kp_eproc.e_login,
- sizeof(kp2p->p_login));
-
- kp2p->p_vm_rssize = kp->kp_eproc.e_xrssize;
- kp2p->p_vm_tsize = kp->kp_eproc.e_vm.vm_tsize;
- kp2p->p_vm_dsize = kp->kp_eproc.e_vm.vm_dsize;
- kp2p->p_vm_ssize = kp->kp_eproc.e_vm.vm_ssize;
-
- kp2p->p_eflag = kp->kp_eproc.e_flag;
-
- if (P_ZOMBIE(&kp->kp_proc) || kp->kp_proc.p_addr == NULL ||
- KREAD(kd, (u_long)kp->kp_proc.p_addr, &user)) {
- kp2p->p_uvalid = 0;
- } else {
- kp2p->p_uvalid = 1;
-
- kp2p->p_ustart_sec = user.u_stats.p_start.tv_sec;
- kp2p->p_ustart_usec = user.u_stats.p_start.tv_usec;
-
- kp2p->p_uutime_sec = user.u_stats.p_ru.ru_utime.tv_sec;
- kp2p->p_uutime_usec = user.u_stats.p_ru.ru_utime.tv_usec;
- kp2p->p_ustime_sec = user.u_stats.p_ru.ru_stime.tv_sec;
- kp2p->p_ustime_usec = user.u_stats.p_ru.ru_stime.tv_usec;
-
- kp2p->p_uru_maxrss = user.u_stats.p_ru.ru_maxrss;
- kp2p->p_uru_ixrss = user.u_stats.p_ru.ru_ixrss;
- kp2p->p_uru_idrss = user.u_stats.p_ru.ru_idrss;
- kp2p->p_uru_isrss = user.u_stats.p_ru.ru_isrss;
- kp2p->p_uru_minflt = user.u_stats.p_ru.ru_minflt;
- kp2p->p_uru_majflt = user.u_stats.p_ru.ru_majflt;
- kp2p->p_uru_nswap = user.u_stats.p_ru.ru_nswap;
- kp2p->p_uru_inblock = user.u_stats.p_ru.ru_inblock;
- kp2p->p_uru_oublock = user.u_stats.p_ru.ru_oublock;
- kp2p->p_uru_msgsnd = user.u_stats.p_ru.ru_msgsnd;
- kp2p->p_uru_msgrcv = user.u_stats.p_ru.ru_msgrcv;
- kp2p->p_uru_nsignals = user.u_stats.p_ru.ru_nsignals;
- kp2p->p_uru_nvcsw = user.u_stats.p_ru.ru_nvcsw;
- kp2p->p_uru_nivcsw = user.u_stats.p_ru.ru_nivcsw;
-
- kp2p->p_uctime_sec =
- user.u_stats.p_cru.ru_utime.tv_sec +
- user.u_stats.p_cru.ru_stime.tv_sec;
- kp2p->p_uctime_usec =
- user.u_stats.p_cru.ru_utime.tv_usec +
- user.u_stats.p_cru.ru_stime.tv_usec;
- }
-
- memcpy(kp2c, &kp2, esize);
- kp2c += esize;
- }
-
- free(kd->procbase);
- }
- *cnt = nprocs;
- return (kd->procbase2);
-}
-
struct kinfo_proc *
kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt)
{