diff options
author | 2010-01-10 03:37:50 +0000 | |
---|---|---|
committer | 2010-01-10 03:37:50 +0000 | |
commit | 72596c46697f0ef984647282575f10aa7d92744a (patch) | |
tree | fcf74cb1793a725532f07ede1b0337d170afcf1e /lib/libkvm/kvm_proc.c | |
parent | My mistake. There was one more driver paranoid enough to check (diff) | |
download | wireguard-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.c | 200 |
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) { |