xref: /reactos/ntoskrnl/kd/i386/kdserial.c (revision dfc2cc4e)
16fafe54fSHermès Bélusca-Maïto /*
26fafe54fSHermès Bélusca-Maïto  * COPYRIGHT:       See COPYING in the top level directory
36fafe54fSHermès Bélusca-Maïto  * PROJECT:         ReactOS kernel
46fafe54fSHermès Bélusca-Maïto  * FILE:            ntoskrnl/kd/i386/kdbg.c
56fafe54fSHermès Bélusca-Maïto  * PURPOSE:         Serial i/o functions for the kernel debugger.
66fafe54fSHermès Bélusca-Maïto  * PROGRAMMER:      Alex Ionescu
76fafe54fSHermès Bélusca-Maïto  *                  Herv� Poussineau
86fafe54fSHermès Bélusca-Maïto  */
96fafe54fSHermès Bélusca-Maïto 
106fafe54fSHermès Bélusca-Maïto /* INCLUDES *****************************************************************/
116fafe54fSHermès Bélusca-Maïto 
126fafe54fSHermès Bélusca-Maïto #include <ntoskrnl.h>
136fafe54fSHermès Bélusca-Maïto #define NDEBUG
146fafe54fSHermès Bélusca-Maïto #include <debug.h>
156fafe54fSHermès Bélusca-Maïto 
166fafe54fSHermès Bélusca-Maïto #if defined(SARCH_PC98)
176fafe54fSHermès Bélusca-Maïto #define DEFAULT_BAUD_RATE   9600
186fafe54fSHermès Bélusca-Maïto #else
196fafe54fSHermès Bélusca-Maïto #define DEFAULT_BAUD_RATE   19200
206fafe54fSHermès Bélusca-Maïto #endif
216fafe54fSHermès Bélusca-Maïto 
226fafe54fSHermès Bélusca-Maïto #if defined(_M_IX86) || defined(_M_AMD64)
236fafe54fSHermès Bélusca-Maïto #if defined(SARCH_PC98)
246fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x30, 0x238};
256fafe54fSHermès Bélusca-Maïto #else
266fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
276fafe54fSHermès Bélusca-Maïto #endif
286fafe54fSHermès Bélusca-Maïto #elif defined(_M_PPC)
296fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x800003F8};
306fafe54fSHermès Bélusca-Maïto #elif defined(_M_MIPS)
316fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x80006000, 0x80007000};
326fafe54fSHermès Bélusca-Maïto #elif defined(_M_ARM)
336fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0xF1012000};
346fafe54fSHermès Bélusca-Maïto #else
356fafe54fSHermès Bélusca-Maïto #error Unknown architecture
366fafe54fSHermès Bélusca-Maïto #endif
376fafe54fSHermès Bélusca-Maïto 
386fafe54fSHermès Bélusca-Maïto #define MAX_COM_PORTS   (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1)
396fafe54fSHermès Bélusca-Maïto 
406fafe54fSHermès Bélusca-Maïto /* STATIC VARIABLES ***********************************************************/
416fafe54fSHermès Bélusca-Maïto 
426fafe54fSHermès Bélusca-Maïto // static CPPORT DefaultPort = {0, 0, 0};
436fafe54fSHermès Bélusca-Maïto 
446fafe54fSHermès Bélusca-Maïto /* The COM port must only be initialized once! */
456fafe54fSHermès Bélusca-Maïto // static BOOLEAN PortInitialized = FALSE;
466fafe54fSHermès Bélusca-Maïto 
476fafe54fSHermès Bélusca-Maïto /* REACTOS FUNCTIONS **********************************************************/
486fafe54fSHermès Bélusca-Maïto 
496fafe54fSHermès Bélusca-Maïto BOOLEAN
506fafe54fSHermès Bélusca-Maïto NTAPI
KdPortInitializeEx(IN PCPPORT PortInformation,IN ULONG ComPortNumber)516fafe54fSHermès Bélusca-Maïto KdPortInitializeEx(
526fafe54fSHermès Bélusca-Maïto     IN PCPPORT PortInformation,
536fafe54fSHermès Bélusca-Maïto     IN ULONG ComPortNumber)
546fafe54fSHermès Bélusca-Maïto {
556fafe54fSHermès Bélusca-Maïto     NTSTATUS Status;
566fafe54fSHermès Bélusca-Maïto 
576fafe54fSHermès Bélusca-Maïto #if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use KdPortInitializeEx)
586fafe54fSHermès Bélusca-Maïto     /*
596fafe54fSHermès Bélusca-Maïto      * Find the port if needed
606fafe54fSHermès Bélusca-Maïto      */
616fafe54fSHermès Bélusca-Maïto 
626fafe54fSHermès Bélusca-Maïto     if (!PortInitialized)
636fafe54fSHermès Bélusca-Maïto     {
646fafe54fSHermès Bélusca-Maïto         DefaultPort.BaudRate = PortInformation->BaudRate;
656fafe54fSHermès Bélusca-Maïto 
666fafe54fSHermès Bélusca-Maïto         if (ComPortNumber == 0)
676fafe54fSHermès Bélusca-Maïto         {
686fafe54fSHermès Bélusca-Maïto             /*
696fafe54fSHermès Bélusca-Maïto              * Start enumerating COM ports from the last one to the first one,
706fafe54fSHermès Bélusca-Maïto              * and break when we find a valid port.
716fafe54fSHermès Bélusca-Maïto              * If we reach the first element of the list, the invalid COM port,
726fafe54fSHermès Bélusca-Maïto              * then it means that no valid port was found.
736fafe54fSHermès Bélusca-Maïto              */
746fafe54fSHermès Bélusca-Maïto             for (ComPortNumber = MAX_COM_PORTS; ComPortNumber > 0; ComPortNumber--)
756fafe54fSHermès Bélusca-Maïto             {
766fafe54fSHermès Bélusca-Maïto                 if (CpDoesPortExist(UlongToPtr(BaseArray[ComPortNumber])))
776fafe54fSHermès Bélusca-Maïto                 {
786fafe54fSHermès Bélusca-Maïto                     PortInformation->Address = DefaultPort.Address = BaseArray[ComPortNumber];
796fafe54fSHermès Bélusca-Maïto                     break;
806fafe54fSHermès Bélusca-Maïto                 }
816fafe54fSHermès Bélusca-Maïto             }
826fafe54fSHermès Bélusca-Maïto             if (ComPortNumber == 0)
836fafe54fSHermès Bélusca-Maïto             {
846fafe54fSHermès Bélusca-Maïto                 HalDisplayString("\r\nKernel Debugger: No COM port found!\r\n\r\n");
856fafe54fSHermès Bélusca-Maïto                 return FALSE;
866fafe54fSHermès Bélusca-Maïto             }
876fafe54fSHermès Bélusca-Maïto         }
886fafe54fSHermès Bélusca-Maïto 
896fafe54fSHermès Bélusca-Maïto         PortInitialized = TRUE;
906fafe54fSHermès Bélusca-Maïto     }
916fafe54fSHermès Bélusca-Maïto #endif
926fafe54fSHermès Bélusca-Maïto 
936fafe54fSHermès Bélusca-Maïto     /*
946fafe54fSHermès Bélusca-Maïto      * Initialize the port
956fafe54fSHermès Bélusca-Maïto      */
966fafe54fSHermès Bélusca-Maïto     Status = CpInitialize(PortInformation,
976fafe54fSHermès Bélusca-Maïto                           (ComPortNumber == 0 ? PortInformation->Address
986fafe54fSHermès Bélusca-Maïto                                               : UlongToPtr(BaseArray[ComPortNumber])),
996fafe54fSHermès Bélusca-Maïto                           (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE
1006fafe54fSHermès Bélusca-Maïto                                                           : PortInformation->BaudRate));
1016fafe54fSHermès Bélusca-Maïto     if (!NT_SUCCESS(Status))
1026fafe54fSHermès Bélusca-Maïto     {
1036fafe54fSHermès Bélusca-Maïto         HalDisplayString("\r\nKernel Debugger: Serial port not found!\r\n\r\n");
1046fafe54fSHermès Bélusca-Maïto         return FALSE;
1056fafe54fSHermès Bélusca-Maïto     }
1066fafe54fSHermès Bélusca-Maïto     else
1076fafe54fSHermès Bélusca-Maïto     {
1086fafe54fSHermès Bélusca-Maïto #ifndef NDEBUG
109*dfc2cc4eSHermès Bélusca-Maïto         int Length;
110*dfc2cc4eSHermès Bélusca-Maïto         CHAR Buffer[82];
1116fafe54fSHermès Bélusca-Maïto 
1126fafe54fSHermès Bélusca-Maïto         /* Print message to blue screen */
113*dfc2cc4eSHermès Bélusca-Maïto         Length = snprintf(Buffer, sizeof(Buffer),
1146fafe54fSHermès Bélusca-Maïto                           "\r\nKernel Debugger: Serial port found: COM%ld (Port 0x%p) BaudRate %ld\r\n\r\n",
1156fafe54fSHermès Bélusca-Maïto                           ComPortNumber,
1166fafe54fSHermès Bélusca-Maïto                           PortInformation->Address,
1176fafe54fSHermès Bélusca-Maïto                           PortInformation->BaudRate);
118*dfc2cc4eSHermès Bélusca-Maïto         if (Length == -1)
119*dfc2cc4eSHermès Bélusca-Maïto         {
120*dfc2cc4eSHermès Bélusca-Maïto             /* Terminate it if we went over-board */
121*dfc2cc4eSHermès Bélusca-Maïto             Buffer[sizeof(Buffer) - 1] = ANSI_NULL;
122*dfc2cc4eSHermès Bélusca-Maïto         }
123*dfc2cc4eSHermès Bélusca-Maïto 
124*dfc2cc4eSHermès Bélusca-Maïto         HalDisplayString(Buffer);
1256fafe54fSHermès Bélusca-Maïto #endif /* NDEBUG */
1266fafe54fSHermès Bélusca-Maïto 
1276fafe54fSHermès Bélusca-Maïto #if 0
1286fafe54fSHermès Bélusca-Maïto         /* Set global info */
1296fafe54fSHermès Bélusca-Maïto         KdComPortInUse = DefaultPort.Address;
1306fafe54fSHermès Bélusca-Maïto #endif
1316fafe54fSHermès Bélusca-Maïto         return TRUE;
1326fafe54fSHermès Bélusca-Maïto     }
1336fafe54fSHermès Bélusca-Maïto }
1346fafe54fSHermès Bélusca-Maïto 
1356fafe54fSHermès Bélusca-Maïto BOOLEAN
1366fafe54fSHermès Bélusca-Maïto NTAPI
KdPortGetByteEx(IN PCPPORT PortInformation,OUT PUCHAR ByteReceived)1376fafe54fSHermès Bélusca-Maïto KdPortGetByteEx(
1386fafe54fSHermès Bélusca-Maïto     IN PCPPORT PortInformation,
1396fafe54fSHermès Bélusca-Maïto     OUT PUCHAR ByteReceived)
1406fafe54fSHermès Bélusca-Maïto {
1416fafe54fSHermès Bélusca-Maïto     return (CpGetByte(PortInformation, ByteReceived, FALSE, FALSE) == CP_GET_SUCCESS);
1426fafe54fSHermès Bélusca-Maïto }
1436fafe54fSHermès Bélusca-Maïto 
1446fafe54fSHermès Bélusca-Maïto VOID
1456fafe54fSHermès Bélusca-Maïto NTAPI
KdPortPutByteEx(IN PCPPORT PortInformation,IN UCHAR ByteToSend)1466fafe54fSHermès Bélusca-Maïto KdPortPutByteEx(
1476fafe54fSHermès Bélusca-Maïto     IN PCPPORT PortInformation,
1486fafe54fSHermès Bélusca-Maïto     IN UCHAR ByteToSend)
1496fafe54fSHermès Bélusca-Maïto {
1506fafe54fSHermès Bélusca-Maïto     CpPutByte(PortInformation, ByteToSend);
1516fafe54fSHermès Bélusca-Maïto }
1526fafe54fSHermès Bélusca-Maïto 
1536fafe54fSHermès Bélusca-Maïto /* EOF */
154