ReactOS 0.4.15-dev-7918-g2a2556c
kdserial.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/kd/i386/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#if defined(SARCH_PC98)
17#define DEFAULT_BAUD_RATE 9600
18#else
19#define DEFAULT_BAUD_RATE 19200
20#endif
21
22#if defined(_M_IX86) || defined(_M_AMD64)
23#if defined(SARCH_PC98)
24const ULONG BaseArray[] = {0, 0x30, 0x238};
25#else
26const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
27#endif
28#elif defined(_M_PPC)
29const ULONG BaseArray[] = {0, 0x800003F8};
30#elif defined(_M_MIPS)
31const ULONG BaseArray[] = {0, 0x80006000, 0x80007000};
32#elif defined(_M_ARM)
33const ULONG BaseArray[] = {0, 0xF1012000};
34#else
35#error Unknown architecture
36#endif
37
38#define MAX_COM_PORTS (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1)
39
40/* STATIC VARIABLES ***********************************************************/
41
42// static CPPORT DefaultPort = {0, 0, 0};
43
44/* The COM port must only be initialized once! */
45// static BOOLEAN PortInitialized = FALSE;
46
47/* REACTOS FUNCTIONS **********************************************************/
48
53 IN ULONG ComPortNumber)
54{
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
62 if (!PortInitialized)
63 {
65
66 if (ComPortNumber == 0)
67 {
68 /*
69 * Start enumerating COM ports from the last one to the first one,
70 * and break when we find a valid port.
71 * If we reach the first element of the list, the invalid COM port,
72 * then it means that no valid port was found.
73 */
74 for (ComPortNumber = MAX_COM_PORTS; ComPortNumber > 0; ComPortNumber--)
75 {
76 if (CpDoesPortExist(UlongToPtr(BaseArray[ComPortNumber])))
77 {
78 PortInformation->Address = DefaultPort.Address = BaseArray[ComPortNumber];
79 break;
80 }
81 }
82 if (ComPortNumber == 0)
83 {
84 HalDisplayString("\r\nKernel Debugger: No COM port found!\r\n\r\n");
85 return FALSE;
86 }
87 }
88
89 PortInitialized = TRUE;
90 }
91#endif
92
93 /*
94 * Initialize the port
95 */
97 (ComPortNumber == 0 ? PortInformation->Address
98 : UlongToPtr(BaseArray[ComPortNumber])),
99 (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE
100 : PortInformation->BaudRate));
101 if (!NT_SUCCESS(Status))
102 {
103 HalDisplayString("\r\nKernel Debugger: Serial port not found!\r\n\r\n");
104 return FALSE;
105 }
106 else
107 {
108#ifndef NDEBUG
109 int Length;
110 CHAR Buffer[82];
111
112 /* Print message to blue screen */
113 Length = snprintf(Buffer, sizeof(Buffer),
114 "\r\nKernel Debugger: Serial port found: COM%ld (Port 0x%p) BaudRate %ld\r\n\r\n",
115 ComPortNumber,
116 PortInformation->Address,
117 PortInformation->BaudRate);
118 if (Length == -1)
119 {
120 /* Terminate it if we went over-board */
121 Buffer[sizeof(Buffer) - 1] = ANSI_NULL;
122 }
123
125#endif /* NDEBUG */
126
127#if 0
128 /* Set global info */
130#endif
131 return TRUE;
132 }
133}
134
136NTAPI
139 OUT PUCHAR ByteReceived)
140{
141 return (CpGetByte(PortInformation, ByteReceived, FALSE, FALSE) == CP_GET_SUCCESS);
142}
143
144VOID
145NTAPI
148 IN UCHAR ByteToSend)
149{
150 CpPutByte(PortInformation, ByteToSend);
151}
152
153/* EOF */
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
VOID NTAPI CpPutByte(IN PCPPORT Port, IN UCHAR Byte)
Definition: cport.c:303
NTSTATUS NTAPI CpInitialize(IN PCPPORT Port, IN PUCHAR Address, IN ULONG BaudRate)
Definition: cport.c:85
#define CP_GET_SUCCESS
Definition: cportlib.h:18
USHORT NTAPI CpGetByte(IN PCPPORT Port, OUT PUCHAR Byte, IN BOOLEAN Wait, IN BOOLEAN Poll)
Definition: cport.c:253
BOOLEAN NTAPI CpDoesPortExist(IN PUCHAR Address)
Definition: cport.c:224
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define UlongToPtr(u)
Definition: config.h:106
IN CINT OUT PVOID PortInformation
Definition: dumpinfo.c:40
Status
Definition: gdiplustypes.h:25
PUCHAR KdComPortInUse
Definition: usage.c:17
static const ULONG BaseArray[]
Definition: hwide.c:41
NTHALAPI VOID NTAPI HalDisplayString(PUCHAR String)
#define ANSI_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
VOID NTAPI KdPortPutByteEx(IN PCPPORT PortInformation, IN UCHAR ByteToSend)
Definition: kdserial.c:91
BOOLEAN NTAPI KdPortInitializeEx(IN PCPPORT PortInformation, IN ULONG ComPortNumber)
Definition: kdserial.c:30
CPPORT DefaultPort
Definition: kdserial.c:18
BOOLEAN NTAPI KdPortGetByteEx(IN PCPPORT PortInformation, OUT PUCHAR ByteReceived)
Definition: kdserial.c:81
#define DEFAULT_BAUD_RATE
Definition: kdserial.c:19
#define MAX_COM_PORTS
Definition: kdserial.c:38
PUCHAR Address
Definition: cportlib.h:29
ULONG BaudRate
Definition: cportlib.h:30
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define snprintf
Definition: wintirpc.h:48
unsigned char UCHAR
Definition: xmlstorage.h:181
char CHAR
Definition: xmlstorage.h:175