1*6fafe54fSHermès Bélusca-Maïto /* 2*6fafe54fSHermès Bélusca-Maïto * COPYRIGHT: See COPYING in the top level directory 3*6fafe54fSHermès Bélusca-Maïto * PROJECT: ReactOS kernel 4*6fafe54fSHermès Bélusca-Maïto * FILE: ntoskrnl/kd/i386/kdbg.c 5*6fafe54fSHermès Bélusca-Maïto * PURPOSE: Serial i/o functions for the kernel debugger. 6*6fafe54fSHermès Bélusca-Maïto * PROGRAMMER: Alex Ionescu 7*6fafe54fSHermès Bélusca-Maïto * Herv� Poussineau 8*6fafe54fSHermès Bélusca-Maïto */ 9*6fafe54fSHermès Bélusca-Maïto 10*6fafe54fSHermès Bélusca-Maïto /* INCLUDES *****************************************************************/ 11*6fafe54fSHermès Bélusca-Maïto 12*6fafe54fSHermès Bélusca-Maïto #include <ntoskrnl.h> 13*6fafe54fSHermès Bélusca-Maïto #define NDEBUG 14*6fafe54fSHermès Bélusca-Maïto #include <debug.h> 15*6fafe54fSHermès Bélusca-Maïto 16*6fafe54fSHermès Bélusca-Maïto #if defined(SARCH_PC98) 17*6fafe54fSHermès Bélusca-Maïto #define DEFAULT_BAUD_RATE 9600 18*6fafe54fSHermès Bélusca-Maïto #else 19*6fafe54fSHermès Bélusca-Maïto #define DEFAULT_BAUD_RATE 19200 20*6fafe54fSHermès Bélusca-Maïto #endif 21*6fafe54fSHermès Bélusca-Maïto 22*6fafe54fSHermès Bélusca-Maïto #if defined(_M_IX86) || defined(_M_AMD64) 23*6fafe54fSHermès Bélusca-Maïto #if defined(SARCH_PC98) 24*6fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x30, 0x238}; 25*6fafe54fSHermès Bélusca-Maïto #else 26*6fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8}; 27*6fafe54fSHermès Bélusca-Maïto #endif 28*6fafe54fSHermès Bélusca-Maïto #elif defined(_M_PPC) 29*6fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x800003F8}; 30*6fafe54fSHermès Bélusca-Maïto #elif defined(_M_MIPS) 31*6fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0x80006000, 0x80007000}; 32*6fafe54fSHermès Bélusca-Maïto #elif defined(_M_ARM) 33*6fafe54fSHermès Bélusca-Maïto const ULONG BaseArray[] = {0, 0xF1012000}; 34*6fafe54fSHermès Bélusca-Maïto #else 35*6fafe54fSHermès Bélusca-Maïto #error Unknown architecture 36*6fafe54fSHermès Bélusca-Maïto #endif 37*6fafe54fSHermès Bélusca-Maïto 38*6fafe54fSHermès Bélusca-Maïto #define MAX_COM_PORTS (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1) 39*6fafe54fSHermès Bélusca-Maïto 40*6fafe54fSHermès Bélusca-Maïto /* STATIC VARIABLES ***********************************************************/ 41*6fafe54fSHermès Bélusca-Maïto 42*6fafe54fSHermès Bélusca-Maïto // static CPPORT DefaultPort = {0, 0, 0}; 43*6fafe54fSHermès Bélusca-Maïto 44*6fafe54fSHermès Bélusca-Maïto /* The COM port must only be initialized once! */ 45*6fafe54fSHermès Bélusca-Maïto // static BOOLEAN PortInitialized = FALSE; 46*6fafe54fSHermès Bélusca-Maïto 47*6fafe54fSHermès Bélusca-Maïto /* REACTOS FUNCTIONS **********************************************************/ 48*6fafe54fSHermès Bélusca-Maïto 49*6fafe54fSHermès Bélusca-Maïto BOOLEAN 50*6fafe54fSHermès Bélusca-Maïto NTAPI 51*6fafe54fSHermès Bélusca-Maïto KdPortInitializeEx( 52*6fafe54fSHermès Bélusca-Maïto IN PCPPORT PortInformation, 53*6fafe54fSHermès Bélusca-Maïto IN ULONG ComPortNumber) 54*6fafe54fSHermès Bélusca-Maïto { 55*6fafe54fSHermès Bélusca-Maïto NTSTATUS Status; 56*6fafe54fSHermès Bélusca-Maïto 57*6fafe54fSHermès Bélusca-Maïto #if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use KdPortInitializeEx) 58*6fafe54fSHermès Bélusca-Maïto /* 59*6fafe54fSHermès Bélusca-Maïto * Find the port if needed 60*6fafe54fSHermès Bélusca-Maïto */ 61*6fafe54fSHermès Bélusca-Maïto 62*6fafe54fSHermès Bélusca-Maïto if (!PortInitialized) 63*6fafe54fSHermès Bélusca-Maïto { 64*6fafe54fSHermès Bélusca-Maïto DefaultPort.BaudRate = PortInformation->BaudRate; 65*6fafe54fSHermès Bélusca-Maïto 66*6fafe54fSHermès Bélusca-Maïto if (ComPortNumber == 0) 67*6fafe54fSHermès Bélusca-Maïto { 68*6fafe54fSHermès Bélusca-Maïto /* 69*6fafe54fSHermès Bélusca-Maïto * Start enumerating COM ports from the last one to the first one, 70*6fafe54fSHermès Bélusca-Maïto * and break when we find a valid port. 71*6fafe54fSHermès Bélusca-Maïto * If we reach the first element of the list, the invalid COM port, 72*6fafe54fSHermès Bélusca-Maïto * then it means that no valid port was found. 73*6fafe54fSHermès Bélusca-Maïto */ 74*6fafe54fSHermès Bélusca-Maïto for (ComPortNumber = MAX_COM_PORTS; ComPortNumber > 0; ComPortNumber--) 75*6fafe54fSHermès Bélusca-Maïto { 76*6fafe54fSHermès Bélusca-Maïto if (CpDoesPortExist(UlongToPtr(BaseArray[ComPortNumber]))) 77*6fafe54fSHermès Bélusca-Maïto { 78*6fafe54fSHermès Bélusca-Maïto PortInformation->Address = DefaultPort.Address = BaseArray[ComPortNumber]; 79*6fafe54fSHermès Bélusca-Maïto break; 80*6fafe54fSHermès Bélusca-Maïto } 81*6fafe54fSHermès Bélusca-Maïto } 82*6fafe54fSHermès Bélusca-Maïto if (ComPortNumber == 0) 83*6fafe54fSHermès Bélusca-Maïto { 84*6fafe54fSHermès Bélusca-Maïto HalDisplayString("\r\nKernel Debugger: No COM port found!\r\n\r\n"); 85*6fafe54fSHermès Bélusca-Maïto return FALSE; 86*6fafe54fSHermès Bélusca-Maïto } 87*6fafe54fSHermès Bélusca-Maïto } 88*6fafe54fSHermès Bélusca-Maïto 89*6fafe54fSHermès Bélusca-Maïto PortInitialized = TRUE; 90*6fafe54fSHermès Bélusca-Maïto } 91*6fafe54fSHermès Bélusca-Maïto #endif 92*6fafe54fSHermès Bélusca-Maïto 93*6fafe54fSHermès Bélusca-Maïto /* 94*6fafe54fSHermès Bélusca-Maïto * Initialize the port 95*6fafe54fSHermès Bélusca-Maïto */ 96*6fafe54fSHermès Bélusca-Maïto Status = CpInitialize(PortInformation, 97*6fafe54fSHermès Bélusca-Maïto (ComPortNumber == 0 ? PortInformation->Address 98*6fafe54fSHermès Bélusca-Maïto : UlongToPtr(BaseArray[ComPortNumber])), 99*6fafe54fSHermès Bélusca-Maïto (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE 100*6fafe54fSHermès Bélusca-Maïto : PortInformation->BaudRate)); 101*6fafe54fSHermès Bélusca-Maïto if (!NT_SUCCESS(Status)) 102*6fafe54fSHermès Bélusca-Maïto { 103*6fafe54fSHermès Bélusca-Maïto HalDisplayString("\r\nKernel Debugger: Serial port not found!\r\n\r\n"); 104*6fafe54fSHermès Bélusca-Maïto return FALSE; 105*6fafe54fSHermès Bélusca-Maïto } 106*6fafe54fSHermès Bélusca-Maïto else 107*6fafe54fSHermès Bélusca-Maïto { 108*6fafe54fSHermès Bélusca-Maïto #ifndef NDEBUG 109*6fafe54fSHermès Bélusca-Maïto CHAR buffer[80]; 110*6fafe54fSHermès Bélusca-Maïto 111*6fafe54fSHermès Bélusca-Maïto /* Print message to blue screen */ 112*6fafe54fSHermès Bélusca-Maïto sprintf(buffer, 113*6fafe54fSHermès Bélusca-Maïto "\r\nKernel Debugger: Serial port found: COM%ld (Port 0x%p) BaudRate %ld\r\n\r\n", 114*6fafe54fSHermès Bélusca-Maïto ComPortNumber, 115*6fafe54fSHermès Bélusca-Maïto PortInformation->Address, 116*6fafe54fSHermès Bélusca-Maïto PortInformation->BaudRate); 117*6fafe54fSHermès Bélusca-Maïto HalDisplayString(buffer); 118*6fafe54fSHermès Bélusca-Maïto #endif /* NDEBUG */ 119*6fafe54fSHermès Bélusca-Maïto 120*6fafe54fSHermès Bélusca-Maïto #if 0 121*6fafe54fSHermès Bélusca-Maïto /* Set global info */ 122*6fafe54fSHermès Bélusca-Maïto KdComPortInUse = DefaultPort.Address; 123*6fafe54fSHermès Bélusca-Maïto #endif 124*6fafe54fSHermès Bélusca-Maïto return TRUE; 125*6fafe54fSHermès Bélusca-Maïto } 126*6fafe54fSHermès Bélusca-Maïto } 127*6fafe54fSHermès Bélusca-Maïto 128*6fafe54fSHermès Bélusca-Maïto BOOLEAN 129*6fafe54fSHermès Bélusca-Maïto NTAPI 130*6fafe54fSHermès Bélusca-Maïto KdPortGetByteEx( 131*6fafe54fSHermès Bélusca-Maïto IN PCPPORT PortInformation, 132*6fafe54fSHermès Bélusca-Maïto OUT PUCHAR ByteReceived) 133*6fafe54fSHermès Bélusca-Maïto { 134*6fafe54fSHermès Bélusca-Maïto return (CpGetByte(PortInformation, ByteReceived, FALSE, FALSE) == CP_GET_SUCCESS); 135*6fafe54fSHermès Bélusca-Maïto } 136*6fafe54fSHermès Bélusca-Maïto 137*6fafe54fSHermès Bélusca-Maïto VOID 138*6fafe54fSHermès Bélusca-Maïto NTAPI 139*6fafe54fSHermès Bélusca-Maïto KdPortPutByteEx( 140*6fafe54fSHermès Bélusca-Maïto IN PCPPORT PortInformation, 141*6fafe54fSHermès Bélusca-Maïto IN UCHAR ByteToSend) 142*6fafe54fSHermès Bélusca-Maïto { 143*6fafe54fSHermès Bélusca-Maïto CpPutByte(PortInformation, ByteToSend); 144*6fafe54fSHermès Bélusca-Maïto } 145*6fafe54fSHermès Bélusca-Maïto 146*6fafe54fSHermès Bélusca-Maïto /* EOF */ 147