Add new structures for exporting the cputime statistics via 64 bit counters
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 22 Dec 2004 11:01:49 +0000 (11:01 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 22 Dec 2004 11:01:49 +0000 (11:01 +0000)
and redo the timer frequence export.
Provide the interface glue for libkinfo and libkcore.
Additionally provide interfaces to query ccpu, the number of cpus, tk_nin
and tk_nout.
Remove those fields from devstat.h's struct statinfo.
Remove kvm dependency of rpc.rstatd by using the newly added libkinfo
functions and the sysctl interface for vmmeter.
Use the new interface in systat, the iostat part is now kvm-free.
Use kinfo_get_sched_stathz in time.
Use the kinfo interface for everything beside getting the actual process list
in top. This also removes the Last PID, which could be added back easily.
Since the feature is not that useful and breaks e.g. the jail isolation,
I haven't added a sysctl to read nextpid.
Use the kinfo interface in vmstat.
Use the kinfo interface in iostat. iostat is now kvm-free and not
setgid kmem anymore. This also means that iostat can't be applied to
coredump anymore. If this functionality is important, the kcore kinfo wrapper
can be added easily.

40 files changed:
lib/libdevstat/devstat.3
lib/libdevstat/devstat.c
lib/libdevstat/devstat.h
lib/libkcore/Makefile
lib/libkcore/kcore.c
lib/libkcore/kcore.h
lib/libkcore/kcore_file.c
lib/libkcore/kcore_private.h
lib/libkcore/kcore_sched.c [copied from lib/libkcore/kcore_vfs.c with 57% similarity]
lib/libkcore/kcore_tty.c [copied from lib/libkcore/kcore_vfs.c with 79% similarity]
lib/libkcore/kcore_vfs.c
lib/libkinfo/Makefile
lib/libkinfo/kinfo.h
lib/libkinfo/kinfo_sched.c [copied from lib/libkcore/kcore.c with 57% similarity]
lib/libkinfo/kinfo_tty.c [copied from lib/libkcore/kcore_private.h with 80% similarity]
libexec/rpc.rstatd/Makefile
libexec/rpc.rstatd/rstat_proc.c
sys/bus/pci/i386/pci_cfgreg.c
sys/dev/raid/vinum/vinumhdr.h
sys/emulation/linux/i386/linprocfs/linprocfs_misc.c
sys/i386/i386/symbols.raw
sys/kern/kern_clock.c
sys/kern/tty.c
sys/platform/pc32/i386/symbols.raw
sys/sys/dkstat.h
sys/sys/kinfo.h
sys/sys/time.h
usr.bin/systat/Makefile
usr.bin/systat/devs.c
usr.bin/systat/iostat.c
usr.bin/systat/pigs.c
usr.bin/systat/vmstat.c
usr.bin/time/Makefile
usr.bin/time/time.c
usr.bin/top/machine.c
usr.bin/vmstat/Makefile
usr.bin/vmstat/vmstat.c
usr.sbin/iostat/Makefile
usr.sbin/iostat/iostat.8
usr.sbin/iostat/iostat.c

index b00340d..fc6284a 100644 (file)
@@ -26,7 +26,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/lib/libdevstat/devstat.3,v 1.7.2.8 2001/12/17 10:08:29 ru Exp $
-.\" $DragonFly: src/lib/libdevstat/devstat.3,v 1.2 2003/06/17 04:26:49 dillon Exp $
+.\" $DragonFly: src/lib/libdevstat/devstat.3,v 1.3 2004/12/22 11:01:48 joerg Exp $
 .\"
 .Dd May 21, 1998
 .Dt DEVSTAT 3
@@ -46,7 +46,6 @@
 .Sh LIBRARY
 .Lb libdevstat
 .Sh SYNOPSIS
-.In sys/dkstat.h
 .In devstat.h
 .Ft int
 .Fn getnumdevs "void"
@@ -140,9 +139,7 @@ structure can be found in
 .Aq Pa devstat.h :
 .Bd -literal -offset indent
 struct statinfo {
-       long            cp_time[CPUSTATES];
-       long            tk_nin;
-       long            tk_nout;
+       struct kinfo_cputime    cp_time;
        struct devinfo  *dinfo;
        struct timeval  busy_time;
 };
index bf7c17c..233610b 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libdevstat/devstat.c,v 1.6 1999/08/28 00:04:26 peter Exp $
- * $DragonFly: src/lib/libdevstat/devstat.c,v 1.3 2004/10/25 19:38:45 drhodus Exp $
+ * $DragonFly: src/lib/libdevstat/devstat.c,v 1.4 2004/12/22 11:01:48 joerg Exp $
  */
 
 #include <sys/types.h>
 #include <sys/sysctl.h>
 #include <sys/errno.h>
-#include <sys/dkstat.h>
 
 #include <ctype.h>
 #include <err.h>
index e51ae09..024235b 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libdevstat/devstat.h,v 1.3 1999/08/28 00:04:27 peter Exp $
- * $DragonFly: src/lib/libdevstat/devstat.h,v 1.2 2003/06/17 04:26:49 dillon Exp $
+ * $DragonFly: src/lib/libdevstat/devstat.h,v 1.3 2004/12/22 11:01:48 joerg Exp $
  */
 
 #ifndef _DEVSTAT_H
@@ -74,9 +74,6 @@ struct devinfo {
 };
 
 struct statinfo {
-       long            cp_time[CPUSTATES];
-       long            tk_nin;
-       long            tk_nout;
        struct devinfo  *dinfo;
        struct timeval  busy_time;
 };
index 0818055..840ba90 100644 (file)
@@ -1,9 +1,10 @@
-# $DragonFly: src/lib/libkcore/Makefile,v 1.1 2004/11/24 22:51:01 joerg Exp $
+# $DragonFly: src/lib/libkcore/Makefile,v 1.2 2004/12/22 11:01:49 joerg Exp $
 
 .PATH: ${.CURDIR}/../../sys/kern
 
 LIB=   kcore
-SRCS=  kcore.c kcore_file.c kcore_proc.c kcore_vfs.c
+SRCS=  kcore.c kcore_file.c kcore_proc.c kcore_sched.c kcore_tty.c
+SRCS+= kcore_vfs.c
 SRCS+= subr_kcore.c
 INCS=  kcore.h
 NOMAN=
index 5bdd684..4207b04 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore.c,v 1.3 2004/12/20 02:40:07 dillon Exp $
+ * $DragonFly: src/lib/libkcore/kcore.c,v 1.4 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/types.h>
 #include <sys/fcntl.h>
 
+#include <err.h>
+#include <errno.h>
 #include <kcore.h>
 #include <kvm.h>
 #include <stdlib.h>
@@ -75,3 +77,24 @@ kcore_close(struct kcore_data *kc)
        free(kc);
        return(retval);
 }
+
+int
+kcore_get_generic(struct kcore_data *kc, struct nlist *nl,
+                 void *data, size_t len)
+{
+       if (kc == NULL)
+               kc = &kcore_global;
+
+       if (nl[0].n_value == 0) {
+               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
+                       errno = EOPNOTSUPP;
+                       return(-1);
+               }
+       }
+       if (kvm_read(kc->kd, nl[0].n_value, data, len) != (int)len) {
+               warnx("cannot read %s: %s", nl[0].n_name, kvm_geterr(kc->kd));
+               errno = EINVAL;
+               return(-1);
+       }
+       return(0);
+}
index ef41955..a13b583 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore.h,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore.h,v 1.2 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef _KCORE_H
 
 #ifdef KCORE_KINFO_WRAPPER
 
+#define        kinfo_get_cpus(cpus)            \
+       kcore_get_cpus(NULL, cpus)
 #define        kinfo_get_files(files, len)     \
        kcore_get_files(NULL, files, len)
 #define        kinfo_get_maxfiles(maxfiles)    \
        kcore_get_maxfiles(NULL, maxfiles)
 #define        kinfo_get_openfiles(openfiles)  \
        kcore_get_openfiles(NULL, openfiles)
+#define        kinfo_get_sched_ccpu(ccpu)      \
+       kcore_get_sched_ccpu(NULL, ccpu)
+#define        kinfo_get_sched_cputime(cputime)        \
+       kcore_get_sched_cputime(NULL, cputime)
+#define        kinfo_get_sched_hz(hz)          \
+       kcore_get_sched_hz(NULL, hz)
+#define        kinfo_get_sched_profhz(profhz)  \
+       kcore_get_sched_profhz(NULL, profhz)
+#define        kinfo_get_sched_stathz(stathz)  \
+       kcore_get_sched_stathz(NULL, stathz)
+#define        kinfo_get_tty_tk_nin(tk_nin)    \
+       kcore_get_tty_tk_nin(NULL, tk_nin)
+#define        kinfo_get_tty_tk_nout(tk_nout)  \
+       kcore_get_tty_tk_nout(NULL, tk_nout)
 #define        kinfo_get_vfs_bufspace(bufspace) \
        kcore_get_vfs_bufspace(NULL, bufspace)
 
@@ -62,11 +78,20 @@ __BEGIN_DECLS;
 struct kcore_data
        *kcore_open(const char *, const char *, char *);
 int     kcore_close(struct kcore_data *);
+
+int     kcore_get_cpus(struct kcore_data *, int *);
 int     kcore_get_files(struct kcore_data *, struct kinfo_file **, size_t *);
 int     kcore_get_maxfiles(struct kcore_data *, int *);
 int     kcore_get_openfiles(struct kcore_data *, int *);
 int     kcore_get_procs(struct kcore_data *kc, struct kinfo_proc **procs,
                        size_t *len);
+int     kcore_get_sched_ccpu(struct kcore_data *, int *);
+int     kcore_get_sched_cputime(struct kcore_data *, struct kinfo_cputime *);
+int     kcore_get_sched_hz(struct kcore_data *, int *);
+int     kcore_get_sched_profhz(struct kcore_data *, int *);
+int     kcore_get_sched_stathz(struct kcore_data *, int *);
+int     kcore_get_tty_tk_nin(struct kcore_data *, uint64_t *);
+int     kcore_get_tty_tk_nout(struct kcore_data *, uint64_t *);
 int     kcore_get_vfs_bufspace(struct kcore_data *, int *);
 __END_DECLS;
 
index 8fb0e37..17611a2 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_file.c,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore_file.c,v 1.2 2004/12/22 11:01:49 joerg Exp $
  */
 
 #define _KERNEL_STRUCTURES
@@ -128,20 +128,7 @@ kcore_get_maxfiles(struct kcore_data *kc, int *maxfiles)
                { NULL, 0, 0, 0, 0}
        };
 
-       if (kc == NULL)
-               kc = &kcore_global;
-
-       if (nl[0].n_value == 0) {
-               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
-                       errno = EOPNOTSUPP;
-                       return(-1);
-               }
-       }
-       if (kvm_read(kc->kd, nl[0].n_value, maxfiles,
-                    sizeof(*maxfiles)) != sizeof(*maxfiles)) {
-               warnx("cannot read _maxfiles: %s", kvm_geterr(kc->kd));
-       }
-       return(0);
+       return(kcore_get_generic(kc, nl, maxfiles, sizeof(*maxfiles)));
 }
 
 int
@@ -152,18 +139,5 @@ kcore_get_openfiles(struct kcore_data *kc, int *openfiles)
                { NULL, 0, 0, 0, 0}
        };
 
-       if (kc == NULL)
-               kc = &kcore_global;
-
-       if (nl[0].n_value == 0) {
-               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
-                       errno = EOPNOTSUPP;
-                       return(-1);
-               }
-       }
-       if (kvm_read(kc->kd, nl[0].n_value, openfiles,
-                    sizeof(*openfiles)) != sizeof(*openfiles)) {
-               warnx("cannot read _nfiles: %s", kvm_geterr(kc->kd));
-       }
-       return(0);
+       return(kcore_get_generic(kc, nl, openfiles, sizeof(*openfiles)));
 }
index 6d30ebe..3f4868b 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_private.h,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore_private.h,v 1.2 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef KCORE_PRIVATE_H
 #define        KCORE_PRIVATE_H
 
