From 2aa87f6dc519fceefdae1872cea9dab198124d50 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 20 Jan 2009 01:50:13 +0000 Subject: [PATCH] kdcom: add a debug hack to use com2 for WinDbg, while com1 stays for FrLdrDbgPrint. Also mark the Port as initialized in KdDebuggerInitialize0. Remove the KD_RECV_CODE enum, use the KDSTATUS enum that already exist. Implement PACKET_TYPE_KD_POLL_BREAKIN case for KdReceivePacket as described in http://www.nynaeve.net/?p=169 Now we return from KdPollBreakIn(). svn path=/branches/ros-amd64-bringup/; revision=38965 --- reactos/drivers/base/kdcom/i386/kdbg.c | 58 +++++++++++++++++++------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/base/kdcom/i386/kdbg.c b/reactos/drivers/base/kdcom/i386/kdbg.c index a2e9c7f0cad..b1d2ceb381a 100644 --- a/reactos/drivers/base/kdcom/i386/kdbg.c +++ b/reactos/drivers/base/kdcom/i386/kdbg.c @@ -22,13 +22,6 @@ #include #include /* port intrinsics */ -typedef enum _KD_RECV_CODE -{ - KD_RECV_CODE_OK = 0, - KD_RECV_CODE_TIMEOUT = 1, - KD_RECV_CODE_FAILED = 2 -} KD_RECV_CODE, * PKD_RECV_CODE; - typedef struct _KD_PORT_INFORMATION { ULONG ComPort; @@ -541,13 +534,14 @@ KdpSendBuffer( } } + /****************************************************************************** * \name KdpReceiveBuffer * \brief Recieves data from the KD port and fills a buffer. * \param Buffer Pointer to a buffer that receives the data. * \param Size Size of data to receive in bytes. - * \return KD_RECV_CODE_OK if successful. - * KD_RECV_CODE_TIMEOUT if the receice timed out (10 seconds). + * \return KdPacketReceived if successful. + * KdPacketTimedOut if the receice timed out (10 seconds). * \todo Handle timeout. */ KDSTATUS @@ -571,12 +565,12 @@ KdpReceiveBuffer( if (TimeOut) { - return KD_RECV_CODE_TIMEOUT; + return KdPacketTimedOut; } FrLdrDbgPrint("Received byte: %x\n", ByteBuffer[i]); } - return KD_RECV_CODE_OK; + return KdPacketReceived; } /* NEW PUBLIC FUNCTIONS ******************************************************/ @@ -679,6 +673,9 @@ KdDebuggerInitialize0( } } + // HACK use com1 for FrLdrDbg, com2 for WinDbg + DefaultPort.ComPort = 2; + /* Get base address */ DefaultPort.BaseAddress = BaseArray[DefaultPort.ComPort]; @@ -690,6 +687,7 @@ KdDebuggerInitialize0( /* Initialize the port */ KdPortInitializeEx(&DefaultPort, 0, 0); + PortInitialized = TRUE; return STATUS_SUCCESS; } @@ -707,7 +705,6 @@ KdDebuggerInitialize1( { // HACK: misuse this function to get a pointer to FrLdrDbgPrint FrLdrDbgPrint = (PVOID)LoaderBlock; - UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; } @@ -774,8 +771,21 @@ KdSendPacket( return; } -/* - * @unimplemented + +/****************************************************************************** + * \name KdReceivePacket + * \brief Receive a packet from the KD port. + * \param [in] PacketType Describes the type of the packet to receive. + * This can be one of the PACKET_TYPE_ constants. + * \param [out] MessageHeader Pointer to a STRING structure for the header. + * \param [out] MessageData Pointer to a STRING structure for the data. + * \return KdPacketReceived if successful, KdPacketTimedOut if the receive + * timed out, KdPacketNeedsResend to signal that the last packet needs + * to be sent again. + * \note If PacketType is PACKET_TYPE_KD_POLL_BREAKIN, the function doesn't + * wait for any data, but returns KdPacketTimedOut instantly if no breakin + * packet byte is received. + * \sa http://www.nynaeve.net/?p=169 */ KDSTATUS NTAPI @@ -786,8 +796,24 @@ KdReceivePacket( OUT PULONG DataLength, IN OUT PKD_CONTEXT Context) { -// UNIMPLEMENTED; - return 0; + UCHAR BreakIn = 0; + + /* Special handling for breakin packet */ + if(PacketType == PACKET_TYPE_KD_POLL_BREAKIN) + { + if (KdPortGetByteEx(&DefaultPort, &BreakIn)) + { + if (BreakIn == BREAKIN_PACKET_BYTE) + { + return KdPacketReceived; + } + } + return KdPacketTimedOut; + } + + // FIXME: handle other cases + + return KdPacketReceived; } /* EOF */