1/******************************************************************************* 2* 3* (c) 1998 by Computone Corporation 4* 5******************************************************************************** 6* 7* 8* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport 9* serial I/O controllers. 10* 11* DESCRIPTION: Interpretive trace dump utility 12* 13*******************************************************************************/ 14 15#include <sys/time.h> 16#include <sys/types.h> 17#include <unistd.h> 18#include <stdio.h> 19#include <signal.h> 20#include <sys/stat.h> 21#include <fcntl.h> 22#include <ctype.h> 23#include "ip2trace.h" 24 25unsigned long namebuf[100]; 26 27struct { 28 int wrap, 29 size, 30 o_strip, 31 o_stuff, 32 strip, 33 stuff; 34 unsigned long buf[1000]; 35} tbuf; 36 37struct sigaction act; 38 39typedef enum { kChar, kInt, kAddr, kHex } eFormat; 40 41int active = 1; 42void quit() { active = 0; } 43 44int main (int argc, char *argv[]) 45{ 46 int fd = open ( "/dev/ip2trace", O_RDONLY ); 47 int cnt, i; 48 unsigned long ts, td; 49 struct timeval timeout; 50 union ip2breadcrumb bc; 51 eFormat fmt = kHex; 52 53 if ( fd < 0 ) 54 { 55 printf ( "Can't open device /dev/ip2trace\n" ); 56 exit ( 1 ); 57 } 58 59 act.sa_handler = quit; 60 /*act.sa_mask = 0;*/ 61 sigemptyset(&act.sa_mask); 62 act.sa_flags = 0; 63 act.sa_restorer = NULL; 64 65 sigaction ( SIGTERM, &act, NULL ); 66 67 ioctl ( fd, 1, namebuf ); 68 69 printf ( "iiSendPendingMail %p\n", namebuf[0] ); 70 printf ( "i2InitChannels %p\n", namebuf[1] ); 71 printf ( "i2QueueNeeds %p\n", namebuf[2] ); 72 printf ( "i2QueueCommands %p\n", namebuf[3] ); 73 printf ( "i2GetStatus %p\n", namebuf[4] ); 74 printf ( "i2Input %p\n", namebuf[5] ); 75 printf ( "i2InputFlush %p\n", namebuf[6] ); 76 printf ( "i2Output %p\n", namebuf[7] ); 77 printf ( "i2FlushOutput %p\n", namebuf[8] ); 78 printf ( "i2DrainWakeup %p\n", namebuf[9] ); 79 printf ( "i2DrainOutput %p\n", namebuf[10] ); 80 printf ( "i2OutputFree %p\n", namebuf[11] ); 81 printf ( "i2StripFifo %p\n", namebuf[12] ); 82 printf ( "i2StuffFifoBypass %p\n", namebuf[13] ); 83 printf ( "i2StuffFifoFlow %p\n", namebuf[14] ); 84 printf ( "i2StuffFifoInline %p\n", namebuf[15] ); 85 printf ( "i2ServiceBoard %p\n", namebuf[16] ); 86 printf ( "serviceOutgoingFifo %p\n", namebuf[17] ); 87 printf ( "ip2_init %p\n", namebuf[18] ); 88 printf ( "ip2_init_board %p\n", namebuf[19] ); 89 printf ( "find_eisa_board %p\n", namebuf[20] ); 90 printf ( "set_irq %p\n", namebuf[21] ); 91 printf ( "ex_details %p\n", namebuf[22] ); 92 printf ( "ip2_interrupt %p\n", namebuf[23] ); 93 printf ( "ip2_poll %p\n", namebuf[24] ); 94 printf ( "service_all_boards %p\n", namebuf[25] ); 95 printf ( "do_input %p\n", namebuf[27] ); 96 printf ( "do_status %p\n", namebuf[26] ); 97 printf ( "open_sanity_check %p\n", namebuf[27] ); 98 printf ( "open_block_til_ready %p\n", namebuf[28] ); 99 printf ( "ip2_open %p\n", namebuf[29] ); 100 printf ( "ip2_close %p\n", namebuf[30] ); 101 printf ( "ip2_hangup %p\n", namebuf[31] ); 102 printf ( "ip2_write %p\n", namebuf[32] ); 103 printf ( "ip2_putchar %p\n", namebuf[33] ); 104 printf ( "ip2_flush_chars %p\n", namebuf[34] ); 105 printf ( "ip2_write_room %p\n", namebuf[35] ); 106 printf ( "ip2_chars_in_buf %p\n", namebuf[36] ); 107 printf ( "ip2_flush_buffer %p\n", namebuf[37] ); 108 //printf ( "ip2_wait_until_sent %p\n", namebuf[38] ); 109 printf ( "ip2_throttle %p\n", namebuf[39] ); 110 printf ( "ip2_unthrottle %p\n", namebuf[40] ); 111 printf ( "ip2_ioctl %p\n", namebuf[41] ); 112 printf ( "get_modem_info %p\n", namebuf[42] ); 113 printf ( "set_modem_info %p\n", namebuf[43] ); 114 printf ( "get_serial_info %p\n", namebuf[44] ); 115 printf ( "set_serial_info %p\n", namebuf[45] ); 116 printf ( "ip2_set_termios %p\n", namebuf[46] ); 117 printf ( "ip2_set_line_discipline %p\n", namebuf[47] ); 118 printf ( "set_line_characteristics %p\n", namebuf[48] ); 119 120 printf("\n-------------------------\n"); 121 printf("Start of trace\n"); 122 123 while ( active ) { 124 cnt = read ( fd, &tbuf, sizeof tbuf ); 125 126 if ( cnt ) { 127 if ( tbuf.wrap ) { 128 printf ( "\nTrace buffer: wrap=%d, strip=%d, stuff=%d\n", 129 tbuf.wrap, tbuf.strip, tbuf.stuff ); 130 } 131 for ( i = 0, bc.value = 0; i < cnt; ++i ) { 132 if ( !bc.hdr.codes ) { 133 td = tbuf.buf[i] - ts; 134 ts = tbuf.buf[i++]; 135 bc.value = tbuf.buf[i]; 136 137 printf ( "\n(%d) Port %3d ", ts, bc.hdr.port ); 138 139 fmt = kHex; 140 141 switch ( bc.hdr.cat ) 142 { 143 case ITRC_INIT: 144 printf ( "Init %d: ", bc.hdr.label ); 145 break; 146 147 case ITRC_OPEN: 148 printf ( "Open %d: ", bc.hdr.label ); 149 break; 150 151 case ITRC_CLOSE: 152 printf ( "Close %d: ", bc.hdr.label ); 153 break; 154 155 case ITRC_DRAIN: 156 printf ( "Drain %d: ", bc.hdr.label ); 157 fmt = kInt; 158 break; 159 160 case ITRC_IOCTL: 161 printf ( "Ioctl %d: ", bc.hdr.label ); 162 break; 163 164 case ITRC_FLUSH: 165 printf ( "Flush %d: ", bc.hdr.label ); 166 break; 167 168 case ITRC_STATUS: 169 printf ( "GetS %d: ", bc.hdr.label ); 170 break; 171 172 case ITRC_HANGUP: 173 printf ( "Hangup %d: ", bc.hdr.label ); 174 break; 175 176 case ITRC_INTR: 177 printf ( "*Intr %d: ", bc.hdr.label ); 178 break; 179 180 case ITRC_SFLOW: 181 printf ( "SFlow %d: ", bc.hdr.label ); 182 fmt = kInt; 183 break; 184 185 case ITRC_SBCMD: 186 printf ( "Bypass CMD %d: ", bc.hdr.label ); 187 fmt = kInt; 188 break; 189 190 case ITRC_SICMD: 191 printf ( "Inline CMD %d: ", bc.hdr.label ); 192 fmt = kInt; 193 break; 194 195 case ITRC_MODEM: 196 printf ( "Modem %d: ", bc.hdr.label ); 197 break; 198 199 case ITRC_INPUT: 200 printf ( "Input %d: ", bc.hdr.label ); 201 break; 202 203 case ITRC_OUTPUT: 204 printf ( "Output %d: ", bc.hdr.label ); 205 fmt = kInt; 206 break; 207 208 case ITRC_PUTC: 209 printf ( "Put char %d: ", bc.hdr.label ); 210 fmt = kChar; 211 break; 212 213 case ITRC_QUEUE: 214 printf ( "Queue CMD %d: ", bc.hdr.label ); 215 fmt = kInt; 216 break; 217 218 case ITRC_STFLW: 219 printf ( "Stat Flow %d: ", bc.hdr.label ); 220 fmt = kInt; 221 break; 222 223 case ITRC_SFIFO: 224 printf ( "SFifo %d: ", bc.hdr.label ); 225 break; 226 227 case ITRC_VERIFY: 228 printf ( "Verfy %d: ", bc.hdr.label ); 229 fmt = kHex; 230 break; 231 232 case ITRC_WRITE: 233 printf ( "Write %d: ", bc.hdr.label ); 234 fmt = kChar; 235 break; 236 237 case ITRC_ERROR: 238 printf ( "ERROR %d: ", bc.hdr.label ); 239 fmt = kInt; 240 break; 241 242 default: 243 printf ( "%08x ", tbuf.buf[i] ); 244 break; 245 } 246 } 247 else 248 { 249 --bc.hdr.codes; 250 switch ( fmt ) 251 { 252 case kChar: 253 printf ( "%c (0x%02x) ", 254 isprint ( tbuf.buf[i] ) ? tbuf.buf[i] : '.', tbuf.buf[i] ); 255 break; 256 case kInt: 257 printf ( "%d ", tbuf.buf[i] ); 258 break; 259 260 case kAddr: 261 case kHex: 262 printf ( "0x%x ", tbuf.buf[i] ); 263 break; 264 } 265 } 266 } 267 } 268 fflush ( stdout ); 269 timeout.tv_sec = 0; 270 timeout.tv_usec = 250; 271 select ( 0, NULL, NULL, NULL, &timeout ); 272 273 } 274 printf("\n-------------------------\n"); 275 printf("End of trace\n"); 276 277 close ( fd ); 278} 279 280