Update ncptrace.c to handle DragonFly_Stable and HEAD.
[dragonfly.git] / test / debug / ttyinfo.c
1 /*
2  * TTYINFO.C
3  *
4  * cc -I/usr/src/sys ttyinfo.c -o /usr/local/bin/ttyinfo -lkvm
5  *
6  * ttyinfo
7  *
8  * $DragonFly: src/test/debug/ttyinfo.c,v 1.1 2004/10/06 05:13:20 dillon Exp $
9  */
10
11 #define _KERNEL_STRUCTURES_
12 #include <sys/param.h>
13 #include <sys/user.h>
14 #include <sys/malloc.h>
15 #include <sys/signalvar.h>
16 #include <sys/vnode.h>
17 #include <sys/namecache.h>
18 #include <sys/tty.h>
19 #include <sys/clist.h>
20
21 #include <vm/vm.h>
22 #include <vm/vm_page.h>
23 #include <vm/vm_kern.h>
24 #include <vm/swap_pager.h>
25 #include <vm/vnode_pager.h>
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <fcntl.h>
31 #include <kvm.h>
32 #include <nlist.h>
33 #include <getopt.h>
34
35 struct nlist Nl[] = {
36     { "_cfreelist" },
37     { "_cfreecount" },
38     { "_cslushcount" },
39     { "_ctotcount" },
40     { NULL }
41 };
42
43 static void kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes);
44 static int scanfree(kvm_t *kd, struct cblock *cfree);
45
46 main(int ac, char **av)
47 {
48     struct cblock *cfree;
49     int cbytes;
50     int count;
51     int slush;
52     int totalcnt;
53     int ch;
54     kvm_t *kd;
55     const char *corefile = NULL;
56     const char *sysfile = NULL;
57
58     while ((ch = getopt(ac, av, "M:N:")) != -1) {
59         switch(ch) {
60         case 'M':
61             corefile = optarg;
62             break;
63         case 'N':
64             sysfile = optarg;
65             break;
66         default:
67             fprintf(stderr, "%s [-M core] [-N system]\n", av[0]);
68             exit(1);
69         }
70     }
71
72     if ((kd = kvm_open(sysfile, corefile, NULL, O_RDONLY, "kvm:")) == NULL) {
73         perror("kvm_open");
74         exit(1);
75     }
76     if (kvm_nlist(kd, Nl) != 0) {
77         perror("kvm_nlist");
78         exit(1);
79     }
80     kkread(kd, Nl[0].n_value, &cfree, sizeof(cfree));
81     kkread(kd, Nl[1].n_value, &cbytes, sizeof(cbytes));
82     kkread(kd, Nl[2].n_value, &slush, sizeof(slush));
83     kkread(kd, Nl[3].n_value, &totalcnt, sizeof(totalcnt));
84     count = scanfree(kd, cfree);
85     printf("blksize %d, freespc %d bytes, %d blks (%d total), %d slush",
86         CBSIZE, cbytes, cbytes / CBSIZE, totalcnt, slush);
87     if (cbytes % CBSIZE)
88         printf(" [unaligned]\n");
89     else
90         printf(" [aligned]\n");
91     printf("freelist found to have %d blocks\n", count);
92     return(0);
93 }
94
95 static int
96 scanfree(kvm_t *kd, struct cblock *cfree)
97 {
98     int count = 0;
99     struct cblock cb;
100
101     while (cfree) {
102         kkread(kd, (u_long)cfree, &cb, sizeof(cb));
103         cfree = cb.c_head.ch_next;
104         ++count;
105     }
106     return(count);
107 }
108
109 static void
110 kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes)
111 {
112     if (kvm_read(kd, addr, buf, nbytes) != nbytes) {
113         perror("kvm_read");
114         exit(1);
115     }
116 }
117