|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: dbgkdsup.c ! 8: ! 9: Abstract: ! 10: ! 11: This module contains os specific DbgKd support routines ! 12: ! 13: Author: ! 14: ! 15: Mark Lucovsky (markl) 27-Jul-1990 ! 16: ! 17: Revision History: ! 18: ! 19: Roger Lanser (O-ALEXBR) 18-Jan-1992 Removed #ifdef DECSTATION and added ! 20: hack for baud rate environment variable. Unable ! 21: to compile due to failure to find include files. ! 22: ! 23: --*/ ! 24: ! 25: #include "givit.h" ! 26: ! 27: #define THREAD_STACK_SIZE 16000 /* Better safe than... */ ! 28: #define COM_PORT_NAME "_NT_DEBUG_PORT" ! 29: #define COM_PORT_BAUD "_NTKD_BAUD_RATE" ! 30: ! 31: HANDLE PipeRead; ! 32: HANDLE PipeWrite; ! 33: ! 34: VOID ! 35: DbgKdpStartThreads(VOID) ! 36: { ! 37: HANDLE PollThread; ! 38: PBYTE KbdPollThreadStack; ! 39: DWORD KbdPollThreadId; ! 40: ! 41: if( CreatePipe( &PipeRead, &PipeWrite, NULL, (1024-32)) == FALSE ) { ! 42: fprintf(stderr, "Failed to create anonymous pipe in KdpStartThreads\n"); ! 43: fprintf(stderr, "Error code %lx\n", GetLastError()); ! 44: exit(1); ! 45: } ! 46: ! 47: PollThread = CreateThread( ! 48: NULL, ! 49: THREAD_STACK_SIZE, ! 50: (LPTHREAD_START_ROUTINE)DbgKdpKbdPollThread, ! 51: NULL, ! 52: THREAD_SET_INFORMATION, ! 53: (LPDWORD)&KbdPollThreadId ! 54: ); ! 55: ! 56: ! 57: if ( PollThread == (HANDLE)NULL ) { ! 58: fprintf(stderr,"Failed to create KbdPollThread %d\n",PollThread); ! 59: exit(1); ! 60: } ! 61: else { ! 62: if (!SetThreadPriority(PollThread, THREAD_PRIORITY_ABOVE_NORMAL)) { ! 63: fprintf(stderr, "Fail to raise the priority of PollThread.\n"); ! 64: } ! 65: } ! 66: } ! 67: ! 68: ! 69: VOID ! 70: DbgKdpInitComPort( ! 71: ULONG ComPort ! 72: ) ! 73: { ! 74: PUCHAR ComPortName; ! 75: USHORT Baud; ! 76: DCB LocalDcb; ! 77: COMMTIMEOUTS To; ! 78: ! 79: // ! 80: // A quick hack to remove the #ifdef DECSTATION so the mips version ! 81: // is ok for DECSTATION. No other files were modified to reflect ! 82: // this change. ! 83: // ! 84: ! 85: { ! 86: PUCHAR baudRateEnvValue; ! 87: if (baudRateEnvValue = getenv(COM_PORT_BAUD)) { ! 88: Baud = atoi(baudRateEnvValue); ! 89: fprintf(stderr, "KD: baud rate reset to %d\n\n", Baud); ! 90: } else { ! 91: Baud = 19200; ! 92: } ! 93: } ! 94: ! 95: ! 96: // ! 97: // Read an environment variable to decide what comport to use, ! 98: // IGNORE the bogus comport argument. ! 99: // ! 100: ! 101: ComPortName = getenv(COM_PORT_NAME); ! 102: if (ComPortName == NULL) { ! 103: ComPortName = "com1"; ! 104: } ! 105: ! 106: // ! 107: // Open the device ! 108: // ! 109: DbgKdpComPort = CreateFile( ! 110: (PSZ)ComPortName, ! 111: GENERIC_READ | GENERIC_WRITE, ! 112: 0, ! 113: NULL, ! 114: OPEN_ALWAYS, ! 115: FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, ! 116: NULL ! 117: ); ! 118: ! 119: if ( DbgKdpComPort == (HANDLE)-1 ) { ! 120: fprintf(stderr,"Failed to open %s\n",ComPortName); ! 121: exit(1); ! 122: } ! 123: ! 124: SetupComm(DbgKdpComPort,(DWORD)4096,(DWORD)4096); ! 125: ! 126: // ! 127: // Create the events used by the overlapped structures for the ! 128: // read and write. ! 129: // ! 130: ! 131: ReadOverlapped.hEvent = CreateEvent( ! 132: NULL, ! 133: TRUE, ! 134: FALSE,NULL ! 135: ); ! 136: ! 137: if (!ReadOverlapped.hEvent) { ! 138: fprintf(stderr,"Failed to create read event support for %s\n",ComPortName); ! 139: exit(1); ! 140: } ! 141: ! 142: WriteOverlapped.hEvent = CreateEvent( ! 143: NULL, ! 144: TRUE, ! 145: FALSE,NULL ! 146: ); ! 147: ! 148: if (!WriteOverlapped.hEvent) { ! 149: fprintf(stderr,"Failed to create write event support for %s\n",ComPortName); ! 150: exit(1); ! 151: } ! 152: ! 153: ReadOverlapped.Offset = 0; ! 154: ReadOverlapped.OffsetHigh = 0; ! 155: ! 156: WriteOverlapped.Offset = 0; ! 157: WriteOverlapped.OffsetHigh = 0; ! 158: ! 159: // ! 160: // Set up the Comm port.... ! 161: // ! 162: ! 163: if (!GetCommState( ! 164: DbgKdpComPort, ! 165: &LocalDcb ! 166: )) { ! 167: ! 168: fprintf(stderr,"Failed to get the old comm state for %s\n",ComPort); ! 169: exit(1); ! 170: ! 171: } ! 172: ! 173: LocalDcb.BaudRate = Baud; ! 174: LocalDcb.ByteSize = 8; ! 175: LocalDcb.Parity = NOPARITY; ! 176: LocalDcb.StopBits = ONESTOPBIT; ! 177: LocalDcb.fDtrControl = DTR_CONTROL_ENABLE; ! 178: LocalDcb.fRtsControl = RTS_CONTROL_ENABLE; ! 179: LocalDcb.fBinary = TRUE; ! 180: LocalDcb.fOutxCtsFlow = FALSE; ! 181: LocalDcb.fOutxDsrFlow = FALSE; ! 182: LocalDcb.fOutX = FALSE; ! 183: LocalDcb.fInX = FALSE; ! 184: ! 185: if (!SetCommState( ! 186: DbgKdpComPort, ! 187: &LocalDcb ! 188: )) { ! 189: ! 190: fprintf(stderr,"Failed to set state for %s.\n",ComPortName); ! 191: exit(1); ! 192: ! 193: } ! 194: ! 195: // ! 196: // Set the normal read and write timeout time. ! 197: // The symbols are 10 millisecond intervals. ! 198: // ! 199: ! 200: To.ReadIntervalTimeout = 0; ! 201: To.ReadTotalTimeoutMultiplier = 0; ! 202: To.ReadTotalTimeoutConstant = 4 * 1000; ! 203: To.WriteTotalTimeoutMultiplier = 0; ! 204: To.WriteTotalTimeoutConstant = 4 * 1000; ! 205: ! 206: if (!SetCommTimeouts( ! 207: DbgKdpComPort, ! 208: &To ! 209: )) { ! 210: ! 211: fprintf(stderr,"Failed to set timeouts for %s.\n",ComPortName); ! 212: exit(1); ! 213: ! 214: } ! 215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.