xref: /reactos/ntoskrnl/kd/i386/kdserial.c (revision 6fafe54f)
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