|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.