1:
2: /*
3: * Hyperchannel Log Printer
4: *
5: * Copyright (c) 1983, Tektronix Inc.
6: * All Rights Reserved
7: *
8: */
9:
10:
11: char _rcsid[] = "$Header: hylog.c,v 2.5 84/10/10 04:42:56 steveg Exp $$Locker: $";
12:
13: #define ok(x) (((int)(x)) & 0x7fffffff)
14: #define HYLOG
15:
16: #include <stdio.h>
17: #include <nlist.h>
18: #include <sys/types.h>
19: #include <sys/socket.h>
20: #include <sys/ioctl.h>
21: #include <netinet/in.h>
22: #include <net/if.h>
23: #include <vaxif/if_hyreg.h>
24: #include <vaxif/if_hy.h>
25:
26: struct nlist nl[2] = {
27: { "_hy_log" },
28: { 0 }
29: };
30:
31: struct hy_log hy_log;
32:
33: char *kernel = "/vmunix";
34: char *kmem = "/dev/kmem";
35:
36: main(argc, argv)
37: int argc;
38: char *argv[];
39: {
40: register unsigned char *p, *ep;
41: register unsigned len;
42: int mem;
43:
44: if (argc > 1)
45: kernel = argv[1];
46: if (argc > 2)
47: kmem = argv[2];
48: nlist(kernel, nl);
49: if (nl[0].n_type == 0)
50: done("No namelist\n");
51: if ((mem = open(kmem, 0)) < 0)
52: done("Can't open \"/dev/kmem\" file\n");
53: lseek(mem, (long)nl[0].n_value, 0);
54: read(mem, &hy_log, sizeof(hy_log));
55: if (ok(hy_log.hyl_self) != ok(nl[0].n_value))
56: done("hy_log.hyl_self not self referencing (namelist mismatch?)\n");
57: ep = &hy_log.hyl_buf[ok(hy_log.hyl_ptr) -
58: ok(& ( (struct hy_log *) (nl[0].n_value) )->hyl_buf[0])];
59: p = &hy_log.hyl_buf[0];
60:
61: printf("%d bytes in log buffer\n", ep - p);
62:
63: #define plong(name) \
64: printf(" %s %08lx", name, *(unsigned long *)p); \
65: p += sizeof(unsigned long);
66:
67: #define pnlong(name) \
68: printf(" %s %02x%02x%02x%02x", name, p[0], p[1], p[2], p[3]); \
69: p += sizeof(unsigned long);
70:
71: #define pnshort(name) \
72: printf(" %s %02x%02x", name, p[0], p[1]); \
73: p += sizeof(unsigned short);
74:
75: #define pshort(name) \
76: printf(" %s %04x", name, *(unsigned short *)p); \
77: p += sizeof(unsigned short);
78:
79: #define pbyte(name) printf(" %s %02x", name, *p++);
80:
81: #define phdr() \
82: pnshort("crtl"); \
83: pnshort("access"); \
84: putchar('\n'); \
85: putchar('\t'); \
86: pnshort("to"); \
87: pnshort("from"); \
88: pnshort("param"); \
89: pbyte("type"); \
90: pbyte("off");
91:
92: while (p < ep) {
93: switch(*p++) {
94: case HYL_NOP:
95: printf("nop -\n");
96: goto out;
97:
98: case HYL_UP: /* no data */
99: printf("up -");
100: goto printdata;
101:
102: case HYL_STATUS:
103: printf("status -");
104: goto printdata;
105:
106: case HYL_STATISTICS:
107: printf("statistics -");
108: if (*p != sizeof(struct hy_stat))
109: goto printdata;
110: p++;
111: pnlong("msgcnt"); pnlong("dbcnt");
112: pnlong("tbusy"); pnlong("hwret");
113: putchar('\n');
114: putchar('\t');
115: pnlong("crcbad"); pnlong("mcret"); pnlong("tdabort");
116: pbyte("atype");
117: pbyte("");
118: pbyte("rev");
119: pbyte("address");
120: break;
121:
122: case HYL_XMIT:
123: printf("xmt -");
124: if (*p != (sizeof(struct hy_hdr) + sizeof(short)))
125: goto printdata;
126: p++;
127: pshort("mplen");
128: phdr();
129: break;
130:
131: case HYL_RECV:
132: printf("rcv -");
133: if (*p != (sizeof(struct hy_hdr) + sizeof(short)))
134: goto printdata;
135: p++;
136: pshort("length");
137: phdr();
138: break;
139:
140: case HYL_CMD:
141: printf("cmd -");
142: if (*p != 4)
143: goto printdata;
144: p++;
145: pbyte("cmd");
146: pbyte("state");
147: pshort("count");
148: break;
149:
150: case HYL_INT:
151: printf("int -");
152: if (*p == 4) {
153: p++;
154: pshort("csr");
155: pshort("wcr");
156: } else if (*p == 6) {
157: p++;
158: pbyte("state");
159: pbyte("flags");
160: pshort("csr");
161: pshort("wcr");
162: } else
163: goto printdata;
164: break;
165:
166: default:
167: printf("unknown %d -", *p);
168: printdata:
169: len = *p++;
170: while (len > 0) {
171: printf(" %02x", *p++);
172: len--;
173: }
174: break;
175: }
176: putchar('\n');
177: }
178:
179: out:
180: printf("end of log\n");
181: }
182:
183: done(s, p)
184: char *s;
185: int p;
186: {
187: fprintf(stderr, s, &p);
188: exit(1);
189: }
Defined functions
done
defined in line
183; used 3 times
main
defined in line
36;
never used
Defined variables
kmem
defined in line
34; used 2 times
nl
defined in line
26; used 5 times
Defined macros
HYLOG
defined in line
14;
never used
ok
defined in line
13; used 4 times
pbyte
defined in line
79; used 10 times
phdr
defined in line
81; used 2 times
plong
defined in line
63;
never used