|
|
/*----------------------------------------------------------------------------
| debuger.c - |----------------------------------------------------------------------------*/ #include "precomp.h"
void read_in_queue(char *str); void reset_box(void); void reset_port(void); void reset_modem(void); void dump_driver(void); void dump_mem(UCHAR *ptr, ULONG len); void dump_net(void); void send_str(char *str); void dump_ext1(void); void no_port_message(void); #ifdef S_VS
void eth_test_pkt(void); void dump_box(int index); void dump_nic(int index); int read_trace_queue(PortMan *pm); int write_remote_cmd(PortMan *pm, char *cmd); #endif
#define TraceStr(s) GTrace(D_L10, sz_modid, s)
#define TraceErr(s) GTrace(D_Error, sz_modid_err, s)
#define TraceC(c) GMark(c,10)
static char *sz_modid = {"deb"}; static char *sz_modid_err = {"Error,deb"};
// following used to restrict to one pending debug packet to box
static int pending_debug_packet = 0;
/*----------------------------------------------------------------------------
| do_cmd_line - complete line entered, handle command line interpreter. |----------------------------------------------------------------------------*/ void do_cmd_line(char *line) { char *s = line; int i, j, k; char cmd[20]; // buffer for command only, not for params
//char str2[20];
ULONG dnums[5]; PSERIAL_DEVICE_EXTENSION ext;
i = strlen(s); if (i==0) return;
if (s[i-1] == 0xd) { s[i-1] = 0; if (i == 0) deb_printf("\x0d\x0a:"); }
while ((*s == ' ') || (*s == 0xa)) ++s; if (*s == 0) { deb_printf("\x0d\x0a:"); return; }
deb_printf(":%s\x0d\x0a", s); // echo cmd line
i = 0; while ((*s != ' ') && (*s != 0) && (*s != ',') && (i < 8)) { cmd[i++] = (char)my_toupper(*s); ++s; } cmd[i] = 0;
while (*s == ' ') ++s;
dnums[0] = 0; dnums[1] = 0; dnums[2] = 0; i = getnumbers(s, (long *)dnums, 4, 1); // get max of 4 hex dword numbers
Driver.DebugTimeOut = 1000; // about 600 second seconds timeout
switch (cmd[0]) { case 'B': // b - box selection to debug
#ifdef S_VS
#if 0
if (*s != 0) { write_remote_cmd(&Driver.pm[0], s); } else { read_trace_queue(&Driver.pm[0]); } #endif
#endif
break;
case 'D': // d - dump memory
getstr(cmd, s, &j, 16); if (my_lstricmp(cmd, "ext") == 0) dump_mem((UCHAR *)Driver.DebugExt, sizeof(*Driver.DebugExt)); // dump memory
else if (my_lstricmp(cmd, "RxBuf") == 0) { k = Driver.DebugExt->RxQ.QPut; dump_mem((UCHAR *)&Driver.DebugExt->RxQ.QBase[0], 0x200); // dump memory
} else if (my_lstricmp(cmd, "port") == 0) { #ifdef S_VS
dump_mem((UCHAR *)Driver.DebugExt->Port, sizeof(*Driver.DebugExt->Port)); // dump memory
#else
dump_mem((UCHAR *)Driver.DebugExt->ChP, sizeof(*Driver.DebugExt->ChP)); // dump memory
#endif
} else if (my_lstricmp(cmd, "driver") == 0) { dump_driver(); } else if (i == 1) // 1 number
dump_mem((UCHAR *)dnums[0], 0x100); // dump memory
break;
case 'E': // EXIT
if (my_lstricmp(cmd, "EXIT") == 0) debug_all_off(); break;
case 'I': // iw
if (cmd[1] == 'W') { dnums[1] = READ_PORT_USHORT((PUSHORT) dnums[0]); deb_printf("iw[%x] = %x\n", dnums[0], dnums[1]); } else if (cmd[1] == ' ') { dnums[1] = READ_PORT_UCHAR((PUCHAR) dnums[0]); deb_printf("i[%x] = %x\n", dnums[0], dnums[1]); }
case 'L': // L
Driver.load_testing = dnums[0]; deb_printf("test load = %d\n", Driver.load_testing); break;
case 'M': // M
if (my_lstricmp(cmd, "M") == 0) // MON {RX | TX | EV}
{ Driver.GTraceFlags = D_Error; debug_all_off(); break; }
if (my_lstricmp(cmd, "MONG") == 0) // MONG {0,1,2,3,4...}
{ if (dnums[0] == 0) Driver.GTraceFlags = D_Error | D_Init; else Driver.GTraceFlags |= (1 << dnums[0]); break; }
if (Driver.DebugExt == NULL) { no_port_message(); break; }
if (my_lstricmp(cmd, "MON") == 0) // MON {RX | TX | EV}
{
getstr(cmd, s, &j, 16); if (my_lstricmp(cmd, "rx") == 0) { Driver.DebugExt->TraceOptions |= 2; Driver.TraceOptions |= 2; } else if (my_lstricmp(cmd, "off") == 0) { Driver.DebugExt->TraceOptions = 0; Driver.TraceOptions = 0; } else if (my_lstricmp(cmd, "tx") == 0) { Driver.DebugExt->TraceOptions |= 4; Driver.TraceOptions |= 4; } else if (my_lstricmp(cmd, "ev") == 0) { Driver.DebugExt->TraceOptions |= 1; Driver.TraceOptions |= 1; } else if (my_lstricmp(cmd, "irq") == 0) { Driver.DebugExt->TraceOptions |= 8; Driver.TraceOptions |= 8; } } break;
#ifdef S_VS
case 'N': // Net
dump_net(); break; #endif
case 'O': if (cmd[1] == 'D') { WRITE_PORT_ULONG((PULONG) dnums[0], (ULONG) dnums[1]); deb_printf("od[%x] = %x\n", dnums[0], dnums[1]); } else if (cmd[1] == 'W') { WRITE_PORT_USHORT((PUSHORT) dnums[0], (USHORT) dnums[1]); deb_printf("ow[%x] = %x\n", dnums[0], dnums[1]); } else if (cmd[1] == ' ') { WRITE_PORT_UCHAR((PUCHAR) dnums[0], (UCHAR) dnums[1]); deb_printf("o[%x] = %x\n", dnums[0], dnums[1]); } break;
case 'P': // PORT name
debug_all_off();
getstr(cmd, s, &j, 10); deb_printf("Port - %s\n", cmd);
ext = find_ext_by_name(cmd, NULL); Driver.DebugExt = ext; if (ext != NULL) deb_printf("Found port.\n"); else deb_printf("Not Found!!!\n"); break;
case 'R': // RESET PORT
if (Driver.DebugExt == NULL) { no_port_message(); break; }
if (my_lstricmp(cmd, "RESET") == 0) { getstr(cmd, s, &j, 16); if (my_lstricmp(cmd, "port") == 0) reset_port();
if (my_lstricmp(cmd, "modem") == 0) reset_modem();
#ifdef S_VS
if (my_lstricmp(cmd, "box") == 0) reset_box(); #endif
} break;
case 'S': // STAT
#ifdef S_VS
if (my_lstricmp(cmd, "SENDE") == 0) { eth_test_pkt(); break; } #endif
if (Driver.DebugExt == NULL) { no_port_message(); break; }
if (my_lstricmp(cmd, "STAT") == 0) { deb_printf("--stats--\n"); dump_ext1(); } else if (my_lstricmp(cmd, "SEND") == 0) { send_str(s); } break;
#ifdef COMMENT_OUT
case 'T': // timer
if (my_lstricmp(cmd, "timer") == 0) { LARGE_INTEGER t1,t2; our_assert(123, 0); t1 = KeQueryPerformanceCounter(NULL); deb_printf("Low:%x High:%x\n", Driver.PollIntervalTime.LowPart, Driver.PollIntervalTime.HighPart); t2 = KeQueryPerformanceCounter(NULL); deb_printf("L2:%x L1:%x H2:%x H1:%x\n", t2.LowPart, t1.LowPart, t2.HighPart, t1.HighPart); } break; #endif
default: deb_printf("Driver Version:%s\n", VER_PRODUCTVERSION_STR); deb_printf("? - This help.\n"); deb_printf("PORT COM# - set the port to work on.\n"); deb_printf("D {ext | chp | rxbuf | driver} - Dump structure.\n"); deb_printf("STAT - Dump key info.\n"); deb_printf("SEND string - Send string out port.\n"); #ifdef S_VS
//deb_printf("SENDE - Send a test ethernet pkt.\n");
//deb_printf("RESET {PORT | BOX} - Reset Port or device.\n");
#endif
deb_printf("M - Turn event/data monitor off.\n"); #ifdef S_VS
deb_printf("NET - Dump network statistics.\n"); #endif
deb_printf("MON {EV | TX | RX} - monitor events, rx-data or tx-data\n"); #ifdef S_VS
deb_printf("MONG {0,1,...10} - monitor stack 1=nic 3=hdlc 5=port\n"); deb_printf("RESET modem - Reset VS2000 modem(on selected port).\n"); #endif
break; }
deb_printf("\x0d\x0a:"); }
#ifdef S_VS
/*----------------------------------------------------------------------------
| eth_test_pkt - |----------------------------------------------------------------------------*/ void eth_test_pkt(void) { BYTE buf[80]; int stat, len; static BYTE cnt; Nic *nic;
nic = Driver.board_ext->pm->nic; if (nic == NULL) { Tprintf("Null Nic!"); return; } len = 64; //memset(&buf[0], 0xff, 6);
memcpy(&buf[0], Driver.board_ext->hd->dest_addr, 6); memcpy(&buf[6], nic->address, 6); // our addr
// BYTE 12-13: Comtrol PCI ID (11H, FEH), Ethernet Len field
*((WORD *)&buf[12]) = 0xfe11;
buf[14] = ASYNC_PRODUCT_HEADER_ID; // comtrol packet type = driver management, any product.
buf[15] = 0; // conc. index field
buf[16] = 1; // admin
*((WORD *)&buf[17]) = len; buf[19] = 0x70; // ADMIN packet type, 1=boot-loader, 3=id-reply
buf[20] = cnt++;
stat = nic_send_pkt(nic, buf, len); if (stat) { deb_printf("Error sending.\x0d\x0a:"); } else deb_printf("Sent.\x0d\x0a:"); } #endif
/*----------------------------------------------------------------------------
| bad_cmd_message - |----------------------------------------------------------------------------*/ void bad_cmd_message(void) { deb_printf("Unknown command!"); }
/*----------------------------------------------------------------------------
| no_port_message - |----------------------------------------------------------------------------*/ void no_port_message(void) { deb_printf("Use PORT com# to setup a port to monitor!"); }
/*----------------------------------------------------------------------------
| read_in_queue - |----------------------------------------------------------------------------*/ void read_in_queue(char *str) { int j,k; PSERIAL_DEVICE_EXTENSION ext;
ext = Driver.DebugExt;
k = getint(str, &j); if (j==0) // got a number
{ // dump_mem(UCHAR *ptr, ULONG len);
deb_printf("read %d!\n", k); } }
/*----------------------------------------------------------------------------
| debug_poll - used to timeout inactive debug session and turn off any | tracing which might be active. Called roughly every 6 seconds. |----------------------------------------------------------------------------*/ void debug_poll(void) { if (Driver.DebugTimeOut == 0) // used to timeout inactive debug sessions.
return; --Driver.DebugTimeOut;
if (Driver.DebugTimeOut == 0) // used to timeout inactive debug sessions.
{ debug_all_off(); } }
/*----------------------------------------------------------------------------
| debug_all_off - |----------------------------------------------------------------------------*/ void debug_all_off(void) { #ifdef S_VS
int Dev; #endif
PSERIAL_DEVICE_EXTENSION ext; PSERIAL_DEVICE_EXTENSION board_ext;
// Driver.DebugExt = NULL;
Driver.TraceOptions = 0;
board_ext = Driver.board_ext; while (board_ext) { ext = board_ext->port_ext; while (ext) { ext->TraceOptions = 0; ext = ext->port_ext; // next in chain
} // while port extension
board_ext = board_ext->board_ext; } // while board extension
}
#ifdef S_VS
/*----------------------------------------------------------------------------
| reset_box - |----------------------------------------------------------------------------*/ void reset_box(void) { PSERIAL_DEVICE_EXTENSION ext;
ext = Driver.board_ext; while (ext) { ext->pm->state = ST_INIT; ext = ext->board_ext; } } #endif
/*----------------------------------------------------------------------------
| reset_modem - Reset Port Modem Hardware |----------------------------------------------------------------------------*/ void reset_modem(void) { PSERIAL_DEVICE_EXTENSION ext = Driver.DebugExt;
if (ext == NULL) return;
#ifdef S_VS
pModemReset(ext->Port); #endif
}
/*----------------------------------------------------------------------------
| reset_port - Reset Port Hardware(assume modem on with RTS/CTS flow ctrl) |----------------------------------------------------------------------------*/ void reset_port(void) { PSERIAL_DEVICE_EXTENSION ext = Driver.DebugExt;
if (ext == NULL) return;
#ifndef S_VS
sFlushTxFIFO(ext->ChP); sFlushRxFIFO(ext->ChP);
// Disable all Tx and Rx functions
sDisTransmit(ext->ChP); sDisRxFIFO(ext->ChP); sDisRTSFlowCtl(ext->ChP); sDisCTSFlowCtl(ext->ChP); sDisRTSToggle(ext->ChP); sClrBreak(ext->ChP);
// Drop the modem outputs
// Takes care of DTR flow control as well
sClrRTS(ext->ChP); sClrDTR(ext->ChP);
//---- wait, give time for user to see this reset
time_stall(10); // wait 1 second
ProgramBaudRate(ext, ext->BaudRate);
// Enable Rx, Tx and interrupts for the channel
sEnRxFIFO(ext->ChP); // Enable Rx
sEnTransmit(ext->ChP); // Enable Tx
sSetRxTrigger(ext->ChP,TRIG_1); // always trigger
sEnInterrupts(ext->ChP, ext->IntEnables); // allow interrupts
sEnRTSFlowCtl(ext->ChP); sEnCTSFlowCtl(ext->ChP); sSetDTR(ext->ChP); #endif
}
/*----------------------------------------------------------------------------
| send_str - Dump extension data |----------------------------------------------------------------------------*/ void send_str(char *str) { PSERIAL_DEVICE_EXTENSION ext = Driver.DebugExt; ULONG i;
if (ext == NULL) return;
strcat(str, "\x0d\x0a"); // modems like CR,LF
#ifdef S_VS
i = q_put(&ext->Port->QOut, str, strlen(str)); #else
i = sWriteTxBlk(ext->ChP, str, strlen(str)); #endif
deb_printf("%d bytes sent\n", i); }
/*----------------------------------------------------------------------------
| dump_driver - Dump driver status |----------------------------------------------------------------------------*/ void dump_driver(void) { deb_printf("DRIVER, PollCnt:%d, PollStop:%d\n", Driver.PollCnt, Driver.Stop_Poll);
deb_printf(" MemAlloced:%d\n", Driver.mem_alloced);
#ifdef S_VS
deb_printf(" Tick100usBase:%d\n", Driver.Tick100usBase); #endif
}
#ifdef S_VS
/*----------------------------------------------------------------------------
| dump_box - Dump box status |----------------------------------------------------------------------------*/ void dump_box(int index) { PortMan *pm; Hdlc *hd; int i; PSERIAL_DEVICE_EXTENSION ext;
i = 0; ext = Driver.board_ext; while (ext != NULL) { if ((index == i) || (index == 10000)) { pm = ext->pm; hd = ext->hd; deb_printf("BOX, Index:%d, Nic:%d Ports:%d\n", i, pm->nic_index, pm->num_ports);
if(pm->backup_server) deb_printf(" Backup Server: Timeout:%d min Current Time:%d min/%d tic\n", pm->backup_timer, (pm->load_timer/6000), pm->load_timer); else deb_printf(" Designated as Primary Server\n");
deb_printf(" State:%s Reload Errors:%d Timer:%d\n", port_state_str[pm->state], pm->reload_errors, pm->state_timer);
deb_printf(" MAC:%x %x %x %x %x %x\n", hd->dest_addr[0], hd->dest_addr[1], hd->dest_addr[2], hd->dest_addr[3], hd->dest_addr[4], hd->dest_addr[5]);
deb_printf("Hdlc Status:\n"); //----- circular que of outgoing data packets
#if DBG
deb_printf(" qout.QBase:%x", hd->qout.QBase); // our packet buffer circular queue
deb_printf(" Pkt Cnt:%d Put:%d Get:%d\n", q_count(&hd->qout), hd->qout.QPut, hd->qout.QGet); #endif
deb_printf(" Pkt Sends:%d ReSends:%d", hd->iframes_sent, hd->iframes_resent); deb_printf(" Timeouts, RAck:%d SAck:%d", hd->rec_ack_timeouts, hd->send_ack_timeouts);
deb_printf(" status:%x\n", hd->status); #if DBG
deb_printf(" HDLC: V(s):%x V(r):%x NextIn:%x\n", hd->out_snd_index, hd->in_ack_index, hd->next_in_index); deb_printf(" UnAcked:%x TxAckTimer:%x RxAckTimer:%x\n", hd->unacked_pkts, hd->sender_ack_timer, hd->rec_ack_timer); #endif
deb_printf(" Window pkt size:%d\n", hd->pkt_window_size); deb_printf(" Errors OurOfSeq:%d\n", hd->iframes_outofseq); deb_printf("\n"); } ext = ext->board_ext; // next one
++i; } }
/*----------------------------------------------------------------------------
| dump_nic - Dump nic status |----------------------------------------------------------------------------*/ void dump_nic(int index) { Nic *nic; int i;
for (i=0; i<VS1000_MAX_NICS; i++) { if ((index == i) || (index == 10000)) { if (Driver.nics[i].Open) { nic = &Driver.nics[i]; deb_printf("NIC, Name[%d]=%s\n",i, nic->NicName);
deb_printf(" MAC:%x %x %x %x %x %x\n", nic->address[0],nic->address[1],nic->address[2], nic->address[3],nic->address[4],nic->address[5]);
deb_printf(" Packets Rcvd: Ours:%d NotOurs:%d Pend:%d NonPend:%d", nic->pkt_rcvd_ours, nic->pkt_rcvd_not_ours, nic->RxPendingMoves, nic->RxNonPendingMoves);
deb_printf(" OvrFlows:%d Rcvd Bytes:%d\n", nic->pkt_overflows, nic->rec_bytes);
deb_printf(" Packets Sent: Pkts:%d Bytes:%d\n", nic->pkt_sent, nic->send_bytes); } // open
deb_printf("\n"); } } }
/*----------------------------------------------------------------------------
| dump_net - Dump network status |----------------------------------------------------------------------------*/ void dump_net(void) { PSERIAL_DEVICE_EXTENSION ext = Driver.board_ext; int num_devs = 0;
while (ext != NULL) { #if DBG
//write_device_options(ext);
#endif
ext = ext->board_ext; ++num_devs; } deb_printf("ScanRate:%d, Base:%d\n", Driver.ScanRate, Driver.Tick100usBase);
deb_printf("----Num Devices:%d\n", num_devs);
deb_printf(" threadHandle: %x, threadCount:%d\n", Driver.threadHandle, Driver.threadCount); dump_nic(10000); // dump all nic card data;
dump_box(10000); // dump all box data;
} #endif
/*----------------------------------------------------------------------------
| dump_ext1 - Dump extension data |----------------------------------------------------------------------------*/ void dump_ext1(void) { // int i;
PSERIAL_DEVICE_EXTENSION ext = Driver.DebugExt;
if (ext == NULL) return;
deb_printf("%s, BaudRate:%d Open:%d\n", ext->SymbolicLinkName, ext->BaudRate, ext->DeviceIsOpen); if (ext->port_config->LockBaud != 0) deb_printf(" LockBaud:%d\n", ext->port_config->LockBaud);
deb_printf("ModemStatus:%xH DTRRTS:%xH\n", ext->ModemStatus, ext->DTRRTSStatus);
#ifdef NEW_Q
{ #ifdef S_VS
LONG tx_remote; #endif
LONG rx_buf = 0; if (ext->DeviceIsOpen) rx_buf = q_count(&ext->RxQ); #ifdef S_VS
tx_remote = PortGetTxCntRemote(ext->Port); deb_printf("IRP TxCnt:%d TxBufCnt:%d TxRemoteCnt:%d BufRxCnt:%d\n", ext->TotalCharsQueued, PortGetTxCnt(ext->Port), tx_remote, rx_buf); deb_printf(" (nPutRemote:%d, nGetRemote:%d, nGetLocal:%d)\n", ext->Port->nPutRemote, ext->Port->nGetRemote, ext->Port->nGetLocal); #else
deb_printf("TxIRP_Cnt:%d TxBoardCnt:%d RxBufCnt:%d RxBoardCnt:%d\n", ext->TotalCharsQueued, sGetTxCnt(ext->ChP), rx_buf, sGetRxCnt(ext->ChP)); #endif
}
#else
// old-q-tracking code.....
deb_printf("RxPut:%d RxGet:%d RxSize:%d RxBufAddr:%xH\n", ext->RxQ.QPut, ext->RxQ.QGet, ext->RxQ.QSize, ext->RxQ.QBase);
#ifndef S_VS
deb_printf("BoardTxCnt:%d BoardRxCnt:%d\n", sGetTxCnt(ext->ChP), sGetRxCnt(ext->ChP)); #endif
#endif
deb_printf("Stats - RxTot:%u TxTot:%u\n", ext->OurStats.ReceivedCount, ext->OurStats.TransmittedCount);
deb_printf("Errors - Parity:%d Frame:%d Buf Overflow:%d Hardware Overflow:%d\n", ext->OurStats.ParityErrorCount, ext->OurStats.FrameErrorCount, ext->OurStats.BufferOverrunErrorCount, ext->OurStats.SerialOverrunErrorCount);
deb_printf("Stats - Writes:%u Reads:%u\n", ext->sent_packets, ext->rec_packets);
deb_printf("IRPs -"); //------
if ( (!IsListEmpty(&ext->WriteQueue)) // no queued up output data
|| (ext->CurrentWriteIrp) ) deb_printf("WrIRP:"); if (!IsListEmpty(&ext->WriteQueue)) // no queued up output data
deb_printf("Q"); if (ext->CurrentWriteIrp) deb_printf("C");
//------
if ( (!IsListEmpty(&ext->ReadQueue)) // no queued up output data
|| (ext->CurrentReadIrp) ) deb_printf(" RdIRP:");
if (!IsListEmpty(&ext->ReadQueue)) // no queued up output data
deb_printf("Q"); if (ext->CurrentReadIrp) deb_printf("C"); //------
//if ( (!IsListEmpty(&ext->MaskQueue)) // no queued up output data
// || (ext->CurrentMaskIrp) )
// deb_printf(" MaskIRP:");
//if (!IsListEmpty(&ext->MaskQueue)) // no queued up output data
// deb_printf("Q");
//if (ext->CurrentMaskIrp)
// deb_printf("C");
//------
if (ext->CurrentWaitIrp) deb_printf(" WaitIRP:C");
//------
if ( (!IsListEmpty(&ext->PurgeQueue)) // no queued up output data
|| (ext->CurrentPurgeIrp)) deb_printf(" PurgeIRP:");
if (!IsListEmpty(&ext->PurgeQueue)) // no queued up output data
deb_printf("Q"); if (ext->CurrentPurgeIrp) deb_printf("C");
deb_printf("\n"); //------
if ((ext->WriteLength) || (ext->NumberNeededForRead)) { deb_printf("WrLen:%x, ReadLeft:%x\n", ext->WriteLength, ext->NumberNeededForRead); }
if (ext->IsrWaitMask || ext->HistoryMask || ext->WaitIsISRs) { deb_printf("WaitMask:%x HistMask:%x MaskLoc:%x\n", ext->IsrWaitMask, ext->HistoryMask, ext->IrpMaskLocation);
if (ext->IsrWaitMask & 2) // RXFLAG(event-char)
deb_printf("Event Char:%xH\n", ext->SpecialChars.EventChar); }
if (ext->TXHolding || ext->RXHolding || ext->ErrorWord) deb_printf("TXHolding:%x RXHolding:%x ErrorW:%x\n", ext->TXHolding, ext->RXHolding, ext->ErrorWord);
if (ext->TotalCharsQueued) deb_printf("TotalTX:%x\n", ext->TotalCharsQueued); #ifdef S_VS
deb_printf("%s ExtAddr:%xH(size:%xH)\n", ext->SymbolicLinkName, ext, sizeof(*ext)); #else
deb_printf("%s ExtAddr:%xH(size:%xH) ChnAddr:%xH(size:%xH)\n", ext->SymbolicLinkName, ext, sizeof(*ext), ext->ChP, sizeof(*ext->ChP)); #endif
}
/*----------------------------------------------------------------------------
| dump_mem - Dump memory to debug channel. |----------------------------------------------------------------------------*/ void dump_mem(UCHAR *ptr, ULONG len) { unsigned char binbuf[17]; char tmpstr[60]; int j,i; ULONG off = 0;
if (ptr == NULL) { deb_printf("Null\n"); return; }
if (MmIsAddressValid(ptr) == FALSE) { deb_printf("Not valid\n"); return; }
if (len > 0x500) len = 0x500;
while (len > 0) { j = 16; if (len < 16) j = len;
deb_printf("%08x> ", (ULONG)ptr + off); for (i=0; i<j; i++) { binbuf[i] = ptr[i+off]; Sprintf(tmpstr, "%02x ", binbuf[i]); if ((i % 16) == 7) strcat(tmpstr,"- "); deb_printf(tmpstr);
if ((binbuf[i] < 0x20) || (binbuf[i] >= 0x80)) binbuf[i] = '.'; else if (binbuf[i] == '\\') binbuf[i] = '.'; else if (binbuf[i] == '%') binbuf[i] = '.'; } off += 16; binbuf[i] = 0; Sprintf(tmpstr, "%s\x0d\x0a", binbuf); deb_printf(tmpstr); len -= j; } }
/*---------------------------------------------------------------------------
| deb_printf - uart printf. |---------------------------------------------------------------------------*/ void __cdecl deb_printf(char *format, ...) { va_list next; int len; static char buf[120];
va_start(next, format); our_vsnprintf(buf, 118, format, next);
len = strlen(buf); if (len > 0) //--- convert "\n" to a CR,LF
{ if (buf[len-1] == 0xa) { buf[len-1] = 0xd; buf[len] = 0xa; buf[len+1] = 0; ++len; } }
//----- log it into our debug Q
q_put(&Driver.DebugQ, (BYTE *) buf, len); }
#ifdef S_VS
#if 0
/*---------------------------------------------------------------------------
| write_remote_cmd - Write remote trace debug command. This is experimental code to read box traces, not in working order. |---------------------------------------------------------------------------*/ int write_remote_cmd(PortMan *pm, char *cmd) { int stat; BYTE *buf; BYTE cmd_buf[60]; BYTE *tx_base;
TraceStr("writeTrace");
strcpy(cmd_buf, cmd); cmd_buf[0x3f] = 1; // new-command flag
hdlc_get_ctl_outpkt(pm->hd, &buf); if (buf == NULL) return 1; tx_base = buf - 20; // backup to start of pkt
stat = ioctl_device(UPLOAD_COMMAND, (BYTE *) cmd_buf, buf, 0x400L, // offset into memory
0x40); // num bytes of data
// setup header
tx_base[14] = ASYNC_PRODUCT_HEADER_ID; // comtrol packet type = driver management, any product.
tx_base[15] = 0; // conc. index field
tx_base[16] = 1; // admin
*((WORD *)&tx_base[17]) = 0x80; tx_base[19] = 1; // ADMIN packet type, 1=boot-loader, 3=id-reply
if (pending_debug_packet) time_stall(1); // wait 1/10th second
pending_debug_packet = 1; // flag to tell when response comes in
// send it.
stat = hdlc_send_raw(pm->hd, 60, NULL);
if (stat) {TraceErr("Bad send");}
return 0; }
/*---------------------------------------------------------------------------
| read_trace_queue - Read remote trace buffer, so we can display any new trace data to the screen. This routine just sends out the query. admin.c will get a reply and stuff the incoming data into the local trace queue. This is experimental code to read box traces, not in working order. |---------------------------------------------------------------------------*/ int read_trace_queue(PortMan *pm) { int stat; BYTE *buf; WORD io_buf[60]; BYTE *tx_base;
TraceStr("readTrace");
hdlc_get_ctl_outpkt(pm->hd, &buf); if (buf == NULL) return 1; tx_base = buf - 20; // backup to start of pkt
stat = ioctl_device(IOCTL_COMMAND, (BYTE *) io_buf, buf, 22, // 22 = get trace q
0); // num bytes of data
// setup header
tx_base[14] = ASYNC_PRODUCT_HEADER_ID; // comtrol packet type = driver management, any product.
tx_base[15] = 0; // conc. index field
tx_base[16] = 1; // admin
*((WORD *)&tx_base[17]) = 40; tx_base[19] = 1; // ADMIN packet type, 1=boot-loader, 3=id-reply
if (pending_debug_packet) time_stall(1); // wait 1/10th second
pending_debug_packet = 22; // flag to tell when response comes in
// send it.
stat = hdlc_send_raw(pm->hd, 60, NULL);
if (stat) {TraceErr("Bad send");}
return 0; }
/*---------------------------------------------------------------------------
| debug_device_reply - Handle received debug-boot loader ADMIN packets from device. This is experimental code to read box traces, not in working order. |---------------------------------------------------------------------------*/ int debug_device_reply(PVOID *void_pm, // PortMan *pm,
unsigned char *data, unsigned char *pkt); { int i; unsigned char chksum; // unsigned char *bf;
unsigned char uc; WORD ret_size; BYTE *bptr; BYTE message_type; PortMan *pm = (PortMan *)void_pm;
bptr = data;
if (bptr[0] != '|') // good reply header
{ deb_printf("dbg:bad hdr\n"); return 1; }
chksum = bptr[1]; ret_size = bptr[1]; // get len
chksum += bptr[2]; ret_size += ((WORD)(bptr[2]) << 8); // get len
if (ret_size > 1600) // limit
ret_size = 0;
uc = bptr[3]; // get command return word
message_type = uc & 0x7f; // strip off 80H bit.
chksum += uc; uc = bptr[4]; chksum += uc;
i = 0; if ((message_type == IOCTL_COMMAND) || (message_type == DOWNLOAD_COMMAND)) { // o_printf("ret size:%d\n", ret_size-2);
if (data == NULL) { pending_debug_packet = 0; //deb_printf("dbg:no data\n");
return 20; // err out
}
//bf = data;
for (i=0; i<ret_size-2; i++) { //bf[i] = bptr[5+i];
chksum += bptr[5+i]; } i = ret_size-2; }
chksum += bptr[5+i]; if (chksum != 0xff) { deb_printf("dbg:bad chksum\n"); return 2; /* bad chksum */ }
//if ((message_type == IOCTL_COMMAND) || (message_type == DOWNLOAD_COMMAND))
// *num_bytes = ret_size-2;
//else
// *num_bytes = 0;
if (message_type == IOCTL_COMMAND) { if (pending_debug_packet == 22) // flag to tell when response comes in
{ if (ret_size > 2) TracePut(&bptr[5], ret_size -2); deb_printf("dbg:read q\n"); } } else deb_printf("dbg:set q\n"); pending_debug_packet = 0;
return 0; // ok
} #endif
#endif
|