Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.sbin / kernbb / kernbb.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  */
10
11 #ifndef lint
12 static const char rcsid[] =
13   "$FreeBSD: src/usr.sbin/kernbb/kernbb.c,v 1.11.2.1 2001/07/19 04:17:03 kris Exp $";
14 #endif /* not lint */
15
16 #include <err.h>
17 #include <fcntl.h>
18 #include <kvm.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <unistd.h>
23
24 #define MAXBB 32768
25
26 struct bb {
27         u_long  zero_one;
28         u_long  filename;
29         u_long  counts;
30         u_long  ncounts;
31         u_long  next;
32         u_long  addr;
33         u_long  nwords;
34         u_long  func;
35         u_long  lineno;
36         u_long  file;
37 };
38
39 struct nlist namelist[] = {
40         { "bbhead" },
41         { NULL }
42 };
43
44 u_long  lineno[MAXBB];
45 u_long  counts[MAXBB];
46 u_long  addr[MAXBB];
47 u_long  func[MAXBB];
48 u_long  file[MAXBB];
49 char    *fn[MAXBB];
50 char    *pn[MAXBB];
51
52 kvm_t   *kv;
53
54 int
55 main()
56 {
57         int i,j;
58         u_long l1,l2,l4;
59         struct bb bb;
60         char buf[128];
61
62         kv = kvm_open(NULL,NULL,NULL,O_RDWR,"dnc");
63         if (!kv) 
64                 err(1,"kvm_open");
65         i = kvm_nlist(kv,namelist);
66         if (i)
67                 err(1,"kvm_nlist");
68
69         l1 = namelist[0].n_value;
70         kvm_read(kv,l1,&l2,sizeof l2);
71         while(l2) {
72                 l1 += sizeof l1;
73                 kvm_read(kv,l2,&bb,sizeof bb);
74                 l2 = bb.next;
75                 if (!bb.ncounts)
76                         continue;
77                 if (bb.ncounts > MAXBB)
78                         errx(1, "found %lu counts above limit of %u",
79                                 bb.ncounts, MAXBB);
80                 kvm_read(kv,bb.lineno,lineno, bb.ncounts * sizeof lineno[0]);
81                 kvm_read(kv,bb.counts,counts, bb.ncounts * sizeof counts[0]);
82                 kvm_read(kv,bb.addr,  addr,   bb.ncounts * sizeof addr[0]);
83                 kvm_read(kv,bb.file,  file,   bb.ncounts * sizeof file[0]);
84                 kvm_read(kv,bb.func,  func,   bb.ncounts * sizeof func[0]);
85                 l4 = 0;
86                 for (i=0; i < bb.ncounts; i++) {
87                         if (counts[i])
88                                 l4++;
89                         if (!func[i] && i+1 < bb.ncounts)
90                                 func[i] = func[i+1];
91                 }
92                 if (!l4)
93                         continue;
94                 for (i=0; i < bb.ncounts; i++) {
95
96                         if (0 && !counts[i])
97                                 continue;
98
99                         if (!pn[i] && func[i]) {
100                                 kvm_read(kv,func[i], buf, sizeof buf);
101                                 buf[sizeof buf -1] = 0;
102                                 pn[i] = strdup(buf);
103                                 for(j=i+1;j<bb.ncounts;j++)
104                                         if (func[j] == func[i]) {
105                                                 pn[j] = pn[i];
106                                                 func[j] = 0;
107                                         }
108                         }
109                         if (!pn[i])
110                                 pn[i] = "-";
111                         if (!fn[i] && file[i]) {
112                                 kvm_read(kv,file[i], buf, sizeof buf);
113                                 buf[sizeof buf -1] = 0;
114                                 fn[i] = strdup(buf);
115                                 for(j=i+1;j<bb.ncounts;j++)
116                                         if (file[j] == file[i]) {
117                                                 fn[j] = fn[i];
118                                                 file[j] = 0;
119                                         }
120                         }
121                         if (!fn[i])
122                                 fn[i] = "-";
123                         l4 = 0;
124                         if (i+1 < bb.ncounts)
125                                 l4 = addr[i+1] - addr[i];
126                         printf("%s %5lu %s %lu %lu %lu %lu\n",
127                                 fn[i], lineno[i], pn[i], addr[i], counts[i], l4, counts[i] * l4);
128                 }
129                 for(i=0;i<bb.ncounts;i++) {
130                         if (func[i] && pn[i]) 
131                                 free(pn[i]);
132                         if (file[i] && fn[i])
133                                 free(fn[i]);
134                         pn[i] = 0;
135                         fn[i] = 0;
136                 }
137         }
138         return 0;
139 }