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