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