|
|
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.