/*++ Copyright (c) 1990 Microsoft Corporation Module Name: dbgkdsup.c Abstract: This module contains os specific DbgKd support routines Author: Mark Lucovsky (markl) 27-Jul-1990 Revision History: Roger Lanser (O-ALEXBR) 18-Jan-1992 Removed #ifdef DECSTATION and added hack for baud rate environment variable. Unable to compile due to failure to find include files. --*/ #include "ntsdp.h" #include "dbgpnt.h" #define THREAD_STACK_SIZE 16000 /* Better safe than... */ #define COM_PORT_NAME "_NT_DEBUG_PORT" #define COM_PORT_BAUD "_NT_DEBUG_BAUD_RATE" HANDLE PipeRead; HANDLE PipeWrite; extern BOOLEAN KdModemControl; VOID DbgKdpStartThreads(VOID) { HANDLE PollThread; DWORD KbdPollThreadId; if( CreatePipe( &PipeRead, &PipeWrite, NULL, (1024-32)) == FALSE ) { fprintf(stderr, "Failed to create anonymous pipe in KdpStartThreads\n"); fprintf(stderr, "Error code %lx\n", GetLastError()); exit(1); } PollThread = CreateThread( NULL, THREAD_STACK_SIZE, (LPTHREAD_START_ROUTINE)DbgKdpKbdPollThread, NULL, THREAD_SET_INFORMATION, (LPDWORD)&KbdPollThreadId ); if ( PollThread == (HANDLE)NULL ) { fprintf(stderr,"Failed to create KbdPollThread %d\n",PollThread); exit(1); } else { if (!SetThreadPriority(PollThread, THREAD_PRIORITY_ABOVE_NORMAL)) { fprintf(stderr, "Fail to raise the priority of PollThread.\n"); } } } VOID DbgKdpInitComPort( ULONG ComPort ) { PUCHAR ComPortName; ULONG Baud; DCB LocalDcb; COMMTIMEOUTS To; DWORD mask; // // A quick hack to remove the #ifdef DECSTATION so the mips version // is ok for DECSTATION. No other files were modified to reflect // this change. // { PUCHAR baudRateEnvValue; if (baudRateEnvValue = getenv(COM_PORT_BAUD)) { Baud = atol(baudRateEnvValue); fprintf(stderr, "KD: baud rate reset to %d\n\n", Baud); } else { Baud = 19200; } } // // Read an environment variable to decide what comport to use, // IGNORE the bogus comport argument. // ComPortName = getenv(COM_PORT_NAME); if (ComPortName == NULL) { ComPortName = "com1"; } // // Open the device // DbgKdpComPort = CreateFile( (PSZ)ComPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL ); if ( DbgKdpComPort == (HANDLE)-1 ) { fprintf(stderr,"Failed to open %s\n",ComPortName); exit(1); } SetupComm(DbgKdpComPort,(DWORD)4096,(DWORD)4096); // // Create the events used by the overlapped structures for the // read and write. // ReadOverlapped.hEvent = CreateEvent( NULL, TRUE, FALSE,NULL ); if (!ReadOverlapped.hEvent) { fprintf(stderr,"Failed to create read event support for %s\n",ComPortName); exit(1); } WriteOverlapped.hEvent = CreateEvent( NULL, TRUE, FALSE,NULL ); if (!WriteOverlapped.hEvent) { fprintf(stderr,"Failed to create write event support for %s\n",ComPortName); exit(1); } ReadOverlapped.Offset = 0; ReadOverlapped.OffsetHigh = 0; WriteOverlapped.Offset = 0; WriteOverlapped.OffsetHigh = 0; // // Set up the Comm port.... // if (!GetCommState( DbgKdpComPort, &LocalDcb )) { fprintf(stderr,"Failed to get the old comm state for %s\n",ComPort); exit(1); } LocalDcb.BaudRate = Baud; LocalDcb.ByteSize = 8; LocalDcb.Parity = NOPARITY; LocalDcb.StopBits = ONESTOPBIT; LocalDcb.fDtrControl = DTR_CONTROL_ENABLE; LocalDcb.fRtsControl = RTS_CONTROL_ENABLE; LocalDcb.fBinary = TRUE; LocalDcb.fOutxCtsFlow = FALSE; LocalDcb.fOutxDsrFlow = FALSE; LocalDcb.fOutX = FALSE; LocalDcb.fInX = FALSE; if (!SetCommState( DbgKdpComPort, &LocalDcb )) { fprintf(stderr,"Failed to set state for %s.\n",ComPortName); exit(1); } // // Set the normal read and write timeout time. // The symbols are 10 millisecond intervals. // To.ReadIntervalTimeout = 0; To.ReadTotalTimeoutMultiplier = 0; To.ReadTotalTimeoutConstant = 4 * 1000; To.WriteTotalTimeoutMultiplier = 0; To.WriteTotalTimeoutConstant = 4 * 1000; if (!SetCommTimeouts( DbgKdpComPort, &To )) { fprintf(stderr,"Failed to set timeouts for %s.\n",ComPortName); exit(1); } DbgKdpComEvent = 0; if (KdModemControl) { // // Debugger is being run over a modem. Set event to watch // carrier detect. // GetCommMask (DbgKdpComPort, &mask); if (!SetCommMask (DbgKdpComPort, mask | 0xA0)) { // set DDCD event fprintf(stderr,"Failed to set event for %s.\n", ComPortName); exit(1); } EventOverlapped.hEvent = CreateEvent( NULL, TRUE, FALSE,NULL ); if (!EventOverlapped.hEvent) { fprintf(stderr,"Failed to create EventOverlapped\n"); exit(1); } EventOverlapped.Offset = 0; EventOverlapped.OffsetHigh = 0; DbgKdpComEvent = 1; // Fake an event, so modem status will be checked } }