+#include <sys/cdefs.h>
 #include <kvm.h>
 
 struct kcore_data {
@@ -45,4 +46,8 @@ struct kcore_data {
 
 extern struct kcore_data kcore_global;
 
+__BEGIN_DECLS;
+int    kcore_get_generic(struct kcore_data *, struct nlist *, void *, size_t);
+__END_DECLS;
+
 #endif
similarity index 57%
copy from lib/libkcore/kcore_vfs.c
copy to lib/libkcore/kcore_sched.c
index bae3351..baafb9f 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_vfs.c,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore_sched.c,v 1.1 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/param.h>
 #include "kcore_private.h"
 
 int
-kcore_get_vfs_bufspace(struct kcore_data *kc, int *bufspace)
+kcore_get_cpus(struct kcore_data *kc, int *ncpus)
 {
        static struct nlist nl[] = {
-               { "_bufspace", 0, 0, 0, 0},
+               { "_ncpus", 0, 0, 0, 0},
                { NULL, 0, 0, 0, 0}
        };
 
-       if (kc == NULL)
-               kc = &kcore_global;
-
-       if (nl[0].n_value == 0) {
-               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
-                       errno = EOPNOTSUPP;
-                       return(-1);
-               }
-       }
-       if (kvm_read(kc->kd, nl[0].n_value, bufspace,
-                    sizeof(*bufspace)) != sizeof(*bufspace)) {
-               warnx("cannot read _bufspace: %s", kvm_geterr(kc->kd));
-       }
+       /* XXX always include ncpus in the kernel. */
+       if (kcore_get_generic(kc, nl, ncpus, sizeof(*ncpus)))
+               *ncpus = 1;
        return(0);
 }
+
+int
+kcore_get_sched_ccpu(struct kcore_data *kc, int *ccpu)
+{
+       static struct nlist nl[] = {
+               { "_tk_nin", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
+
+       return(kcore_get_generic(kc, nl, ccpu, sizeof(*ccpu)));
+}
+
+int
+kcore_get_sched_cputime(struct kcore_data *kc, struct kinfo_cputime *cputime)
+{
+       static struct nlist nl[] = {
+               { "_cp_time", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
+
+       return(kcore_get_generic(kc, nl, cputime, sizeof(*cputime)));
+}
+
+int
+kcore_get_sched_hz(struct kcore_data *kc, int *hz)
+{
+       static struct nlist nl[] = {
+               { "_hz", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
+
+       return(kcore_get_generic(kc, nl, hz, sizeof(*hz)));
+}
+
+int
+kcore_get_sched_profhz(struct kcore_data *kc, int *profhz)
+{
+       static struct nlist nl[] = {
+               { "_profhz", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
+
+       return(kcore_get_generic(kc, nl, profhz, sizeof(*profhz)));
+}
+
+int
+kcore_get_sched_stathz(struct kcore_data *kc, int *stathz)
+{
+       static struct nlist nl[] = {
+               { "_stathz", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
+       int retval;
+
+       retval = kcore_get_generic(kc, nl, stathz, sizeof(*stathz));;
+       if (retval == 0 && *stathz == 0)
+               return(kcore_get_sched_hz(kc, stathz));
+       return(retval);
+}
similarity index 79%
copy from lib/libkcore/kcore_vfs.c
copy to lib/libkcore/kcore_tty.c
index bae3351..cc9fae8 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_vfs.c,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore_tty.c,v 1.1 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/param.h>
 #include "kcore_private.h"
 
 int
-kcore_get_vfs_bufspace(struct kcore_data *kc, int *bufspace)
+kcore_get_tty_tk_nin(struct kcore_data *kc, uint64_t *tk_nin)
 {
        static struct nlist nl[] = {
-               { "_bufspace", 0, 0, 0, 0},
+               { "_tk_nin", 0, 0, 0, 0},
                { NULL, 0, 0, 0, 0}
        };
 
-       if (kc == NULL)
-               kc = &kcore_global;
+       return(kcore_get_generic(kc, nl, tk_nin, sizeof(*tk_nin)));
+}
+
+int
+kcore_get_tty_tk_nout(struct kcore_data *kc, uint64_t *tk_nout)
+{
+       static struct nlist nl[] = {
+               { "_tk_nout", 0, 0, 0, 0},
+               { NULL, 0, 0, 0, 0}
+       };
 
-       if (nl[0].n_value == 0) {
-               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
-                       errno = EOPNOTSUPP;
-                       return(-1);
-               }
-       }
-       if (kvm_read(kc->kd, nl[0].n_value, bufspace,
-                    sizeof(*bufspace)) != sizeof(*bufspace)) {
-               warnx("cannot read _bufspace: %s", kvm_geterr(kc->kd));
-       }
-       return(0);
+       return(kcore_get_generic(kc, nl, tk_nout, sizeof(*tk_nout)));
 }
index bae3351..b88b1ff 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_vfs.c,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkcore/kcore_vfs.c,v 1.2 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/param.h>
@@ -52,18 +52,5 @@ kcore_get_vfs_bufspace(struct kcore_data *kc, int *bufspace)
                { NULL, 0, 0, 0, 0}
        };
 
-       if (kc == NULL)
-               kc = &kcore_global;
-
-       if (nl[0].n_value == 0) {
-               if ((kvm_nlist(kc->kd, nl) < 0) || (nl[0].n_value == 0)) {
-                       errno = EOPNOTSUPP;
-                       return(-1);
-               }
-       }
-       if (kvm_read(kc->kd, nl[0].n_value, bufspace,
-                    sizeof(*bufspace)) != sizeof(*bufspace)) {
-               warnx("cannot read _bufspace: %s", kvm_geterr(kc->kd));
-       }
-       return(0);
+       return(kcore_get_generic(kc, nl, bufspace, sizeof(*bufspace)));
 }
index fd51080..b78ed8b 100644 (file)
@@ -1,7 +1,7 @@
-# $DragonFly: src/lib/libkinfo/Makefile,v 1.2 2004/11/18 14:33:01 joerg Exp $
+# $DragonFly: src/lib/libkinfo/Makefile,v 1.3 2004/12/22 11:01:49 joerg Exp $
 
 LIB=   kinfo
-SRCS=  kinfo_file.c kinfo_vfs.c
+SRCS=  kinfo_file.c kinfo_sched.c kinfo_tty.c kinfo_vfs.c
 INCS=  kinfo.h
 NOMAN=
 
index b1315e2..bbcaacd 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkinfo/kinfo.h,v 1.3 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkinfo/kinfo.h,v 1.4 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef _KINFO_H
 #include <sys/kinfo.h>
 
 __BEGIN_DECLS;
+int    kinfo_get_cpus(int *);
 int    kinfo_get_files(struct kinfo_file **, size_t *);
 int    kinfo_get_maxfiles(int *);
 int    kinfo_get_openfiles(int *);
+int    kinfo_get_sched_ccpu(int *);
+int    kinfo_get_sched_cputime(struct kinfo_cputime *);
+int    kinfo_get_sched_hz(int *);
+int    kinfo_get_sched_profhz(int *);
+int    kinfo_get_sched_stathz(int *);
+int    kinfo_get_tty_tk_nin(uint64_t *);
+int    kinfo_get_tty_tk_nout(uint64_t *);
 int    kinfo_get_vfs_bufspace(int *);
 __END_DECLS;
 
similarity index 57%
copy from lib/libkcore/kcore.c
copy to lib/libkinfo/kinfo_sched.c
index 5bdd684..649d32b 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore.c,v 1.3 2004/12/20 02:40:07 dillon Exp $
+ * $DragonFly: src/lib/libkinfo/kinfo_sched.c,v 1.1 2004/12/22 11:01:49 joerg Exp $
  */
 
-#include <sys/types.h>
-#include <sys/fcntl.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
 
-#include <kcore.h>
-#include <kvm.h>
-#include <stdlib.h>
+#include <kinfo.h>
 
-#include "kcore_private.h"
+int
+kinfo_get_cpus(int *ncpus)
+{
+       size_t len = sizeof(*ncpus);
+
+       return(sysctlbyname("hw.ncpu", ncpus, &len, NULL, 0));
+}
+
+int
+kinfo_get_sched_ccpu(int *ccpu)
+{
+       size_t len = sizeof(*ccpu);
+
+       return(sysctlbyname("kern.ccpu", ccpu, &len, NULL, 0));
+}
+
+int
+kinfo_get_sched_cputime(struct kinfo_cputime *cputime)
+{
+       size_t len = sizeof(*cputime);
+
+       return(sysctlbyname("kern.cp_time", cputime, &len, NULL, 0));
+}
 
-struct kcore_data kcore_global;
+int
+kinfo_get_sched_hz(int *hz)
+{
+       struct kinfo_clockinfo clockinfo;
+       size_t len = sizeof(clockinfo);
+       int retval;
 
-struct kcore_data *
-kcore_open(const char *execfile, const char *corefile, char *errbuf)
+       retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
+       if (retval)
+               return(retval);
+
+       *hz = clockinfo.ci_hz;
+       return(0);
+}
+
+int
+kinfo_get_sched_stathz(int *stathz)
 {
-       struct kcore_data *kc;
-
-       kc = malloc(sizeof(*kc));
-       if (kc == NULL)
-               return(NULL);
-       kc->kd = kvm_openfiles(execfile, corefile, NULL, O_RDONLY, errbuf);
-       if (kc->kd == NULL) {
-               free(kc);
-               return(NULL);
-       }
-       return(kc);
+       struct kinfo_clockinfo clockinfo;
+       size_t len = sizeof(clockinfo);
+       int retval;
+
+       retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
+       if (retval)
+               return(retval);
+
+       *stathz = clockinfo.ci_stathz;
+       return(0);
 }
 
 int
-kcore_close(struct kcore_data *kc)
+kinfo_get_sched_profhz(int *profhz)
 {
+       struct kinfo_clockinfo clockinfo;
+       size_t len = sizeof(clockinfo);
        int retval;
 
-       if (kc == NULL) {
-               retval = kvm_close(kcore_global.kd);
+       retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
+       if (retval)
                return(retval);
-       }
 
-       retval = kvm_close(kc->kd);
-       free(kc);
-       return(retval);
+       *profhz = clockinfo.ci_profhz;
+       return(0);
 }
similarity index 80%
copy from lib/libkcore/kcore_private.h
copy to lib/libkinfo/kinfo_tty.c
index 6d30ebe..3c973cd 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libkcore/kcore_private.h,v 1.1 2004/11/24 22:51:01 joerg Exp $
+ * $DragonFly: src/lib/libkinfo/kinfo_tty.c,v 1.1 2004/12/22 11:01:49 joerg Exp $
  */
 
-#ifndef KCORE_PRIVATE_H
-#define        KCORE_PRIVATE_H
+#include <sys/param.h>
+#include <sys/sysctl.h>
 
-#include <kvm.h>
+#include <kinfo.h>
 
-struct kcore_data {
-       kvm_t *kd;
-};
+int
+kinfo_get_tty_tk_nin(uint64_t *tk_nin)
+{
+       size_t len = sizeof(*tk_nin);
 
-extern struct kcore_data kcore_global;
+       return(sysctlbyname("kern.tk_nin", tk_nin, &len, NULL, 0));
+}
 
-#endif
+int
+kinfo_get_tty_tk_nout(uint64_t *tk_nout)
+{
+       size_t len = sizeof(*tk_nout);
+
+       return(sysctlbyname("kern.tk_nout", tk_nout, &len, NULL, 0));
+}
index 4874e7b..7ff9564 100644 (file)
@@ -1,11 +1,11 @@
 # $FreeBSD: src/libexec/rpc.rstatd/Makefile,v 1.5.2.1 2001/04/25 10:40:56 ru Exp $
-# $DragonFly: src/libexec/rpc.rstatd/Makefile,v 1.2 2003/06/17 04:27:07 dillon Exp $
+# $DragonFly: src/libexec/rpc.rstatd/Makefile,v 1.3 2004/12/22 11:01:49 joerg Exp $
 
 PROG = rpc.rstatd
 SRCS = rstatd.c rstat_proc.c
 MAN =  rpc.rstatd.8
 
-DPADD= ${LIBRPCSVC} ${LIBUTIL} ${LIBKVM} ${LIBDEVSTAT}
-LDADD= -lrpcsvc -lutil -lkvm -ldevstat
+DPADD= ${LIBRPCSVC} ${LIBUTIL} ${LIBDEVSTAT} ${LIBKINFO}
+LDADD= -lrpcsvc -lutil -ldevstat -lkinfo
 
 .include <bsd.prog.mk>
index 3c55782..d5c362e 100644 (file)
@@ -29,7 +29,7 @@
  * @(#)rpc.rstatd.c 1.1 86/09/25 Copyr 1984 Sun Micro
  * @(#)rstat_proc.c    2.2 88/08/01 4.0 RPCSRC
  * $FreeBSD: src/libexec/rpc.rstatd/rstat_proc.c,v 1.14.2.1 2002/07/11 17:17:56 alfred Exp $
- * $DragonFly: src/libexec/rpc.rstatd/rstat_proc.c,v 1.3 2003/11/14 03:54:31 dillon Exp $
+ * $DragonFly: src/libexec/rpc.rstatd/rstat_proc.c,v 1.4 2004/12/22 11:01:49 joerg Exp $
  */
 
 /*
@@ -39,7 +39,7 @@
  */
 
 #include <sys/types.h>
-#include <sys/dkstat.h>
+#include <sys/kinfo.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/time.h>
@@ -48,7 +48,6 @@
 
 #include <err.h>
 #include <fcntl.h>
-#include <kvm.h>
 #include <limits.h>
 #include <signal.h>
 #include <stdio.h>
 #undef if_collisions
 #include <rpcsvc/rstat.h>
 
-struct nlist nl[] = {
-#define        X_CPTIME        0
-       { "_cp_time" },
-#define        X_CNT           1
-       { "_cnt" },
-       { "" },
-};
-
 int havedisk (void);
 void updatexfers (int, int *);
 void setup (void);
@@ -95,12 +86,6 @@ union {
 
 void updatestat();
 static stat_is_init = 0;
-static kvm_t *kd;
-
-static int     cp_time_xlat[RSTAT_CPUSTATES] = { CP_USER, CP_NICE, CP_SYS,
-                                                       CP_IDLE };
-static long    bsd_cp_time[CPUSTATES];
-
 
 #ifndef FSCALE
 #define FSCALE (1 << 8)
@@ -110,7 +95,6 @@ void
 stat_init()
 {
     stat_is_init = 1;
-    setup();
     alarm(0);
     updatestat();
     (void) signal(SIGALRM, updatestat);
@@ -185,10 +169,12 @@ updatestat()
 {
        int i, hz;
        struct clockinfo clockrate;
-       struct vmmeter cnt;
+       struct vmmeter vmm;
+       size_t vmm_size = sizeof(vmm);
        struct ifmibdata ifmd;
        double avrun[3];
        struct timeval tm, btm;
+       struct kinfo_cputime cp_time;
        int mib[6];
        size_t len;
        int ifcount;
@@ -200,7 +186,6 @@ updatestat()
 #ifdef DEBUG
                 fprintf(stderr, "about to closedown\n");
 #endif
-                kvm_close(kd);
                 if (from_inetd)
                         exit(0);
                 else {
@@ -219,13 +204,14 @@ updatestat()
        }
        hz = clockrate.hz;
 
-       if (kvm_read(kd, (long)nl[X_CPTIME].n_value, (char *)bsd_cp_time, sizeof(bsd_cp_time))
-           != sizeof(bsd_cp_time)) {
+       if (kinfo_get_sched_cputime(&cp_time)) {
                syslog(LOG_ERR, "rstat: can't read cp_time from kmem");
                exit(1);
        }
-       for(i = 0; i < RSTAT_CPUSTATES ; i++)
-               stats_all.s1.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
+       stats_all.s1.cp_time[0] = cp_time.cp_user;
+       stats_all.s1.cp_time[1] = cp_time.cp_nice;
+       stats_all.s1.cp_time[2] = cp_time.cp_sys;
+       stats_all.s1.cp_time[3] = cp_time.cp_idle;
 
         (void)getloadavg(avrun, sizeof(avrun) / sizeof(avrun[0]));
 
@@ -250,20 +236,19 @@ updatestat()
            stats_all.s1.cp_time[1], stats_all.s1.cp_time[2], stats_all.s1.cp_time[3]);
 #endif
 
-       /* XXX - should use sysctl */
-       if (kvm_read(kd, (long)nl[X_CNT].n_value, (char *)&cnt, sizeof cnt) != sizeof cnt) {
-               syslog(LOG_ERR, "rstat: can't read cnt from kmem");
+       if (sysctlbyname("vm.vmmeter", &vmm, &vmm_size, NULL, 0)) {
+               syslog(LOG_ERR, "sysctlbyname: vm.vmmeter");
                exit(1);
        }
-       stats_all.s1.v_pgpgin = cnt.v_vnodepgsin;
-       stats_all.s1.v_pgpgout = cnt.v_vnodepgsout;
-       stats_all.s1.v_pswpin = cnt.v_swappgsin;
-       stats_all.s1.v_pswpout = cnt.v_swappgsout;
-       stats_all.s1.v_intr = cnt.v_intr;
+       stats_all.s1.v_pgpgin = vmm.v_vnodepgsin;
+       stats_all.s1.v_pgpgout = vmm.v_vnodepgsout;
+       stats_all.s1.v_pswpin = vmm.v_swappgsin;
+       stats_all.s1.v_pswpout = vmm.v_swappgsout;
+       stats_all.s1.v_intr = vmm.v_intr;
        gettimeofday(&tm, (struct timezone *) 0);
        stats_all.s1.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
            hz*(tm.tv_usec - btm.tv_usec)/1000000;
-       stats_all.s2.v_swtch = cnt.v_swtch;
+       stats_all.s2.v_swtch = vmm.v_swtch;
 
        /* update disk transfers */
        updatexfers(RSTAT_DK_NDRIVE, stats_all.s1.dk_xfer);
@@ -306,24 +291,6 @@ updatestat()
        alarm(1);
 }
 
-void
-setup()
-{
-       char errbuf[_POSIX2_LINE_MAX];
-
-       int en;
-
-       if ((kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL) {
-               syslog(LOG_ERR, "rpc.rstatd, %s", errbuf);
-               exit(1);
-       }
-
-       if ((en = kvm_nlist(kd, nl)) != 0) {
-               syslog(LOG_ERR, "rstatd: Can't get namelist. %d", en);
-               exit (1);
-        }
-}
-
 /*
  * returns true if have a disk
  */
index 0d1680d..cd196c8 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/pci_cfgreg.c,v 1.1.2.7 2001/11/28 05:47:03 imp Exp $
- * $DragonFly: src/sys/bus/pci/i386/pci_cfgreg.c,v 1.7 2004/02/08 07:10:46 hmp Exp $
+ * $DragonFly: src/sys/bus/pci/i386/pci_cfgreg.c,v 1.8 2004/12/22 11:01:49 joerg Exp $
  *
  */
 
@@ -273,7 +273,35 @@ pci_cfgintr(int bus, int device, int pin, int oldirq)
 
        int already = 0;
        int errok = 0;
-    
+
+    if(pin==1 && device==9)
+       already = 10;
+    if(pin==1 && device==10)
+       already = 6;
+
+    if(already)
+    {
+       u_long intr;
+       u_char irq = already;
+       
+#define PCI_INTERRUPT_REG 0x3c
+#define        PCI_INTERRUPT_LINE_SHIFT                0
+#define        PCI_INTERRUPT_LINE_MASK                 0xff
+#define        PCI_INTERRUPT_LINE(icr) \
+           (((icr) >> PCI_INTERRUPT_LINE_SHIFT) & PCI_INTERRUPT_LINE_MASK)
+
+       intr = pci_cfgregread(bus, device, 0 , PCI_INTERRUPT_REG, 4);
+       if (irq != PCI_INTERRUPT_LINE(intr)) {
+               intr &= ~(PCI_INTERRUPT_LINE_MASK << PCI_INTERRUPT_LINE_SHIFT);
+               intr |= (irq << PCI_INTERRUPT_LINE_SHIFT);
+               pci_cfgregwrite(bus, device,0 , PCI_INTERRUPT_REG, intr, 4);
+       }
+
+       return irq;
+    }
+
+    already = 0;
+
        v = pcibios_get_version();
        if (v < 0x0210) {
                PRVERB((
index 694c40a..7a3fa76 100644 (file)
@@ -38,7 +38,7 @@
 /*
  * $Id: vinumhdr.h,v 1.18 2001/01/04 00:14:14 grog Exp grog $
  * $FreeBSD: src/sys/dev/vinum/vinumhdr.h,v 1.16.2.1 2001/03/13 02:59:43 grog Exp $
- * $DragonFly: src/sys/dev/raid/vinum/vinumhdr.h,v 1.7 2003/11/21 22:46:13 dillon Exp $
+ * $DragonFly: src/sys/dev/raid/vinum/vinumhdr.h,v 1.8 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/param.h>
@@ -50,9 +50,9 @@
 #include <sys/conf.h>
 #include <sys/mount.h>
 #include <sys/vnode.h>
+#include <sys/dkstat.h>
 #endif
 #include <sys/errno.h>
-#include <sys/dkstat.h>
 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
 #include <sys/buf.h>
 #include <sys/malloc.h>
index 4926d03..387e73e 100644 (file)
@@ -39,7 +39,7 @@
  *     @(#)procfs_status.c     8.4 (Berkeley) 6/15/94
  *
  * $FreeBSD: src/sys/i386/linux/linprocfs/linprocfs_misc.c,v 1.3.2.8 2001/06/25 19:46:47 pirzyk Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linprocfs/linprocfs_misc.c,v 1.8 2004/08/13 02:50:58 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linprocfs/linprocfs_misc.c,v 1.9 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/param.h>
@@ -279,10 +279,10 @@ linprocfs_dostat(curp, p, pfs, uio)
                      "intr %u\n"
                      "ctxt %u\n"
                      "btime %ld\n",
-                     T2J(cp_time[CP_USER]),
-                     T2J(cp_time[CP_NICE]),
-                     T2J(cp_time[CP_SYS] /*+ cp_time[CP_INTR]*/),
-                     T2J(cp_time[CP_IDLE]),
+                     T2J(cp_time.cp_user),
+                     T2J(cp_time.cp_nice),
+                     T2J(cp_time.cp_sys /*+ cp_time[CP_INTR]*/),
+                     T2J(cp_time.cp_idle),
                      cpucnt(offsetof(struct vmmeter, v_vnodepgsin)),
                      cpucnt(offsetof(struct vmmeter, v_vnodepgsout)),
                      cpucnt(offsetof(struct vmmeter, v_swappgsin)),
@@ -308,7 +308,7 @@ linprocfs_douptime(curp, p, pfs, uio)
        ps = psbuf;
        ps += sprintf(ps, "%ld.%02ld %ld.%02ld\n",
                      tv.tv_sec, tv.tv_usec / 10000,
-                     T2S(cp_time[CP_IDLE]), T2J(cp_time[CP_IDLE]) % 100);
+                     T2S(cp_time.cp_idle), T2J(cp_time.cp_idle) % 100);
        return (uiomove_frombuf(psbuf, ps - psbuf, uio));
 }
 
index 9a9ce31..b91713c 100644 (file)
@@ -1,7 +1,7 @@
 #      @(#)symbols.raw 7.6 (Berkeley) 5/8/91
 #
 # $FreeBSD: src/sys/i386/i386/symbols.raw,v 1.15 1999/08/28 00:43:51 peter Exp $
-# $DragonFly: src/sys/i386/i386/Attic/symbols.raw,v 1.2 2003/06/17 04:28:35 dillon Exp $
+# $DragonFly: src/sys/i386/i386/Attic/symbols.raw,v 1.3 2004/12/22 11:01:49 joerg Exp $
 #
 
 
@@ -17,7 +17,7 @@
 #iostat
        _tk_nin
        _tk_nout
-       _cp_time
+#      _cp_time
 #      _io_info
 #ps
        _nswap
@@ -32,7 +32,7 @@
        _swapblist
 #      _swaplist
 #vmstat
-       _cp_time
+#      _cp_time
 #      _rate
 #      _total
 #      _sum
index d11e192..e8a007a 100644 (file)
@@ -70,7 +70,7 @@
  *
  *     @(#)kern_clock.c        8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_clock.c,v 1.105.2.10 2002/10/17 13:19:40 maxim Exp $
- * $DragonFly: src/sys/kern/kern_clock.c,v 1.28 2004/12/04 20:38:45 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_clock.c,v 1.29 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include "opt_ntp.h"
@@ -80,6 +80,7 @@
 #include <sys/dkstat.h>
 #include <sys/callout.h>
 #include <sys/kernel.h>
+#include <sys/kinfo.h>
 #include <sys/proc.h>
 #include <sys/malloc.h>
 #include <sys/resourcevar.h>
@@ -111,19 +112,14 @@ SYSINIT(clocks, SI_SUB_CLOCKS, SI_ORDER_FIRST, initclocks, NULL)
 
 /*
  * Some of these don't belong here, but it's easiest to concentrate them.
- * Note that cp_time[] counts in microseconds, but most userland programs
+ * Note that cp_time counts in microseconds, but most userland programs
  * just compare relative times against the total by delta.
  */
-long cp_time[CPUSTATES];
+struct cp_time cp_time;
 
 SYSCTL_OPAQUE(_kern, OID_AUTO, cp_time, CTLFLAG_RD, &cp_time, sizeof(cp_time),
     "LU", "CPU time statistics");
 
-long tk_cancc;
-long tk_nin;
-long tk_nout;
-long tk_rawcc;
-
 /*
  * boottime is used to calculate the 'real' uptime.  Do not confuse this with
  * microuptime().  microtime() is not drift compensated.  The real uptime
@@ -442,9 +438,9 @@ statclock(systimer_t info, struct intrframe *frame)
                 * Charge the time as appropriate
                 */
                if (p && p->p_nice > NZERO)
-                       cp_time[CP_NICE] += bump;
+                       cp_time.cp_nice += bump;
                else
-                       cp_time[CP_USER] += bump;
+                       cp_time.cp_user += bump;
        } else {
 #ifdef GPROF
                /*
@@ -480,12 +476,12 @@ statclock(systimer_t info, struct intrframe *frame)
                        td->td_sticks += bump;
 
                if (frame && CLKF_INTR(frame)) {
-                       cp_time[CP_INTR] += bump;
+                       cp_time.cp_intr += bump;
                } else {
                        if (td == &mycpu->gd_idlethread)
-                               cp_time[CP_IDLE] += bump;
+                               cp_time.cp_idle += bump;
                        else
-                               cp_time[CP_SYS] += bump;
+                               cp_time.cp_sys += bump;
                }
        }
 }
@@ -642,15 +638,15 @@ stopprofclock(struct proc *p)
 static int
 sysctl_kern_clockrate(SYSCTL_HANDLER_ARGS)
 {
-       struct clockinfo clkinfo;
+       struct kinfo_clockinfo clkinfo;
        /*
         * Construct clockinfo structure.
         */
-       clkinfo.hz = hz;
-       clkinfo.tick = tick;
-       clkinfo.tickadj = tickadj;
-       clkinfo.profhz = profhz;
-       clkinfo.stathz = stathz ? stathz : hz;
+       clkinfo.ci_hz = hz;
+       clkinfo.ci_tick = tick;
+       clkinfo.ci_tickadj = tickadj;
+       clkinfo.ci_profhz = profhz;
+       clkinfo.ci_stathz = stathz ? stathz : hz;
        return (sysctl_handle_opaque(oidp, &clkinfo, sizeof clkinfo, req));
 }
 
index 2bd19d8..3dc9cd3 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)tty.c       8.8 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $
- * $DragonFly: src/sys/kern/tty.c,v 1.14 2004/10/12 19:20:46 dillon Exp $
+ * $DragonFly: src/sys/kern/tty.c,v 1.15 2004/12/22 11:01:49 joerg Exp $
  */
 
 /*-
@@ -198,6 +198,14 @@ static u_char const char_type[] = {
 #undef MAX_INPUT               /* XXX wrong in <sys/syslimits.h> */
 #define        MAX_INPUT       TTYHOG  /* XXX limit is usually larger for !ICANON */
 
+uint64_t tk_nin;
+SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nin, CTLFLAG_RD, &tk_nin, sizeof(tk_nin),
+    "LU", "TTY input statistic");
+uint64_t tk_nout;
+SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nout, CTLFLAG_RD, &tk_nout, sizeof(tk_nout),
+    "LU", "TTY output statistic");
+uint64_t tk_rawcc;
+
 /*
  * list of struct tty where pstat(8) can pick it up with sysctl
  */
@@ -346,13 +354,10 @@ ttyinput(c, tp)
        /*
         * Gather stats.
         */
-       if (ISSET(lflag, ICANON)) {
-               ++tk_cancc;
+       if (ISSET(lflag, ICANON))
                ++tp->t_cancc;
-       } else {
-               ++tk_rawcc;
+       else
                ++tp->t_rawcc;
-       }
        ++tk_nin;
 
        /*
index 4958c2d..2a7b709 100644 (file)
@@ -1,7 +1,7 @@
 #      @(#)symbols.raw 7.6 (Berkeley) 5/8/91
 #
 # $FreeBSD: src/sys/i386/i386/symbols.raw,v 1.15 1999/08/28 00:43:51 peter Exp $
-# $DragonFly: src/sys/platform/pc32/i386/symbols.raw,v 1.2 2003/06/17 04:28:35 dillon Exp $
+# $DragonFly: src/sys/platform/pc32/i386/symbols.raw,v 1.3 2004/12/22 11:01:49 joerg Exp $
 #
 
 
@@ -17,7 +17,7 @@
 #iostat
        _tk_nin
        _tk_nout
-       _cp_time
+#      _cp_time
 #      _io_info
 #ps
        _nswap
@@ -32,7 +32,7 @@
        _swapblist
 #      _swaplist
 #vmstat
-       _cp_time
+#      _cp_time
 #      _rate
 #      _total
 #      _sum
index a91a7e0..831a818 100644 (file)
  *
  *     @(#)dkstat.h    8.2 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/sys/dkstat.h,v 1.12.2.1 2000/09/22 08:01:00 des Exp $
- * $DragonFly: src/sys/sys/dkstat.h,v 1.2 2003/06/17 04:28:58 dillon Exp $
+ * $DragonFly: src/sys/sys/dkstat.h,v 1.3 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef _SYS_DKSTAT_H_
 #define _SYS_DKSTAT_H_ 1
 
-#define        CP_USER         0
-#define        CP_NICE         1
-#define        CP_SYS          2
-#define        CP_INTR         3
-#define        CP_IDLE         4
-#define        CPUSTATES       5
+#if !defined(_KERNEL) && !defined(_KERNEL_STRUCTURES)
+#error "This file should not be included by userland programs."
+#endif
 
-#ifdef _KERNEL
+/*
+ * This definition is identical to kinfo_cputime.
+ * If this is changed, the sysctl export in kern_clock.c and kcore
+ * must be changed, too.
+ */
+extern struct cp_time {
+       uint64_t        cp_user;
+       uint64_t        cp_nice;
+       uint64_t        cp_sys;
+       uint64_t        cp_intr;
+       uint64_t        cp_idle;
+} cp_time;
 
-extern long cp_time[CPUSTATES];
-extern long tk_cancc;
-extern long tk_nin;
-extern long tk_nout;
-extern long tk_rawcc;
-#endif
+extern uint64_t tk_nin;
+extern uint64_t tk_nout;
+extern uint64_t tk_rawcc;
 
 #endif /* _SYS_DKSTAT_H_ */
index b7d4a71..e351953 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/kinfo.h,v 1.1 2004/11/18 13:56:56 joerg Exp $
+ * $DragonFly: src/sys/sys/kinfo.h,v 1.2 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef _SYS_KINFO_H
@@ -51,4 +51,20 @@ struct kinfo_file {
        u_int    f_flag;        /* flags (see fcntl.h) */
 };
 
+struct kinfo_cputime {
+       uint64_t        cp_user;
+       uint64_t        cp_nice;
+       uint64_t        cp_sys;
+       uint64_t        cp_intr;
+       uint64_t        cp_idle;
+};
+
+struct kinfo_clockinfo {
+       int     ci_hz;          /* clock frequency */
+       int     ci_tick;        /* micro-seconds per hz tick */
+       int     ci_tickadj;     /* clock skew rate for adjtime() */
+       int     ci_stathz;      /* statistics clock frequency */
+       int     ci_profhz;      /* profiling clock frequency */
+};
+
 #endif
index 7264aca..4927ff7 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)time.h      8.5 (Berkeley) 5/4/95
  * $FreeBSD: src/sys/sys/time.h,v 1.42 1999/12/29 04:24:48 peter Exp $
- * $DragonFly: src/sys/sys/time.h,v 1.10 2004/11/20 20:25:13 dillon Exp $
+ * $DragonFly: src/sys/sys/time.h,v 1.11 2004/12/22 11:01:49 joerg Exp $
  */
 
 #ifndef _SYS_TIME_H_
@@ -166,6 +166,8 @@ struct      itimerval {
 
 /*
  * Getkerninfo clock information structure
+ *
+ * XXX Should be removed, use kinfo_clockinfo insteada.
  */
 struct clockinfo {
        int     hz;             /* clock frequency */
index 5a7ebef..7b0420b 100644 (file)
@@ -1,13 +1,13 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
-#      $DragonFly: src/usr.bin/systat/Makefile,v 1.2 2003/11/08 09:30:32 asmodai Exp $
+#      $DragonFly: src/usr.bin/systat/Makefile,v 1.3 2004/12/22 11:01:49 joerg Exp $
 
 PROG=  systat
 CFLAGS+=-I${.CURDIR}/../../sys
 SRCS=  cmds.c cmdtab.c convtbl.c devs.c fetch.c ifcmds.c ifstat.c iostat.c \
        keyboard.c main.c mbufs.c netcmds.c netstat.c pigs.c swap.c icmp.c \
        mode.c ip.c tcp.c vmstat.c
-DPADD= ${LIBCURSES} ${LIBTERMCAP} ${LIBM} ${LIBKVM} ${LIBDEVSTAT}
-LDADD= -lcurses -ltermcap -lm -lkvm -ldevstat
+DPADD= ${LIBCURSES} ${LIBTERMCAP} ${LIBM} ${LIBKVM} ${LIBDEVSTAT} ${LIBKINFO}
+LDADD= -lcurses -ltermcap -lm -lkvm -ldevstat -lkinfo
 BINGRP=        kmem
 BINMODE=2555
 
index e1710bc..a5194ec 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/systat/devs.c,v 1.4 1999/08/28 01:05:59 peter Exp $
- * $DragonFly: src/usr.bin/systat/devs.c,v 1.5 2004/09/03 20:38:01 dillon Exp $
+ * $DragonFly: src/usr.bin/systat/devs.c,v 1.6 2004/12/22 11:01:49 joerg Exp $
  */
 /*
  * Some code and ideas taken from the old disks.c.
@@ -67,7 +67,6 @@
 
 #include <sys/types.h>
 #include <sys/devicestat.h>
-#include <sys/dkstat.h>
 
 #include <string.h>
 #include <devstat.h>
index 0f6b8f8..c34986c 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/systat/iostat.c,v 1.9.2.1 2000/07/02 10:03:17 ps Exp $
- * $DragonFly: src/usr.bin/systat/iostat.c,v 1.3 2003/10/04 20:36:51 hmp Exp $
+ * $DragonFly: src/usr.bin/systat/iostat.c,v 1.4 2004/12/22 11:01:49 joerg Exp $
  *
  * @(#)iostat.c        8.1 (Berkeley) 6/6/93
  */
  */
 
 #include <sys/param.h>
-#include <sys/dkstat.h>
 
-#include <string.h>
-#include <stdlib.h>
-#include <nlist.h>
-#include <paths.h>
-#include <devstat.h>
 #include <err.h>
+#include <devstat.h>
+#include <kinfo.h>
+#include <paths.h>
+#include <stdlib.h>
+#include <string.h>
 #include "systat.h"
 #include "extern.h"
 #include "devs.h"
 
-static struct nlist namelist[] = {
-#define X_CP_TIME      0
-       { "_cp_time" },
-#ifdef vax
-#define X_MBDINIT      (X_CP_TIME+1)
-       { "_mbdinit" },
-#define X_UBDINIT      (X_CP_TIME+2)
-       { "_ubdinit" },
-#endif
-#ifdef tahoe
-#define        X_VBDINIT       (X_CP_TIME+1)
-       { "_vbdinit" },
-#endif
-       { "" },
-};
-
 struct statinfo cur, last;
+static struct kinfo_cputime cp_time, old_cp_time;
+static double etime;
 
 static  int linesperregion;
-static  double etime;
 static  int numbers = 0;               /* default display bar graphs */
 static  int kbpt = 0;                  /* default ms/seek shown */
 
@@ -103,7 +87,7 @@ static int barlabels(int);
 static void histogram(long double, int, double);
 static int numlabels(int);
 static int devstats(int, int, int);
-static void stat1(int, int);
+static void stat1(int, uint64_t);
 
 WINDOW *
 openiostat(void)
@@ -139,11 +123,6 @@ initiostat(void)
        if (dsinit(100, &cur, &last, NULL) != 1)
                return(0);
 
-       if (kvm_nlist(kd, namelist)) {
-                       nlisterr(namelist);
-               return(0);
-       }
-
        return(1);
 }
 
@@ -152,7 +131,8 @@ fetchiostat(void)
 {
        struct devinfo *tmp_dinfo;
 
-       NREAD(X_CP_TIME, cur.cp_time, sizeof(cur.cp_time));
+       if (kinfo_get_sched_cputime(&cp_time))
+               err(1, "kinfo_get_sched_cputime");
        tmp_dinfo = last.dinfo;
        last.dinfo = cur.dinfo;
        cur.dinfo = tmp_dinfo;
@@ -274,19 +254,21 @@ showiostat(void)
 {
        register long t;
        register int i, row, col;
+       struct kinfo_cputime diff_cp_time;
+
+       diff_cp_time.cp_user = cp_time.cp_user - old_cp_time.cp_user;
+       diff_cp_time.cp_nice = cp_time.cp_nice - old_cp_time.cp_nice;
+       diff_cp_time.cp_sys = cp_time.cp_sys - old_cp_time.cp_sys;
+       diff_cp_time.cp_intr = cp_time.cp_intr - old_cp_time.cp_intr;
+       diff_cp_time.cp_idle = cp_time.cp_idle - old_cp_time.cp_idle;
+       old_cp_time = cp_time;
 
-#define X(fld) t = cur.fld[i]; cur.fld[i] -= last.fld[i]; last.fld[i] = t
-       etime = 0;
-       for(i = 0; i < CPUSTATES; i++) {
-               X(cp_time);
-               etime += cur.cp_time[i];
-       }
-       if (etime == 0.0)
-               etime = 1.0;
-       etime /= hertz;
        row = 1;
-       for (i = 0; i < CPUSTATES; i++)
-               stat1(row++, i);
+       stat1(row++, diff_cp_time.cp_user);
+       stat1(row++, diff_cp_time.cp_nice);
+       stat1(row++, diff_cp_time.cp_sys);
+       stat1(row++, diff_cp_time.cp_intr);
+       stat1(row++, diff_cp_time.cp_idle);
        if (!numbers) {
                row += 2;
                for (i = 0; i < num_devices; i++)
@@ -356,19 +338,14 @@ devstats(int row, int col, int dn)
 }
 
 static void
-stat1(int row, int o)
+stat1(int row, uint64_t difference)
 {
        register int i;
        double time;
 
-       time = 0;
-       for (i = 0; i < CPUSTATES; i++)
-               time += cur.cp_time[i];
-       if (time == 0.0)
-               time = 1.0;
        wmove(wnd, row, INSET);
 #define CPUSCALE       0.5
-       histogram(100.0 * cur.cp_time[o] / time, 50, CPUSCALE);
+       histogram(100.0 * difference / etime, 50, CPUSCALE);
 }
 
 static void
index 4ccc74a..6070289 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)pigs.c  8.2 (Berkeley) 9/23/93
  *
- * $DragonFly: src/usr.bin/systat/pigs.c,v 1.8 2003/11/21 22:46:14 dillon Exp $
+ * $DragonFly: src/usr.bin/systat/pigs.c,v 1.9 2004/12/22 11:01:49 joerg Exp $
  */
 
 /*
 
 #define _KERNEL_STRUCTURES
 #include <sys/param.h>
-#include <sys/dkstat.h>
 #include <sys/time.h>
 #include <sys/user.h>
 #include <sys/sysctl.h>
 
 #include <curses.h>
+#include <kinfo.h>
 #include <math.h>
 #include <nlist.h>
 #include <pwd.h>
@@ -63,7 +63,7 @@ static struct p_times {
        struct kinfo_proc *pt_kp;
 } *pt;
 
-static long stime[CPUSTATES];
+struct kinfo_cputime old_cp_time;
 static long    fscale;
 static double  lccpu;
 
@@ -142,11 +142,7 @@ showpigs(void)
 
 static struct nlist namelist[] = {
 #define X_FIRST                0
-#define X_CPTIME       0
-       { "_cp_time" },
-#define X_CCPU          1
-       { "_ccpu" },
-#define X_FSCALE        2
+#define X_FSCALE        0
        { "_fscale" },
 
        { "" }
@@ -155,7 +151,7 @@ static struct nlist namelist[] = {
 int
 initpigs(void)
 {
-       fixpt_t ccpu;
+       int ccpu;
 
        if (namelist[X_FIRST].n_type == 0) {
                if (kvm_nlist(kd, namelist)) {
@@ -167,8 +163,11 @@ initpigs(void)
                        return(0);
                }
        }
-       KREAD(NPTR(X_CPTIME), stime, sizeof (stime));
-       NREAD(X_CCPU, &ccpu, sizeof(ccpu));
+       if (kinfo_get_sched_cputime(&old_cp_time))
+               err(1, "kinfo_get_sched_cputime");
+       if (kinfo_get_sched_ccpu(&ccpu))
+               err(1, "kinfo_get_sched_ccpu");
+           
        NREAD(X_FSCALE,  &fscale, LONG);
        lccpu = log((double) ccpu / fscale);
 
@@ -183,7 +182,7 @@ fetchpigs(void)
        struct proc *pp;
        float *pctp;
        struct kinfo_proc *kpp;
-       long ctime[CPUSTATES];
+       struct kinfo_cputime cp_time, diff_cp_time;
        double t;
        static int lastnproc = 0;
 
@@ -221,16 +220,21 @@ fetchpigs(void)
        /*
         * and for the imaginary "idle" process
         */
-       KREAD(NPTR(X_CPTIME), ctime, sizeof (ctime));
-       t = 0;
-       for (i = 0; i < CPUSTATES; i++)
-               t += ctime[i] - stime[i];
+       if (kinfo_get_sched_cputime(&cp_time))
+               err(1, "kinfo_get_sched_cputime");
+       diff_cp_time.cp_user = cp_time.cp_user - old_cp_time.cp_user;
+       diff_cp_time.cp_nice = cp_time.cp_nice - old_cp_time.cp_nice;
+       diff_cp_time.cp_sys = cp_time.cp_sys - old_cp_time.cp_sys;
+       diff_cp_time.cp_intr = cp_time.cp_intr - old_cp_time.cp_intr;
+       diff_cp_time.cp_idle = cp_time.cp_idle - old_cp_time.cp_idle;
+       old_cp_time = cp_time;
+       t = diff_cp_time.cp_user + diff_cp_time.cp_nice +
+           diff_cp_time.cp_sys + diff_cp_time.cp_intr +
+           diff_cp_time.cp_idle;
        if (t == 0.0)
                t = 1.0;
        pt[nproc].pt_kp = NULL;
-       pt[nproc].pt_pctcpu = (ctime[CP_IDLE] - stime[CP_IDLE]) / t;
-       for (i = 0; i < CPUSTATES; i++)
-               stime[i] = ctime[i];
+       pt[nproc].pt_pctcpu = diff_cp_time.cp_idle / t;
 }
 
 void
index 078d509..d0abe4b 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)vmstat.c        8.2 (Berkeley) 1/12/94
  * $FreeBSD: src/usr.bin/systat/vmstat.c,v 1.38.2.4 2002/03/12 19:50:23 phantom Exp $
- * $DragonFly: src/usr.bin/systat/vmstat.c,v 1.7 2004/04/02 05:46:03 hmp Exp $
+ * $DragonFly: src/usr.bin/systat/vmstat.c,v 1.8 2004/12/22 11:01:49 joerg Exp $
  */
 
 /*
@@ -47,7 +47,6 @@
 #include <sys/uio.h>
 #include <sys/namei.h>
 #include <sys/sysctl.h>
-#include <sys/dkstat.h>
 #include <sys/vmmeter.h>
 
 #include <vm/vm_param.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <kinfo.h>
 #include <langinfo.h>
 #include <nlist.h>
 #include <paths.h>
 #include <signal.h>
+#include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
@@ -70,7 +71,7 @@
 #include "devs.h"
 
 static struct Info {
-       long    time[CPUSTATES];
+       struct kinfo_cputime cp_time;
        struct  vmmeter Vmm;
        struct  vmtotal Total;
        struct  vmstats Vms;
@@ -84,6 +85,7 @@ static struct Info {
        long    numdirtybuffers;
 } s, s1, s2, z;
 
+struct kinfo_cputime cp_time, old_cp_time;
 struct statinfo cur, last, run;
 
 #define        vmm s.Vmm
@@ -98,7 +100,6 @@ static       enum state { BOOT, TIME, RUN } state = TIME;
 
 static void allocinfo(struct Info *);
 static void copyinfo(struct Info *, struct Info *);
-static float cputime(int);
 static void dinfo(int, int, struct statinfo *, struct statinfo *);
 static void getinfo(struct Info *, enum state);
 static void putint(int, int, int, int);
@@ -143,27 +144,25 @@ closekre(WINDOW *w)
 
 
 static struct nlist namelist[] = {
-#define X_CPTIME       0
-       { "_cp_time" },
-#define        X_BUFFERSPACE   1
+#define        X_BUFFERSPACE   0
        { "_bufspace" },
-#define        X_NCHSTATS      2
+#define        X_NCHSTATS      1
        { "_nchstats" },
-#define        X_INTRNAMES     3
+#define        X_INTRNAMES     2
        { "_intrnames" },
-#define        X_EINTRNAMES    4
+#define        X_EINTRNAMES    3
        { "_eintrnames" },
-#define        X_INTRCNT       5
+#define        X_INTRCNT       4
        { "_intrcnt" },
-#define        X_EINTRCNT      6
+#define        X_EINTRCNT      5
        { "_eintrcnt" },
-#define        X_DESIREDVNODES 7
+#define        X_DESIREDVNODES 6
        { "_desiredvnodes" },
-#define        X_NUMVNODES     8
+#define        X_NUMVNODES     7
        { "_numvnodes" },
-#define        X_FREEVNODES    9
+#define        X_FREEVNODES    8
        { "_freevnodes" },
-#define X_NUMDIRTYBUFFERS 10
+#define X_NUMDIRTYBUFFERS 9
        { "_numdirtybuffers" },
        { "" },
 };
@@ -375,8 +374,19 @@ labelkre(void)
        }
 }
 
+#define CP_UPDATE(fld) do {    \
+       uint64_t t;             \
+       t=s.fld;                \
+       s.fld-=s1.fld;          \
+       if(state==TIME)         \
+               s1.fld=t;       \
+       t=fld;                  \
+       fld-=old_##fld;         \
+       if(state==TIME)         \
+               old_##fld=t;    \
+       etime += s.fld;         \
+} while(0)
 #define X(fld) {t=s.fld[i]; s.fld[i]-=s1.fld[i]; if(state==TIME) s1.fld[i]=t;}
-#define Q(fld) {t=cur.fld[i]; cur.fld[i]-=last.fld[i]; if(state==TIME) last.fld[i]=t;}
 #define Y(fld) {t = s.fld; s.fld -= s1.fld; if(state == TIME) s1.fld = t;}
 #define Z(fld) {t = s.nchstats.fld; s.nchstats.fld -= s1.nchstats.fld; \
        if(state == TIME) s1.nchstats.fld = t;}
@@ -385,9 +395,16 @@ labelkre(void)
        putint((int)((float)s.fld/etime + 0.5), l, c, w)
 #define MAXFAIL 5
 
-static char cpuchar[CPUSTATES] = { '=' , '+', '>', '-', ' ' };
-static char cpuorder[CPUSTATES] = { CP_SYS, CP_INTR, CP_USER, CP_NICE,
-                                    CP_IDLE };
+#define CPUSTATES 5
+static const char cpuchar[5] = { '=' , '+', '>', '-', ' ' };
+
+static const size_t cpuoffsets[] = {
+       offsetof(struct kinfo_cputime, cp_sys),
+       offsetof(struct kinfo_cputime, cp_intr),
+       offsetof(struct kinfo_cputime, cp_user),
+       offsetof(struct kinfo_cputime, cp_nice),
+       offsetof(struct kinfo_cputime, cp_idle)
+};
 
 void
 showkre(void)
@@ -396,13 +413,19 @@ showkre(void)
        int psiz, inttotal;
        int i, l, c;
        static int failcnt = 0;
+       double total_time;
 
        etime = 0;
-       for(i = 0; i < CPUSTATES; i++) {
-               X(time);
-               Q(cp_time);
-               etime += s.time[i];
-       }
+       CP_UPDATE(cp_time.cp_user);
+       CP_UPDATE(cp_time.cp_nice);
+       CP_UPDATE(cp_time.cp_sys);
+       CP_UPDATE(cp_time.cp_intr);
+       CP_UPDATE(cp_time.cp_idle);
+
+       total_time = etime;
+       if (total_time == 0.0)
+               total_time = 1.0;
+
        if (etime < 100000.0) { /* < 100ms ignore this trash */
                if (failcnt++ >= MAXFAIL) {
                        clear();
@@ -419,6 +442,8 @@ showkre(void)
        failcnt = 0;
        etime /= 1000000.0;
        etime /= ncpu;
+       if (etime == 0)
+               etime = 1;
        inttotal = 0;
        for (i = 0; i < nintr; i++) {
                if (s.intrcnt[i] == 0)
@@ -446,8 +471,9 @@ showkre(void)
        psiz = 0;
        f2 = 0.0;
        for (c = 0; c < CPUSTATES; c++) {
-               i = cpuorder[c];
-               f1 = cputime(i);
+               uint64_t val = *(uint64_t *)(((uint8_t *)&s.cp_time) +
+                   cpuoffsets[c]);
+               f1 = 100.0 * val / total_time;
                f2 += f1;
                l = (int) ((f2 + 1.0) / 2.0) - psiz;
                if (f1 > 99.9)
@@ -641,20 +667,6 @@ ucount(void)
        return (nusers);
 }
 
-static float
-cputime(int indx)
-{
-       double t;
-       register int i;
-
-       t = 0;
-       for (i = 0; i < CPUSTATES; i++)
-               t += s.time[i];
-       if (t == 0.0)
-               t = 1.0;
-       return (s.time[indx] * 100.0 / t);
-}
-
 static void
 putint(int n, int l, int c, int w)
 {
@@ -738,8 +750,10 @@ getinfo(struct Info *s, enum state st)
                 exit(1);
         }
 
-       NREAD(X_CPTIME, s->time, sizeof s->time);
-       NREAD(X_CPTIME, cur.cp_time, sizeof(cur.cp_time));
+       if (kinfo_get_sched_cputime(&s->cp_time))
+               err(1, "kinfo_get_sched_cputime");
+       if (kinfo_get_sched_cputime(&cp_time))
+               err(1, "kinfo_get_sched_cputime");
        NREAD(X_BUFFERSPACE, &s->bufspace, sizeof(s->bufspace));
        NREAD(X_DESIREDVNODES, &s->desiredvnodes, sizeof(s->desiredvnodes));
        NREAD(X_NUMVNODES, &s->numvnodes, LONG);
@@ -768,11 +782,8 @@ getinfo(struct Info *s, enum state st)
                }
        }
 
-       /* 
-        * Since the nchstats is a per-cpu array, we can just divide
-        * and get the number of cpus, saving us a sysctl(2) call.
-        */
-       ncpu = nch_size / sizeof(struct nchstats);
+       if (kinfo_get_cpus(&ncpu))
+               err(1, "kinfo_get_cpus");
        kvm_nch_cpuagg(nch_tmp, &s->nchstats, ncpu);
        free(nch_tmp);
 
index 7802059..92c735c 100644 (file)
@@ -1,7 +1,9 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
-# $DragonFly: src/usr.bin/time/Makefile,v 1.2 2004/12/19 19:37:06 liamfoy Exp $
+# $DragonFly: src/usr.bin/time/Makefile,v 1.3 2004/12/22 11:01:49 joerg Exp $
 
 PROG=  time
-
+DPADD= ${LIBKINFO}
+LDADD= -lkinfo
 WARNS?=        6
+
 .include <bsd.prog.mk>
index 8006b20..35eb28b 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1987, 1988, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)time.c  8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/time/time.c,v 1.14.2.5 2002/06/28 08:35:15 tjr Exp $
- * $DragonFly: src/usr.bin/time/time.c,v 1.8 2004/12/19 19:37:06 liamfoy Exp $
+ * $DragonFly: src/usr.bin/time/time.c,v 1.9 2004/12/22 11:01:49 joerg Exp $
  */
 
 #include <sys/types.h>
 #include <sys/resource.h>
 #include <sys/signal.h>
 #include <sys/sysctl.h>
-#include <stdlib.h>
 #include <sys/wait.h>
 
 #include <err.h>
-#include <stdio.h>
 #include <errno.h>
+#include <kinfo.h>
 #include <locale.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <signal.h>
 
-static int getstathz(void);
 static void humantime(FILE *, long, long);
 static void usage(void);
 
@@ -166,7 +166,8 @@ main(int argc, char **argv)
                int hz;
                u_long ticks;
 
-               hz = getstathz();
+               if (kinfo_get_sched_stathz(&hz))
+                       err(1, "kinfo_get_sched_stathz");
                ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
                     hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
 
@@ -229,24 +230,6 @@ usage(void)
        exit(1);
 }
 
-/*
- * Return the frequency of the kernel's statistics clock.
- */
-static int
-getstathz(void)
-{
-       struct clockinfo clockrate;
-       int mib[2];
-       size_t size;
-
-       mib[0] = CTL_KERN;
-       mib[1] = KERN_CLOCKRATE;
-       size = sizeof(clockrate);
-       if (sysctl(mib, 2, &clockrate, &size, NULL, 0) == -1)
-               err(1, "sysctl kern.clockrate");
-       return(clockrate.stathz);
-}
-
 static void
 humantime(FILE *out, long sec, long usec)
 {
index a13677e..739fc42 100644 (file)
@@ -21,7 +21,7 @@
  *          Hiten Pandya <hmp@backplane.com>
  *
  * $FreeBSD: src/usr.bin/top/machine.c,v 1.29.2.2 2001/07/31 20:27:05 tmm Exp $
- * $DragonFly: src/usr.bin/top/machine.c,v 1.13 2004/11/18 14:35:08 joerg Exp $
+ * $DragonFly: src/usr.bin/top/machine.c,v 1.14 2004/12/22 11:01:49 joerg Exp $
  */
 
 
 #include <sys/param.h>
 
 #include "os.h"
+#include <err.h>
+#include <kvm.h>
 #include <stdio.h>
-#include <nlist.h>
 #include <math.h>
-#include <kvm.h>
 #include <pwd.h>
 #include <sys/errno.h>
 #include <sys/sysctl.h>
-#include <sys/dkstat.h>
 #include <sys/file.h>
 #include <sys/time.h>
 #include <sys/user.h>
@@ -52,6 +51,7 @@
 
 #include <osreldate.h> /* for changes in kernel structures */
 
+#include <sys/kinfo.h>
 #include <kinfo.h>
 #include "top.h"
 #include "machine.h"
@@ -93,22 +93,6 @@ struct handle
 /* what we consider to be process size: */
 #define PROCSIZE(pp) (VP((pp), vm_map.size) / 1024)
 
-/* definitions for indices in the nlist array */
-
-static struct nlist nlst[] = {
-#define X_CCPU         0
-    { "_ccpu" },
-#define X_CP_TIME      1
-    { "_cp_time" },
-#define X_AVENRUN      2
-    { "_averunnable" },
-
-/* Last pid */
-#define X_LASTPID      3
-    { "_nextpid" },            
-    { 0 }
-};
-
 /*
  *  These definitions control the format of the per-process area
  */
@@ -143,23 +127,13 @@ static kvm_t *kd;
 
 static double logcpu;
 
-/* these are retrieved from the kernel in _init */
-
-static load_avg  ccpu;
-
-/* these are offsets obtained via nlist and used in the get_ functions */
-
-static unsigned long cp_time_offset;
-static unsigned long avenrun_offset;
-static unsigned long lastpid_offset;
 static long lastpid;
 static long cnt;
+static int ccpu;
 
 /* these are for calculating cpu state percentages */
 
-static long cp_time[CPUSTATES];
-static long cp_old[CPUSTATES];
-static long cp_diff[CPUSTATES];
+static struct kinfo_cputime cp_time, cp_old;
 
 /* these are for detailing the process states */
 
@@ -171,9 +145,9 @@ char *procstatenames[] = {
 };
 
 /* these are for detailing the cpu states */
-
-int cpu_states[CPUSTATES];
-char *cpustatenames[] = {
+#define CPU_STATES 5
+int cpu_states[CPU_STATES];
+char *cpustatenames[CPU_STATES + 1] = {
     "user", "nice", "system", "interrupt", "idle", NULL
 };
 
@@ -209,9 +183,6 @@ static int pageshift;               /* log base 2 of the pagesize */
 
 #define pagetok(size) ((size) << pageshift)
 
-/* useful externals */
-long percentages();
-
 #ifdef ORDER
 /* sorting orders. first is default */
 char *ordernames[] = {
@@ -219,6 +190,44 @@ char *ordernames[] = {
 };
 #endif
 
+static void
+cputime_percentages(int out[CPU_STATES], struct kinfo_cputime *new,
+                   struct kinfo_cputime *old)
+{
+        struct kinfo_cputime diffs;
+        int i;
+       uint64_t total_change, half_total;
+
+        /* initialization */
+       total_change = 0;
+
+        diffs.cp_user = new->cp_user - old->cp_user;
+       diffs.cp_nice = new->cp_nice - old->cp_nice;
+       diffs.cp_sys = new->cp_sys - old->cp_sys;
+        diffs.cp_intr = new->cp_intr - old->cp_intr;
+        diffs.cp_idle = new->cp_idle - old->cp_idle;
+       total_change = diffs.cp_user + diffs.cp_nice + diffs.cp_sys +
+           diffs.cp_intr + diffs.cp_idle;
+        old->cp_user = new->cp_user;
+        old->cp_nice = new->cp_nice;
+        old->cp_sys = new->cp_sys;
+        old->cp_intr = new->cp_intr;
+       old->cp_idle = new->cp_idle;
+
+        /* avoid divide by zero potential */
+       if (total_change == 0)
+               total_change = 1;
+
+       /* calculate percentages based on overall change, rounding up */
+        half_total = total_change >> 1;
+
+       out[0] = ((diffs.cp_user * 1000LL + half_total) / total_change);
+        out[1] = ((diffs.cp_nice * 1000LL + half_total) / total_change);
+       out[2] = ((diffs.cp_sys * 1000LL + half_total) / total_change);
+        out[3] = ((diffs.cp_intr * 1000LL + half_total) / total_change);
+       out[4] = ((diffs.cp_idle * 1000LL + half_total) / total_change);
+}
+
 int
 machine_init(struct statics *statics)
 {
@@ -247,29 +256,11 @@ machine_init(struct statics *statics)
     if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL)
        return -1;
 
-
-    /* get the list of symbols we want to access in the kernel */
-    (void) kvm_nlist(kd, nlst);
-    if (nlst[0].n_type == 0)
-    {
-       fprintf(stderr, "top: nlist failed\n");
-       return(-1);
-    }
-
-    /* make sure they were all found */
-    if (i > 0 && check_nlist(nlst) > 0)
-    {
+    if (kinfo_get_sched_ccpu(&ccpu)) {
+       fprintf(stderr, "top: kinfo_get_sched_ccpu failed\n");
        return(-1);
     }
 
-    (void) getkval(nlst[X_CCPU].n_value,   (int *)(&ccpu),     sizeof(ccpu),
-           nlst[X_CCPU].n_name);
-
-    /* stash away certain offsets for later use */
-    cp_time_offset = nlst[X_CP_TIME].n_value;
-    avenrun_offset = nlst[X_AVENRUN].n_value;
-    lastpid_offset =  nlst[X_LASTPID].n_value;
-
     /* this is used in calculating WCPU -- calculate it ahead of time */
     logcpu = log(loaddouble(ccpu));
 
@@ -328,45 +319,19 @@ void
 get_system_info(struct system_info *si)
 {
     long total;
-    load_avg avenrun[3];
     int mib[2];
     struct timeval boottime;
     size_t bt_size;
 
-    /* get the cp_time array */
-    (void) getkval(cp_time_offset, (int *)cp_time, sizeof(cp_time),
-                  nlst[X_CP_TIME].n_name);
-    (void) getkval(avenrun_offset, (int *)avenrun, sizeof(avenrun),
-                  nlst[X_AVENRUN].n_name);
+    if (kinfo_get_sched_cputime(&cp_time))
+       err(1, "kinfo_get_sched_cputime failed");
 
-    (void) getkval(lastpid_offset, (int *)(&lastpid), sizeof(lastpid),
-                  "!");
+    getloadavg(si->load_avg, 3);
 
-    /* convert load averages to doubles */
-    {
-       register int i;
-       register double *infoloadp;
-       load_avg *avenrunp;
-
-#ifdef notyet
-       struct loadavg sysload;
-       int size;
-       getkerninfo(KINFO_LOADAVG, &sysload, &size, 0);
-#endif
-
-       infoloadp = si->load_avg;
-       avenrunp = avenrun;
-       for (i = 0; i < 3; i++)
-       {
-#ifdef notyet
-           *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale;
-#endif
-           *infoloadp++ = loaddouble(*avenrunp++);
-       }
-    }
+    lastpid = 0;
 
     /* convert cp_time counts to percentages */
-    total = percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
+    cputime_percentages(cpu_states, &cp_time, &cp_old);
 
     /* sum memory & swap statistics */
     {
@@ -693,37 +658,6 @@ static int check_nlist(register struct nlist *nlst)
     return(i);
 }
 
-
-/*
- *  getkval(offset, ptr, size, refstr) - get a value out of the kernel.
- *     "offset" is the byte offset into the kernel for the desired value,
- *     "ptr" points to a buffer into which the value is retrieved,
- *     "size" is the size of the buffer (and the object to retrieve),
- *     "refstr" is a reference string used when printing error meessages,
- *         if "refstr" starts with a '!', then a failure on read will not
- *         be fatal (this may seem like a silly way to do things, but I
- *         really didn't want the overhead of another argument).
- *     
- */
-
-static int getkval(unsigned long offset, int *ptr, int size, char *refstr)
-{
-    if (kvm_read(kd, offset, (char *) ptr, size) != size)
-    {
-       if (*refstr == '!')
-       {
-           return(0);
-       }
-       else
-       {
-           fprintf(stderr, "top: kvm_read for %s: %s\n",
-               refstr, strerror(errno));
-           quit(23);
-       }
-    }
-    return(1);
-}
-    
 /* comparison routines for qsort */
 
 /*
@@ -986,24 +920,6 @@ int proc_owner(int pid)
  * swapmode is based on a program called swapinfo written
  * by Kevin Lahey <kml@rokkaku.atl.ga.us>.
  */
-
-#define        SVAR(var) __STRING(var) /* to force expansion */
-#define        KGET(idx, var)                                                  \
-       KGET1(idx, &var, sizeof(var), SVAR(var))
-#define        KGET1(idx, p, s, msg)                                           \
-       KGET2(nlst[idx].n_value, p, s, msg)
-#define        KGET2(addr, p, s, msg)                                          \
-       if (kvm_read(kd, (u_long)(addr), p, s) != s) {                  \
-               warnx("cannot read %s: %s", msg, kvm_geterr(kd));       \
-               return (0);                                             \
-       }
-#define        KGETRET(addr, p, s, msg)                                        \
-       if (kvm_read(kd, (u_long)(addr), p, s) != s) {                  \
-               warnx("cannot read %s: %s", msg, kvm_geterr(kd));       \
-               return (0);                                             \
-       }
-
-
 int
 swapmode(int *retavail, int *retfree)
 {
@@ -1027,4 +943,3 @@ swapmode(int *retavail, int *retfree)
            (double)swapary[0].ksw_total);
        return(n);
 }
-
index a5535e5..e27d00f 100644 (file)
@@ -1,13 +1,13 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
 # $FreeBSD: src/usr.bin/vmstat/Makefile,v 1.5.6.1 2001/04/25 11:29:44 ru Exp $
-# $DragonFly: src/usr.bin/vmstat/Makefile,v 1.2 2003/06/17 04:29:33 dillon Exp $
+# $DragonFly: src/usr.bin/vmstat/Makefile,v 1.3 2004/12/22 11:01:49 joerg Exp $
 
 PROG=  vmstat
 MAN=   vmstat.8
 CFLAGS+=-I${.CURDIR}/../../sys
 BINGRP=        kmem
 BINMODE=2555
-DPADD= ${LIBKVM} ${LIBDEVSTAT}
-LDADD= -lkvm -ldevstat
+DPADD= ${LIBKINFO} ${LIBKVM} ${LIBDEVSTAT}
+LDADD= -lkinfo -lkvm -ldevstat
 
 .include <bsd.prog.mk>
index edc87d9..51b7ed7 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1980, 1986, 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)vmstat.c        8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/vmstat/vmstat.c,v 1.38.2.4 2001/07/31 19:52:41 tmm Exp $
- * $DragonFly: src/usr.bin/vmstat/vmstat.c,v 1.13 2004/10/25 22:01:06 liamfoy Exp $
+ * $DragonFly: src/usr.bin/vmstat/vmstat.c,v 1.14 2004/12/22 11:01:49 joerg Exp $
  */
 
 #define _KERNEL_STRUCTURES
@@ -41,7 +41,6 @@
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/user.h>
-#include <sys/dkstat.h>
 #include <sys/uio.h>
 #include <sys/namei.h>
 #include <sys/malloc.h>
@@ -56,6 +55,7 @@
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <kinfo.h>
 #include <kvm.h>
 #include <limits.h>
 #include <nlist.h>
 #include <devstat.h>
 
 static struct nlist namelist[] = {
-#define        X_CPTIME        0
-       { "_cp_time" },
-#define        X_BOOTTIME      1
+#define        X_BOOTTIME      0
        { "_boottime" },
-#define X_HZ           2
-       { "_hz" },
-#define X_STATHZ       3
-       { "_stathz" },
-#define X_NCHSTATS     4
+#define X_NCHSTATS     1
        { "_nchstats" },
-#define        X_INTRNAMES     5
+#define        X_INTRNAMES     2
        { "_intrnames" },
-#define        X_EINTRNAMES    6
+#define        X_EINTRNAMES    3
        { "_eintrnames" },
-#define        X_INTRCNT       7
+#define        X_INTRCNT       4
        { "_intrcnt" },
-#define        X_EINTRCNT      8
+#define        X_EINTRCNT      5
        { "_eintrcnt" },
-#define        X_KMEMSTATISTICS        9
+#define        X_KMEMSTATISTICS        6
        { "_kmemstatistics" },
-#define        X_ZLIST         10
+#define        X_ZLIST         7
        { "_zlist" },
 #ifdef notyet
-#define        X_DEFICIT       11
+#define        X_DEFICIT       8
        { "_deficit" },
-#define        X_FORKSTAT      12
+#define        X_FORKSTAT      9
        { "_forkstat" },
-#define X_REC          13
+#define X_REC          10
        { "_rectime" },
-#define X_PGIN         14
+#define X_PGIN         11
        { "_pgintime" },
-#define        X_XSTATS        15
+#define        X_XSTATS        12
        { "_xstats" },
-#define X_END          16
+#define X_END          13
 #else
-#define X_END          11
+#define X_END          8
 #endif
        { "" },
 };
@@ -129,6 +123,8 @@ int nflag = 0;
 
 kvm_t *kd;
 
+struct kinfo_cputime cp_time, old_cp_time, diff_cp_time;
+
 #define        FORKSTAT        0x01
 #define        INTRSTAT        0x02
 #define        MEMSTAT         0x04
@@ -381,7 +377,7 @@ getuptime(void)
        return(uptime);
 }
 
-int    hz, hdrcnt;
+int    hdrcnt;
 
 void
 dovmstat(u_int interval, int reps)
@@ -398,15 +394,11 @@ dovmstat(u_int interval, int reps)
        halfuptime = uptime / 2;
        signal(SIGCONT, needhdr);
 
-       if (namelist[X_STATHZ].n_type != 0 && namelist[X_STATHZ].n_value != 0)
-               kread(X_STATHZ, &hz, sizeof(hz));
-       if (!hz)
-               kread(X_HZ, &hz, sizeof(hz));
-
        for (hdrcnt = 1;;) {
                if (!--hdrcnt)
                        printhdr();
-               kread(X_CPTIME, cur.cp_time, sizeof(cur.cp_time));
+               if (kinfo_get_sched_cputime(&cp_time))
+                       err(1, "kinfo_get_sched_cputime");
 
                tmp_dinfo = last.dinfo;
                last.dinfo = cur.dinfo;
@@ -669,12 +661,13 @@ devstats(void)
        long double transfers_per_second;
        long double busy_seconds;
        long tmp;
-       
-       for (state = 0; state < CPUSTATES; ++state) {
-               tmp = cur.cp_time[state];
-               cur.cp_time[state] -= last.cp_time[state];
-               last.cp_time[state] = tmp;
-       }
+
+       diff_cp_time.cp_user = cp_time.cp_user - old_cp_time.cp_user;
+       diff_cp_time.cp_nice = cp_time.cp_nice - old_cp_time.cp_nice;
+       diff_cp_time.cp_sys = cp_time.cp_sys - old_cp_time.cp_sys;
+       diff_cp_time.cp_intr = cp_time.cp_intr - old_cp_time.cp_intr;
+       diff_cp_time.cp_idle = cp_time.cp_idle - old_cp_time.cp_idle;
+       old_cp_time = cp_time;
 
        busy_seconds = compute_etime(cur.busy_time, last.busy_time);
 
@@ -701,21 +694,19 @@ devstats(void)
 void
 cpustats(void)
 {
-       int state;
-       double pct, total;
+       uint64_t total;
+       double pct;
+
+       total = diff_cp_time.cp_user + diff_cp_time.cp_nice +
+           diff_cp_time.cp_sys + diff_cp_time.cp_intr + diff_cp_time.cp_idle;
 
-       total = 0;
-       for (state = 0; state < CPUSTATES; ++state)
-               total += cur.cp_time[state];
        if (total)
-               pct = 100 / total;
+               pct = 100.0 / total;
        else
                pct = 0;
-       printf("%2.0f ", (cur.cp_time[CP_USER] +
-                               cur.cp_time[CP_NICE]) * pct);
-       printf("%2.0f ", (cur.cp_time[CP_SYS] +
-                               cur.cp_time[CP_INTR]) * pct);
-       printf("%2.0f", cur.cp_time[CP_IDLE] * pct);
+       printf("%2.0f ", (diff_cp_time.cp_user + diff_cp_time.cp_nice) * pct);
+       printf("%2.0f ", (diff_cp_time.cp_sys + diff_cp_time.cp_intr) * pct);
+       printf("%2.0f", diff_cp_time.cp_idle * pct);
 }
 
 void
@@ -855,7 +846,7 @@ dozmem(void)
 void
 kread(int nlx, void *addr, size_t size)
 {
-       char *sym;
+       const char *sym;
 
        if (namelist[nlx].n_type == 0 || namelist[nlx].n_value == 0) {
                sym = namelist[nlx].n_name;
index a3864c0..6fbe60a 100644 (file)
@@ -1,13 +1,11 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
 # $FreeBSD: src/usr.sbin/iostat/Makefile,v 1.5.2.1 2001/04/25 12:09:40 ru Exp $
-# $DragonFly: src/usr.sbin/iostat/Makefile,v 1.3 2004/01/31 06:56:45 dillon Exp $
+# $DragonFly: src/usr.sbin/iostat/Makefile,v 1.4 2004/12/22 11:01:49 joerg Exp $
 
 PROG=  iostat
 MAN=   iostat.8
 CFLAGS+=-I${.CURDIR}/../../sys
-DPADD= ${LIBKVM} ${LIBDEVSTAT}
-LDADD= -lkvm -ldevstat
-BINGRP=        kmem
-BINMODE=2555
+DPADD= ${LIBDEVSTAT} ${LIBKINFO}
+LDADD= -ldevstat -lkinfo
 
 .include <bsd.prog.mk>
index 0ad4adf..6cb692c 100644 (file)
@@ -26,7 +26,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/usr.sbin/iostat/iostat.8,v 1.11.2.9 2002/12/29 16:35:41 schweikh Exp $
-.\" $DragonFly: src/usr.sbin/iostat/iostat.8,v 1.2 2003/06/17 04:29:55 dillon Exp $
+.\" $DragonFly: src/usr.sbin/iostat/iostat.8,v 1.3 2004/12/22 11:01:49 joerg Exp $
 .\"
 .\" Copyright (c) 1985, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -73,9 +73,7 @@ statistics
 .Nm
 .Op Fl CdhKIoT?\&
 .Op Fl c Ar count
-.Op Fl M Ar core
 .Op Fl n Ar devs
-.Op Fl N Ar system
 .Oo
 .Fl t
 .Sm off
@@ -128,10 +126,6 @@ statistics for each second during that time period.
 .It Fl K
 In the blocks transferred display (-o), display block count in kilobytes rather
 then the device native block size.
-.It Fl M
-Extract values associated with the name list from the specified core
-instead of the default
-.Dq Pa /dev/kmem .
 .It Fl n
 Display up to
 .Ar devs
@@ -140,9 +134,6 @@ number of devices.
 will display fewer devices if there aren't
 .Ar devs
 devices present.
-.It Fl N
-Extract the name list from the specified system instead of the default
-.Dq Pa /kernel .
 .It Fl o
 Display old-style
 .Nm
@@ -347,13 +338,6 @@ average milliseconds per transaction
 % of cpu time in idle mode
 .El
 .El
-.Sh FILES
-.Bl -tag -width /dev/kmem -compact
-.It Pa /kernel
-Default kernel namelist.
-.It Pa /dev/kmem
-Default memory file.
-.El
 .Sh EXAMPLES
 .Dl iostat -w 1 da0 da1 cd0
 .Pp
@@ -415,10 +399,5 @@ This version of
 .Nm
 first appeared in
 .Fx 3.0 .
-.Sh BUGS
-You cannot display device statistics for a non-running system, due to the
-fact that the new device statistics interface is accessible only via
-.Xr sysctl 3 ,
-which does not provide a way to access non-running systems.
 .Sh AUTHORS
 .An Kenneth Merry Aq ken@FreeBSD.org
index a175be4..66d8e15 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.sbin/iostat/iostat.c,v 1.17.2.2 2001/07/19 04:15:42 kris Exp $
- * $DragonFly: src/usr.sbin/iostat/iostat.c,v 1.4 2004/03/23 07:45:34 cpressey Exp $
+ * $DragonFly: src/usr.sbin/iostat/iostat.c,v 1.5 2004/12/22 11:01:49 joerg Exp $
  */
 /*
  * Parts of this program are derived from the original FreeBSD iostat
 
 #include <sys/param.h>
 #include <sys/errno.h>
-#include <sys/dkstat.h>
 
 #include <err.h>
 #include <ctype.h>
 #include <fcntl.h>
-#include <kvm.h>
+#include <kinfo.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 #include <devstat.h>
 
-struct nlist namelist[] = {
-#define X_TK_NIN       0
-       { "_tk_nin" },
-#define X_TK_NOUT      1
-       { "_tk_nout" },
-#define X_CP_TIME      2
-       { "_cp_time" },
-#define X_HZ           3
-       { "_hz" },
-#define X_STATHZ       4
-       { "_stathz" },
-#define X_END          4
-       { NULL },
-};
-
 struct statinfo cur, last;
+uint64_t tk_nin, old_tk_nin, diff_tk_nin;
+uint64_t tk_nout, old_tk_nout, diff_tk_nout;
+struct kinfo_cputime cp_time, old_cp_time, diff_cp_time;
+double cp_time_total;
 int num_devices;
 struct device_selection *dev_select;
 int maxshowdevs;
 int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0;
 
-#define nlread(x, v) \
-       kvm_read(kd, namelist[x].n_value, &(v), sizeof(v))
-
 /* local function declarations */
 static void usage(void);
 static void phdr(int signo);
@@ -154,8 +139,8 @@ usage(void)
         * This isn't mentioned in the man page, or the usage statement,
         * but it is supported.
         */
-       fprintf(stderr, "usage: iostat [-CdhIKoT?] [-c count] [-M core]"
-               " [-n devs] [-N system]\n"
+       fprintf(stderr, "usage: iostat [-CdhIKoT?] [-c count]"
+               " [-n devs]\n"
                "\t      [-t type,if,pass] [-w wait] [drives]\n");
 }
 
@@ -166,11 +151,9 @@ main(int argc, char **argv)
        int i;
        int tflag = 0, hflag = 0, cflag = 0, wflag = 0, nflag = 0;
        int count = 0, waittime = 0;
-       char *memf = NULL, *nlistf = NULL;
        struct devstat_match *matches;
        int num_matches = 0;
         char errbuf[_POSIX2_LINE_MAX];
-       kvm_t *kd;
        int hz, stathz;
        int headercount;
        long generation;
@@ -206,9 +189,6 @@ main(int argc, char **argv)
                        case 'K':
                                Kflag++;
                                break;
-                       case 'M':
-                               memf = optarg;
-                               break;
                        case 'n':
                                nflag++;
                                maxshowdevs = atoi(optarg);
@@ -216,9 +196,6 @@ main(int argc, char **argv)
                                        errx(1, "number of devices %d is < 0",
                                             maxshowdevs);
                                break;
-                       case 'N':
-                               nlistf = optarg;
-                               break;
                        case 'o':
                                oflag++;
                                break;
@@ -247,13 +224,6 @@ main(int argc, char **argv)
        argc -= optind;
        argv += optind;
 
-       /*
-        * Discard setgid privileges if not the running kernel so that bad
-        * guys can't print interesting stuff from kernel memory.
-        */
-       if (nlistf != NULL || memf != NULL)
-               setgid(getgid());
-
        /*
         * Make sure that the userland devstat version matches the kernel
         * devstat version.  If not, exit and print a message informing 
@@ -382,18 +352,10 @@ main(int argc, char **argv)
        if ((wflag > 0) && (cflag == 0))
                count = -1;
 
-       kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
-
-       if (kd == 0)
-               errx(1, "kvm_openfiles: %s", errbuf);
-
-       if (kvm_nlist(kd, namelist) == -1)
-               errx(1, "kvm_nlist: %s", kvm_geterr(kd));
-
-       nlread(X_HZ, hz);
-       nlread(X_STATHZ, stathz);
-       if (stathz)
-               hz = stathz;
+       if (kinfo_get_sched_hz(&hz))
+               err(1, "kinfo_get_sched_hz");
+       if (kinfo_get_sched_stathz(&hz))
+               err(1, "kinfo_get_sched_stathz");
 
        /*
         * If the user stops the program (control-Z) and then resumes it,
@@ -404,18 +366,17 @@ main(int argc, char **argv)
        for (headercount = 1;;) {
                struct devinfo *tmp_dinfo;
                long tmp;
-               double etime;
 
                if (!--headercount) {
                        phdr(0);
                        headercount = 20;
                }
-               kvm_read(kd, namelist[X_TK_NIN].n_value,
-                   &cur.tk_nin, sizeof(cur.tk_nin));
-               kvm_read(kd, namelist[X_TK_NOUT].n_value,
-                   &cur.tk_nout, sizeof(cur.tk_nout));
-               kvm_read(kd, namelist[X_CP_TIME].n_value,
-                   cur.cp_time, sizeof(cur.cp_time));
+               if (kinfo_get_tty_tk_nin(&tk_nin))
+                       err(1, "kinfo_get_tty_tk_nin");
+               if (kinfo_get_tty_tk_nout(&tk_nout))
+                       err(1, "kinfo_get_tty_tk_nout");
+               if (kinfo_get_sched_cputime(&cp_time))
+                       err(1, "kinfo_get_sched_cputime");
 
                tmp_dinfo = last.dinfo;
                last.dinfo = cur.dinfo;
@@ -490,27 +451,27 @@ main(int argc, char **argv)
                        }
                }
 
-               tmp = cur.tk_nin;
-               cur.tk_nin -= last.tk_nin;
-               last.tk_nin = tmp;
-               tmp = cur.tk_nout;
-               cur.tk_nout -= last.tk_nout;
-               last.tk_nout = tmp;
+               diff_tk_nin = tk_nin - old_tk_nin;
+               old_tk_nin = tk_nin;
+               diff_tk_nout = tk_nout - old_tk_nout;
+               old_tk_nout = tk_nout;
 
-               etime = 0.0;
+               diff_cp_time.cp_user = cp_time.cp_user - old_cp_time.cp_user;
+               diff_cp_time.cp_nice = cp_time.cp_nice - old_cp_time.cp_nice;
+               diff_cp_time.cp_sys = cp_time.cp_sys - old_cp_time.cp_sys;
+               diff_cp_time.cp_intr = cp_time.cp_intr - old_cp_time.cp_intr;
+               diff_cp_time.cp_idle = cp_time.cp_idle - old_cp_time.cp_idle;
+               cp_time_total = diff_cp_time.cp_user + diff_cp_time.cp_nice +
+                   diff_cp_time.cp_sys + diff_cp_time.cp_intr +
+                   diff_cp_time.cp_idle;
+               old_cp_time = cp_time;
+
+               if (cp_time_total == 0.0)
+                       cp_time_total = 1.0;
 
-               for (i = 0; i < CPUSTATES; i++) {
-                       tmp = cur.cp_time[i];
-                       cur.cp_time[i] -= last.cp_time[i];
-                       last.cp_time[i] = tmp;
-                       etime += cur.cp_time[i];
-               }
-               if (etime == 0.0)
-                       etime = 1.0;
-               etime /= (float)hz;
                if ((dflag == 0) || (Tflag > 0))
-                       printf("%4.0f%5.0f", cur.tk_nin / etime
-                               cur.tk_nout/etime);
+                       printf("%4.0f%5.0f", diff_tk_nin / cp_time_total * 1e6
+                               diff_tk_nout / cp_time_total * 1e6);
                devstats(hflag);
                if ((dflag == 0) || (Cflag > 0))
                        cpustats();
@@ -667,13 +628,13 @@ static void
 cpustats(void)
 {
        int state;
-       double time;
 
-       time = 0.0;
+       if (cp_time_total == 0.0)
+               cp_time_total = 1.0;
 
-       for (state = 0; state < CPUSTATES; ++state)
-               time += cur.cp_time[state];
-       for (state = 0; state < CPUSTATES; ++state)
-               printf(" %2.0f",
-                      100. * cur.cp_time[state] / (time ? time : 1));
+       printf(" %2.0f", 100. * diff_cp_time.cp_user / cp_time_total);
+       printf(" %2.0f", 100. * diff_cp_time.cp_nice / cp_time_total);
+       printf(" %2.0f", 100. * diff_cp_time.cp_sys / cp_time_total);
+       printf(" %2.0f", 100. * diff_cp_time.cp_intr / cp_time_total);
+       printf(" %2.0f", 100. * diff_cp_time.cp_idle / cp_time_total);
 }