APPENDIX A The following emulator macros and invocation trace illustrate a complex debugging session. The goal of the macro was to expose the details of every packet passing through a streams engine between Microtec SNX's IP layer and the ethernet driver. The Emulator Macro DEFINE dumpmblk (pMblk,pQueue,direction) mblk_t *pMblk; queue_t *pQueue; int direction; { unsigned char db_type; char *sType; queue_t *otherQ; unsigned long primitive; char *sPrimitive; unsigned long *pUpData; unsigned char *p; $PRINTF "=====================================================" $; db_type = pMblk->b_datap->db_type; sType = "unknown"; if (db_type == 3) /* M_DATA from stream.h */ sType = "M_DATA"; if (db_type == 7) /* M_PROTO */ sType = "M_PROTO"; if (db_type == 20) /* M_PCPROTO */ sType = "M_PCPROTO"; /* this is an inline implementation of the OTHERQ() macro */ if (pQueue->q_flag & 0x0010) otherQ = pQueue + 1; else otherQ = pQueue - 1; /* print queue location, other queue location and db_type of message */ if (direction) $PRINTF "down: queue 0x%x, otherQ 0x%x, type %s(%d)", pQueue, otherQ, sType, db_type $; else $PRINTF "up: queue 0x%x, otherQ 0x%x, type %s(%d)", pQueue, otherQ, sType, db_type $; /* dump contents of message block */ $DUMP pMblk->b_rptr .. pMblk->b_wptr $; /* extract primitive from message */ primitive = *(unsigned long *) (pMblk->b_rptr); sPrimitive = "unknown"; if (primitive == 0) /* DL_INFO_REQ from dlpi.h */ sPrimitive = "DL_INFO_REQ"; if (primitive == 3) /* DL_INFO_ACK */ sPrimitive = "DL_INFO_ACK"; if (primitive == 1) /* DL_BIND_REQ */ sPrimitive = "DL_BIND_REQ"; if (primitive == 4) /* DL_BIND_ACK */ sPrimitive = "DL_BIND_ACK"; if (primitive == 7) /* DL_UNITDATA_REQ */ sPrimitive = "DL_UNITDATA_REQ"; if (primitive == 8) /* DL_UNITDATA_IND */ sPrimitive = "DL_UNITDATA_IND"; $PRINTF "primitive %s(0x%x)", sPrimitive, primitive $; pUpData = (unsigned long *) (pMblk->b_rptr); if (primitive == 8) /* DL_UNITDATA_IND */ { p = pMblk->b_rptr + *(pUpData + 4); /* dl_src_addr_offset */ $PRINTF "src address: %02x:%02x:%02x:%02x:%02x:%02x",p[0],p[1],p[2],p[3],p[4],p[5] $; p = pMblk->b_rptr + *(pUpData + 2); /* dl_dest_addr_offset */ $PRINTF "dest address: %02x:%02x:%02x:%02x:%02x:%02x",p[0],p[1],p[2],p[3],p[4],p[5] $; } if (primitive == 7) /* DL_UNITDATA_REQ */ { p = pMblk->b_rptr + *(pUpData + 2); /* dl_dest_addr_offset */ $PRINTF "dest address: %02x:%02x:%02x:%02x:%02x:%02x",p[0],p[1],p[2],p[3],p[4],p[5] $; } if (primitive == 1) /* DL_BIND_REQ */ { $PRINTF "dl_sap 0x%04x", *(pUpData + 1) $; } while (pMblk = pMblk->b_cont) { $PRINTF "payload: type %d", pMblk->b_datap->db_type $; $DUMP pMblk->b_rptr .. pMblk->b_wptr $; } return (1); /* resume execution */ } The Breakpoints breaki 0x3a116;dumpmblk(@A2,@A3,1) breaki 0x3a190;dumpmblk(@A2,@A3,0) breaki 0x3a9de;dumpmblk(@A2,@A5,0) breaki 0x3a8dc;dumpmblk(@A3,@D3,0) These breakpoint addresses are points in the code where Streams messages are pushed up and down the stream. The Map Excerpt from apbOsAbs68360.o.map: _lg_open 9 00039F36 ethdlpi.o _lg_close 9 0003A03E ethdlpi.o _lg_uwput 9 0003A106 ethdlpi.o _lg_uwsrv 9 0003A1CC ethdlpi.o _lg_rsrv 9 0003A292 ethdlpi.o _lg_init 9 0003A364 ethdlpi.o _lg_INIT 9 0003A3FE ethdlpi.o _lg_dlproto 9 0003A50A ethdlpi.o _lg_dlget 9 0003A936 ethdlpi.o _lg_dlerror 9 0003A9F0 ethdlpi.o _lg_okack 9 0003AA94 ethdlpi.o _lg_ioctl 9 0003AB50 ethdlpi.o _lg_maj_to_board 9 0003AD6C ethdlpi.o _lg_dumpifstats 9 0003AE60 ethdlpi.o _lg_broad 9 0003AE90 ethdlpi.o The Resulting Output ===================================================== down: queue 0xe8d404, otherQ 0xe8d3c4, type M_PROTO(7) 00E56840 00 00 00 01 00 00 08 00 00 00 00 00 00E56850 00 00 00 18 00 00 00 03 00 primitive DL_BIND_REQ(0x1) dl_sap 0x0800 payload: type 3 00E567E0 00 00 00 00 00 00 00 00 00E567F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56820 00 00 00 00 00 00 00 00 00 ===================================================== down: queue 0xe8d404, otherQ 0xe8d3c4, type M_PROTO(7) 00E56840 00 00 00 01 00 00 08 00 00 00 00 00 00E56850 00 00 00 18 00 00 00 03 00 primitive DL_BIND_REQ(0x1) dl_sap 0x0800 payload: type 3 00E567E0 00 00 00 00 00 00 00 00 00E567F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56820 00 00 00 00 00 00 00 00 00 ===================================================== up: queue 0xe8d404, otherQ 0xe8d3c4, type M_PCPROTO(20) 00E551B0 00 00 00 04 00 00 08 00 00 00 00 06 00E551C0 00 00 00 18 00 00 20 00 00 00 08 00 08 00 14 04 00E551D0 00 02 00 primitive DL_BIND_ACK(0x4) ===================================================== down: queue 0xe8d404, otherQ 0xe8d3c4, type M_PROTO(7) 00E54DF0 00 00 00 00 00 primitive DL_INFO_REQ(0x0) ===================================================== up: queue 0xe8d404, otherQ 0xe8d3c4, type M_PCPROTO(20) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ------------------------ 00E58F60 00 00 00 03 00E58F70 00 00 05 DC 00 00 00 3C 00 00 00 06 00 00 00 04 00E58F80 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00E58F90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E58FA0 00 00 00 00 00 00 00 4C 00 00 00 00 00 00 00 00 00E58FB0 00 00 00 00 00 00 00 00 08 00 14 04 00 02 00 primitive DL_INFO_ACK(0x3) ===================================================== down: queue 0xe8d608, otherQ 0xe8d5c8, type M_PROTO(7) 00E567E0 00 00 00 01 00 00 08 06 00E567F0 00 00 00 06 00 00 00 18 00 00 00 03 00 primitive DL_BIND_REQ(0x1) dl_sap 0x0806 payload: type 3 00E56840 00 00 00 00 00 00 00 00 00 00 00 00 00E56850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56860 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E56880 00 00 00 00 00 ..... ===================================================== up: queue 0xe8d608, otherQ 0xe8d5c8, type M_PCPROTO(20) 00E551B0 00 00 00 04 00 00 08 06 00 00 00 06 00E551C0 00 00 00 18 00 00 20 00 00 00 04 00 08 00 14 04 00E551D0 00 02 DC primitive DL_BIND_ACK(0x4) ===================================================== down: queue 0xe8d608, otherQ 0xe8d5c8, type M_PROTO(7) 00E54DF0 00 00 00 00 00 primitive DL_INFO_REQ(0x0) ===================================================== up: queue 0xe8d608, otherQ 0xe8d5c8, type M_PCPROTO(20) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ------------------------ 00E58F60 00 00 00 03 00E58F70 00 00 05 DC 00 00 00 3C 00 00 00 06 00 00 00 04 00E58F80 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00E58F90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E58FA0 00 00 00 00 00 00 00 4C 00 00 00 00 00 00 00 00 00E58FB0 00 00 00 00 00 00 00 00 08 00 14 04 00 02 00 primitive DL_INFO_ACK(0x3) ===================================================== up: queue 0xe8d608, otherQ 0xe8d5c8, type M_PCPROTO(20) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ------------------------ 00E58F60 00 00 00 03 00E58F70 00 00 05 DC 00 00 00 3C 00 00 00 06 00 00 00 04 00E58F80 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00E58F90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00E58FA0 00 00 00 00 00 00 00 4C 00 00 00 00 00 00 00 00 00E58FB0 00 00 00 00 00 00 00 00 08 00 14 04 00 02 00 primitive DL_INFO_ACK(0x3) ===================================================== up: queue 0xe8d3c4, otherQ 0xe8d404, type M_PROTO(7) 00E56840 00 00 00 08 00 00 00 06 00 00 00 18 00E56850 00 00 00 06 00 00 00 1E 00 00 00 00 FF FF FF FF 00E56860 FF FF 08 00 20 0F 0F B3 00 primitive DL_UNITDATA_IND(0x8) src address: 08:00:20:0f:0f:b3 dest address: ff:ff:ff:ff:ff:ff payload: type 3 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ------------------------ 00E5A0C0 45 00 00 AC 3A F9 00 00 3C 11 00E5A0D0 8D EA C0 A8 9A 0C C0 A8 9A 00 02 08 02 08 00 98 00E5A0E0 00 00 02 01 00 00 00 02 00 00 C0 64 04 00 00 00 00E5A0F0 00 00 00 00 00 00 00 00 00 01 00 02 00 00 C0 A8 00E5A100 D2 00 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00E5A110 00 00 C0 A8 97 00 00 00 00 00 00 00 00 00 00 00 00E5A120 00 02 00 02 00 00 C0 A8 98 00 00 00 00 00 00 00 00E5A130 00 00 00 00 00 02 00 02 00 00 C0 A8 99 00 00 00 00E5A140 00 00 00 00 00 00 00 00 00 01 00 02 00 00 C0 A8 00E5A150 9B 00 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00E5A160 00 00 C0 A8 9C 00 00 00 00 00 00 00 00 00 00 00 00E5A170 00 02 00 ... ===================================================== down: queue 0xe8d608, otherQ 0xe8d5c8, type M_PROTO(7) 00E55170 00 00 00 07 00 00 00 06 00E55180 00 00 00 14 00 00 00 02 00 00 FF FF FF FF FF FF 00E55190 FF FF 00 ... primitive DL_UNITDATA_REQ(0x7) dest address: ff:ff:ff:ff:ff:ff payload: type 3 00E55CC0 00 01 08 00 06 04 00 01 00E55CD0 08 00 14 04 00 02 C0 A8 9A 11 00 00 00 00 00 00 00E55CE0 C0 A8 9A 0C 08 E3 F8 3C 20 03 04 00 00 00 00 01 00E55CF0 00 EA 82 CA D1 D5 D5 D5 D6 D6 D6 D6 00 D0 C0 D8 00E55D00 00 33 66 33 00 ===================================================== up: queue 0xe8d5c8, otherQ 0xe8d608, type M_PROTO(7) 00E55C60 00 00 00 08 00 00 00 06 00E55C70 00 00 00 18 00 00 00 06 00 00 00 1E 10 00 3B 11 00E55C80 FF FF FF FF FF FF 08 00 14 04 00 02 14 primitive DL_UNITDATA_IND(0x8) src address: 08:00:14:04:00:02 dest address: ff:ff:ff:ff:ff:ff payload: type 3 00E55180 00 . payload: type 3 00E55CC0 00 01 08 00 06 04 00 01 00E55CD0 08 00 14 04 00 02 C0 A8 9A 11 00 00 00 00 00 00 00E55CE0 C0 A8 9A 0C 08 E3 F8 3C 20 03 04 00 00 00 00 01 00E55CF0 00 EA 82 CA D1 D5 D5 D5 D6 D6 D6 D6 00 D0 C0 D8 00E55D00 00 33 66 33 00 ===================================================== up: queue 0xe8d5c8, otherQ 0xe8d608, type M_PROTO(7) 00E55CC0 00 00 00 08 00 00 00 06 00 00 00 18 00E55CD0 00 00 00 06 00 00 00 1E 9A 11 00 00 08 00 14 04 00E55CE0 00 02 08 00 20 0F 0F B3 20 primitive DL_UNITDATA_IND(0x8) src address: 08:00:20:0f:0f:b3 dest address: 08:00:14:04:00:02 payload: type 3 00E58E40 00 01 08 00 06 04 00 02 08 00 20 0F 0F B3 00E58E50 C0 A8 9A 0C 08 00 14 04 00 02 C0 A8 9A 11 08 E3 00E58E60 F8 3C 20 03 04 00 00 00 00 01 00 EA 82 CA D1 D5 00E58E70 D5 D5 D6 D6 D6 D6 00 D0 C0 D8 00 33 66 33 00 ===================================================== down: queue 0xe8d404, otherQ 0xe8d3c4, type M_PROTO(7) 00E56670 00 00 00 07 00 00 00 06 00E56680 00 00 00 14 00 00 00 3C 00 00 00 00 08 00 20 0F 00E56690 0F B3 41 primitive DL_UNITDATA_REQ(0x7) dest address: 08:00:20:0f:0f:b3 payload: type 3 00E56750 45 00 00 35 00 00 00 00 1E 11 7D 95 00E56760 C0 A8 9A 11 C0 64 04 05 04 00 00 45 00 21 14 C5 00E56770 00 . payload: type 3 00E551B0 00 01 2F 6F 6B 69 73 77 2F 63 6F 6E ../okisw/con 00E551C0 74 2F 6E 6F 6E 65 00 6F 63 74 65 74 00 00 00 00 t/none.octet.... 00E551D0 00 00 00 00 00 ===================================================== up: queue 0xe8d3c4, otherQ 0xe8d404, type M_PROTO(7) 00E56730 00 00 00 08 00 00 00 06 00 00 00 18 00 00 00 06 00E56740 00 00 00 1E 00 02 00 45 08 00 14 04 00 02 08 00 00E56750 20 0F 0F B3 45 primitive DL_UNITDATA_IND(0x8) src address: 08:00:20:0f:0f:b3 dest address: 08:00:14:04:00:02 payload: type 3 00E55CD0 45 00 00 2F 1E B9 00 00 3B 11 41 E2 C0 64 00E55CE0 04 05 C0 A8 9A 11 10 A2 04 00 00 1B 00 00 00 05 00E55CF0 00 01 46 69 6C 65 20 6E 6F 74 20 66 6F 75 6E 64 ..File not found 00E55D00 00 33 ===================================================== up: queue 0xe8d3c4, otherQ 0xe8d404, type M_PROTO(7) 00E55CC0 00 00 00 08 00 00 00 06 00 00 00 18 00E55CD0 00 00 00 06 00 00 00 1E 00 00 3B 11 FF FF FF FF 00E55CE0 FF FF 08 00 20 0F 0F B3 04 primitive DL_UNITDATA_IND(0x8) src address: 08:00:20:0f:0f:b3 dest address: ff:ff:ff:ff:ff:ff payload: type 3 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ------------------------ 00E5A0C0 45 00 00 AC 3A FC 00 00 3C 11 00E5A0D0 8D E7 C0 A8 9A 0C C0 A8 9A 00 02 08 02 08 00 98 00E5A0E0 00 00 02 01 00 00 00 02 00 00 C0 64 04 00 00 00 00E5A0F0 00 00 00 00 00 00 00 00 00 01 00 02 00 00 C0 A8 00E5A100 D2 00 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00E5A110 00 00 C0 A8 97 00 00 00 00 00 00 00 00 00 00 00 00E5A120 00 02 00 02 00 00 C0 A8 98 00 00 00 00 00 00 00 00E5A130 00 00 00 00 00 02 00 02 00 00 C0 A8 99 00 00 00 00E5A140 00 00 00 00 00 00 00 00 00 01 00 02 00 00 C0 A8 00E5A150 9B 00 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00E5A160 00 00 C0 A8 9C 00 00 00 00 00 00 00 00 00 00 00 00E5A170 00 02 00 ... Break # 1 on instr (current instruction address = 000000C2)