#define _KERNEL_STRUCTURES_
#include <sys/param.h>
#include <sys/user.h>
#include <sys/malloc.h>
#include <sys/signalvar.h>
#include <sys/vnode.h>
#include <sys/namecache.h>
#include <sys/slaballoc.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
#include <vm/vm_kern.h>
#include <vm/vm_object.h>
#include <vm/swap_pager.h>
#include <vm/vnode_pager.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <kvm.h>
#include <nlist.h>
#include <getopt.h>
struct nlist Nl[] = {
#if 0
{ "_vm_page_buckets" },
{ "_vm_page_hash_mask" },
#endif
{ "_vm_page_queues" },
{ NULL }
};
int debugopt;
int verboseopt;
static void kkread_vmpage(kvm_t *kd, u_long addr, vm_page_t m);
static void kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes);
static int kkread_err(kvm_t *kd, u_long addr, void *buf, size_t nbytes);
int
main(int ac, char **av)
{
const char *corefile = NULL;
const char *sysfile = NULL;
kvm_t *kd;
int ch;
int i;
int q = PQ_FREE;
struct vpgqueues queues[PQ_COUNT];
while ((ch = getopt(ac, av, "M:N:dviacf")) != -1) {
switch(ch) {
case 'i':
q = PQ_INACTIVE;
break;
case 'a':
q = PQ_ACTIVE;
break;
case 'c':
q = PQ_CACHE;
break;
case 'f':
q = PQ_FREE;
break;
case 'd':
++debugopt;
break;
case 'v':
++verboseopt;
break;
case 'M':
corefile = optarg;
break;
case 'N':
sysfile = optarg;
break;
default:
fprintf(stderr, "%s [-M core] [-N system]\n", av[0]);
exit(1);
}
}
ac -= optind;
av += optind;
if ((kd = kvm_open(sysfile, corefile, NULL, O_RDONLY, "kvm:")) == NULL) {
perror("kvm_open");
exit(1);
}
if (kvm_nlist(kd, Nl) != 0) {
perror("kvm_nlist");
exit(1);
}
for (;;) {
kkread(kd, Nl[0].n_value, queues, sizeof(queues));
for (i = 0; i < PQ_L2_SIZE; ++i) {
struct vpgqueues *vpq = &queues[q+i];
if ((i & 7) == 0)
printf("%3d ", i);
printf("\t%6d", vpq->lcnt);
if ((i & 7) == 7)
printf("\n");
if ((i & 63) == 63)
printf("\n");
}
printf("\n");
sleep(1);
}
return(0);
}
static void
kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes)
{
if (kvm_read(kd, addr, buf, nbytes) != nbytes) {
perror("kvm_read");
exit(1);
}
}
static int
kkread_err(kvm_t *kd, u_long addr, void *buf, size_t nbytes)
{
if (kvm_read(kd, addr, buf, nbytes) != nbytes) {
return 1;
}
return 0;
}