From 24abb046763be6dfe7c6d3a93e6e439d66d3f62d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 29 Nov 2012 10:26:00 +0000 Subject: [PATCH 1/1] [KDCOM] Fixes COM port debugging output with Virtual PC 2007. See r57781 for more details. CORE-4247 #comment Fixed also in r57782. svn path=/trunk/; revision=57782 --- reactos/drivers/base/kdcom/CMakeLists.txt | 10 +-- reactos/drivers/base/kdcom/i386/kdbg.c | 103 +++++----------------- 2 files changed, 29 insertions(+), 84 deletions(-) diff --git a/reactos/drivers/base/kdcom/CMakeLists.txt b/reactos/drivers/base/kdcom/CMakeLists.txt index 7f5718a170e..1594382f2b1 100644 --- a/reactos/drivers/base/kdcom/CMakeLists.txt +++ b/reactos/drivers/base/kdcom/CMakeLists.txt @@ -2,11 +2,11 @@ spec2def(kdcom.dll kdcom.spec ADD_IMPORTLIB) if(ARCH STREQUAL "i386") -list(APPEND SOURCE i386/kdbg.c) + list(APPEND SOURCE i386/kdbg.c) elseif(ARCH STREQUAL "amd64") -list(APPEND SOURCE i386/kdbg.c) + list(APPEND SOURCE i386/kdbg.c) elseif(ARCH STREQUAL "arm") -list(APPEND SOURCE arm/kdbg.c) + list(APPEND SOURCE arm/kdbg.c) endif(ARCH STREQUAL "i386") list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/kdcom.def) @@ -17,7 +17,7 @@ set_subsystem(kdcom native) set_image_base(kdcom 0x00010000) add_importlibs(kdcom ntoskrnl hal) - +target_link_libraries(kdcom cportlib) add_dependencies(kdcom psdk bugcodes) -add_cd_file(TARGET kdcom DESTINATION reactos/system32 NO_CAB FOR all) +add_cd_file(TARGET kdcom DESTINATION reactos/system32 NO_CAB FOR all) diff --git a/reactos/drivers/base/kdcom/i386/kdbg.c b/reactos/drivers/base/kdcom/i386/kdbg.c index 3c729988f3d..45a736de954 100644 --- a/reactos/drivers/base/kdcom/i386/kdbg.c +++ b/reactos/drivers/base/kdcom/i386/kdbg.c @@ -11,14 +11,17 @@ #define NOEXTAPI #include -#define NDEBUG #include #include -#include #include "arc/arc.h" #include "windbgkd.h" #include #include /* port intrinsics */ +#include + +#define NDEBUG +#include + typedef struct _KD_PORT_INFORMATION { @@ -54,14 +57,14 @@ KdPortPutByteEx( #define DEFAULT_BAUD_RATE 19200 -#ifdef _M_IX86 -const ULONG BaseArray[5] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8}; +#if defined(_M_IX86) || defined(_M_AMD64) +const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8}; #elif defined(_M_PPC) -const ULONG BaseArray[2] = {0, 0x800003f8}; +const ULONG BaseArray[] = {0, 0x800003F8}; #elif defined(_M_MIPS) -const ULONG BaseArray[3] = {0, 0x80006000, 0x80007000}; +const ULONG BaseArray[] = {0, 0x80006000, 0x80007000}; #elif defined(_M_ARM) -const ULONG BaseArray[2] = {0, 0xF1012000}; +const ULONG BaseArray[] = {0, 0xF1012000}; #else #error Unknown architecture #endif @@ -122,68 +125,6 @@ static KD_PORT_INFORMATION DefaultPort = { 0, 0, 0 }; static BOOLEAN PortInitialized = FALSE; -/* STATIC FUNCTIONS *********************************************************/ - -static BOOLEAN -KdpDoesComPortExist( - IN ULONG BaseAddress) -{ - BOOLEAN found; - UCHAR mcr; - UCHAR msr; - - found = FALSE; - - /* save Modem Control Register (MCR) */ - mcr = READ_PORT_UCHAR(SER_MCR(BaseAddress)); - - /* enable loop mode (set Bit 4 of the MCR) */ - WRITE_PORT_UCHAR(SER_MCR(BaseAddress), SR_MCR_LOOP); - - /* clear all modem output bits */ - WRITE_PORT_UCHAR(SER_MCR(BaseAddress), SR_MCR_LOOP); - - /* read the Modem Status Register */ - msr = READ_PORT_UCHAR(SER_MSR(BaseAddress)); - - /* - * the upper nibble of the MSR (modem output bits) must be - * equal to the lower nibble of the MCR (modem input bits) - */ - if ((msr & 0xF0) == 0x00) - { - /* set all modem output bits */ - WRITE_PORT_UCHAR(SER_MCR(BaseAddress), SR_MCR_DTR | SR_MCR_RTS | SR_MCR_OUT1 | SR_MCR_OUT2 | SR_MCR_LOOP); - - /* read the Modem Status Register */ - msr = READ_PORT_UCHAR(SER_MSR(BaseAddress)); - - /* - * the upper nibble of the MSR (modem output bits) must be - * equal to the lower nibble of the MCR (modem input bits) - */ - if ((msr & 0xF0) == 0xF0) - { - /* - * setup a resonable state for the port: - * enable fifo and clear recieve/transmit buffers - */ - WRITE_PORT_UCHAR(SER_FCR(BaseAddress), - (SR_FCR_ENABLE_FIFO | SR_FCR_CLEAR_RCVR | SR_FCR_CLEAR_XMIT)); - WRITE_PORT_UCHAR(SER_FCR(BaseAddress), 0); - READ_PORT_UCHAR(SER_RBR(BaseAddress)); - WRITE_PORT_UCHAR(SER_IER(BaseAddress), 0); - found = TRUE; - } - } - - /* restore MCR */ - WRITE_PORT_UCHAR(SER_MCR(BaseAddress), mcr); - - return found; -} - - /* FUNCTIONS ****************************************************************/ /* HAL.KdPortInitialize */ @@ -203,14 +144,18 @@ KdPortInitialize( if (PortInformation->ComPort == 0) { + /* + * Start enumerating COM ports from the last one to the first one, + * and break when we find a valid port. + * If we reach the first element of the list, the invalid COM port, + * then it means that no valid port was found. + */ for (i = sizeof(BaseArray) / sizeof(BaseArray[0]) - 1; i > 0; i--) { - if (KdpDoesComPortExist(BaseArray[i])) + if (CpDoesPortExist(UlongToPtr(BaseArray[i]))) { - DefaultPort.BaseAddress = BaseArray[i]; - DefaultPort.ComPort = i; - PortInformation->BaseAddress = DefaultPort.BaseAddress; - PortInformation->ComPort = DefaultPort.ComPort; + PortInformation->BaseAddress = DefaultPort.BaseAddress = BaseArray[i]; + PortInformation->ComPort = DefaultPort.ComPort = i; break; } } @@ -237,7 +182,7 @@ KdPortInitialize( } -/* HAL.KdPortInitializeEx */ +/* HAL.KdPortInitializeEx ; ReactOS-specific */ BOOLEAN NTAPI KdPortInitializeEx( @@ -260,7 +205,7 @@ KdPortInitializeEx( if (PortInformation->ComPort != 0) { - if (!KdpDoesComPortExist(BaseArray[PortInformation->ComPort])) + if (!CpDoesPortExist(UlongToPtr(BaseArray[PortInformation->ComPort]))) { sprintf(buffer, "\nKernel Debugger: Serial port not found!\n\n"); @@ -335,7 +280,7 @@ KdPortGetByte( } -/* HAL.KdPortGetByteEx */ +/* HAL.KdPortGetByteEx ; ReactOS-specific */ BOOLEAN NTAPI KdPortGetByteEx( @@ -366,7 +311,7 @@ KdPortPollByte( } -/* HAL.KdPortPollByteEx */ +/* HAL.KdPortPollByteEx ; ReactOS-specific */ BOOLEAN NTAPI KdPortPollByteEx( @@ -395,7 +340,7 @@ KdPortPutByte( KdPortPutByteEx(&DefaultPort, ByteToSend); } -/* HAL.KdPortPutByteEx */ +/* HAL.KdPortPutByteEx ; ReactOS-specific */ VOID NTAPI KdPortPutByteEx( -- 2.17.1