ReactOS  0.4.15-dev-985-gd905dd5
kdcom.c File Reference
#include "kdgdb.h"
#include <cportlib/cportlib.h>
#include <arc/arc.h>
#include <stdlib.h>
#include <ndk/halfuncs.h>
Include dependency graph for kdcom.c:

Go to the source code of this file.

Macros

#define DEFAULT_DEBUG_PORT   2 /* COM2 */
 
#define DEFAULT_DEBUG_COM1_IRQ   4
 
#define DEFAULT_DEBUG_COM2_IRQ   3
 
#define DEFAULT_DEBUG_BAUD_RATE   115200
 
#define DEFAULT_BAUD_RATE   19200
 
#define MAX_COM_PORTS   (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1)
 

Functions

NTSTATUS NTAPI KdD0Transition (VOID)
 
NTSTATUS NTAPI KdD3Transition (VOID)
 
NTSTATUS NTAPI KdSave (IN BOOLEAN SleepTransition)
 
NTSTATUS NTAPI KdRestore (IN BOOLEAN SleepTransition)
 
NTSTATUS NTAPI KdpPortInitialize (IN ULONG ComPortNumber, IN ULONG ComPortBaudRate)
 
NTSTATUS NTAPI KdDebuggerInitialize0 (IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
 
NTSTATUS NTAPI KdDebuggerInitialize1 (IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
 
VOID NTAPI KdpSendByte (_In_ UCHAR Byte)
 
KDSTATUS NTAPI KdpPollByte (OUT PUCHAR OutByte)
 
KDSTATUS NTAPI KdpReceiveByte (_Out_ PUCHAR OutByte)
 
KDSTATUS NTAPI KdpPollBreakIn (VOID)
 

Variables

CPPORT KdComPort
 
ULONG KdComPortIrq = 0
 

Macro Definition Documentation

◆ DEFAULT_BAUD_RATE

#define DEFAULT_BAUD_RATE   19200

Definition at line 27 of file kdcom.c.

◆ DEFAULT_DEBUG_BAUD_RATE

#define DEFAULT_DEBUG_BAUD_RATE   115200

Definition at line 26 of file kdcom.c.

◆ DEFAULT_DEBUG_COM1_IRQ

#define DEFAULT_DEBUG_COM1_IRQ   4

Definition at line 24 of file kdcom.c.

◆ DEFAULT_DEBUG_COM2_IRQ

#define DEFAULT_DEBUG_COM2_IRQ   3

Definition at line 25 of file kdcom.c.

◆ DEFAULT_DEBUG_PORT

#define DEFAULT_DEBUG_PORT   2 /* COM2 */

Definition at line 23 of file kdcom.c.

◆ MAX_COM_PORTS

#define MAX_COM_PORTS   (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1)

Definition at line 46 of file kdcom.c.

Function Documentation

◆ KdD0Transition()

NTSTATUS NTAPI KdD0Transition ( VOID  )

Definition at line 97 of file kdcom.c.

98 {
99  return STATUS_SUCCESS;
100 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ KdD3Transition()

NTSTATUS NTAPI KdD3Transition ( VOID  )

Definition at line 104 of file kdcom.c.

105 {
106  return STATUS_SUCCESS;
107 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ KdDebuggerInitialize0()

NTSTATUS NTAPI KdDebuggerInitialize0 ( IN PLOADER_PARAMETER_BLOCK LoaderBlock  OPTIONAL)

Definition at line 152 of file kdcom.c.

153 {
154  ULONG ComPortNumber = DEFAULT_DEBUG_PORT;
155  ULONG ComPortBaudRate = DEFAULT_DEBUG_BAUD_RATE;
156 
157  PCHAR CommandLine, PortString, BaudString, IrqString;
158  ULONG Value;
159 
160  /* Check if we have a LoaderBlock */
161  if (LoaderBlock)
162  {
163  /* Get the Command Line */
164  CommandLine = LoaderBlock->LoadOptions;
165 
166  /* Upcase it */
167  _strupr(CommandLine);
168 
169  /* Get the port and baud rate */
170  PortString = strstr(CommandLine, "DEBUGPORT");
171  BaudString = strstr(CommandLine, "BAUDRATE");
172  IrqString = strstr(CommandLine, "IRQ");
173 
174  /* Check if we got the /DEBUGPORT parameter */
175  if (PortString)
176  {
177  /* Move past the actual string, to reach the port*/
178  PortString += strlen("DEBUGPORT");
179 
180  /* Now get past any spaces and skip the equal sign */
181  while (*PortString == ' ') PortString++;
182  PortString++;
183 
184  /* Do we have a serial port? */
185  if (strncmp(PortString, "COM", 3) != 0)
186  {
188  }
189 
190  /* Check for a valid Serial Port */
191  PortString += 3;
192  Value = atol(PortString);
193  if (Value >= sizeof(BaseArray) / sizeof(BaseArray[0]))
194  {
196  }
197 
198  /* Set the port to use */
199  ComPortNumber = Value;
200  }
201 
202  /* Check if we got a baud rate */
203  if (BaudString)
204  {
205  /* Move past the actual string, to reach the rate */
206  BaudString += strlen("BAUDRATE");
207 
208  /* Now get past any spaces */
209  while (*BaudString == ' ') BaudString++;
210 
211  /* And make sure we have a rate */
212  if (*BaudString)
213  {
214  /* Read and set it */
215  Value = atol(BaudString + 1);
216  if (Value) ComPortBaudRate = Value;
217  }
218  }
219 
220  /* Check Serial Port Settings [IRQ] */
221  if (IrqString)
222  {
223  /* Move past the actual string, to reach the rate */
224  IrqString += strlen("IRQ");
225 
226  /* Now get past any spaces */
227  while (*IrqString == ' ') IrqString++;
228 
229  /* And make sure we have an IRQ */
230  if (*IrqString)
231  {
232  /* Read and set it */
233  Value = atol(IrqString + 1);
234  if (Value) KdComPortIrq = Value;
235  }
236  }
237  }
238 
239 #ifdef KDDEBUG
240  /*
241  * Try to find a free COM port and use it as the KD debugging port.
242  * NOTE: Inspired by reactos/boot/freeldr/freeldr/comm/rs232.c, Rs232PortInitialize(...)
243  */
244  {
245  /*
246  * Start enumerating COM ports from the last one to the first one,
247  * and break when we find a valid port.
248  * If we reach the first element of the list, the invalid COM port,
249  * then it means that no valid port was found.
250  */
251  ULONG ComPort;
252  for (ComPort = MAX_COM_PORTS; ComPort > 0; ComPort--)
253  {
254  /* Check if the port exist; skip the KD port */
255  if ((ComPort != ComPortNumber) && CpDoesPortExist(UlongToPtr(BaseArray[ComPort])))
256  break;
257  }
258  if (ComPort != 0)
259  CpInitialize(&KdDebugComPort, UlongToPtr(BaseArray[ComPort]), DEFAULT_BAUD_RATE);
260  }
261 #endif
262 
263  /* Initialize the port */
264  return KdpPortInitialize(ComPortNumber, ComPortBaudRate);
265 }
signed char * PCHAR
Definition: retypes.h:7
#define DEFAULT_DEBUG_BAUD_RATE
Definition: kdcom.c:26
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
IN UCHAR Value
Definition: halp.h:394
BOOLEAN NTAPI CpDoesPortExist(IN PUCHAR Address)
Definition: cport.c:227
#define MAX_COM_PORTS
Definition: kdcom.c:46
#define DEFAULT_BAUD_RATE
Definition: kdcom.c:27
#define UlongToPtr(u)
Definition: config.h:106
ULONG KdComPortIrq
Definition: kdcom.c:53
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
_Check_return_ long __cdecl atol(_In_z_ const char *_Str)
NTSTATUS NTAPI CpInitialize(IN PCPPORT Port, IN PUCHAR Address, IN ULONG BaudRate)
Definition: cport.c:88
_CRTIMP char *__cdecl _strupr(_Inout_z_ char *_String)
static const ULONG BaseArray[]
Definition: hwide.c:41
unsigned int ULONG
Definition: retypes.h:1
#define DEFAULT_DEBUG_PORT
Definition: kdcom.c:23
NTSTATUS NTAPI KdpPortInitialize(IN ULONG ComPortNumber, IN ULONG ComPortBaudRate)
Definition: kdcom.c:129

◆ KdDebuggerInitialize1()

NTSTATUS NTAPI KdDebuggerInitialize1 ( IN PLOADER_PARAMETER_BLOCK LoaderBlock  OPTIONAL)

Definition at line 275 of file kdcom.c.

276 {
277  return STATUS_SUCCESS;
278 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ KdpPollBreakIn()

KDSTATUS NTAPI KdpPollBreakIn ( VOID  )

Definition at line 326 of file kdcom.c.

327 {
328  KDSTATUS KdStatus;
329  UCHAR Byte;
330 
331  KdStatus = KdpPollByte(&Byte);
332  if (KdStatus == KdPacketReceived)
333  {
334  if (Byte == 0x03)
335  {
336  KDDBGPRINT("BreakIn Polled.\n");
337  return KdPacketReceived;
338  }
339  else if (Byte == '$')
340  {
341  /* GDB tried to send a new packet. N-ack it. */
342  KdpSendByte('-');
343  }
344  }
345  return KdPacketTimedOut;
346 }
#define KdPacketReceived
Definition: kddll.h:5
#define KDDBGPRINT(...)
Definition: kddll.h:19
KDP_STATUS NTAPI KdpPollByte(OUT PUCHAR OutByte)
Definition: kdcom.c:299
#define KdPacketTimedOut
Definition: kddll.h:6
VOID NTAPI KdpSendByte(IN UCHAR Byte)
Definition: kdcom.c:291
unsigned char UCHAR
Definition: xmlstorage.h:181
ULONG KDSTATUS
Definition: kddll.h:4
unsigned char Byte
Definition: zlib.h:37

◆ KdpPollByte()

KDSTATUS NTAPI KdpPollByte ( OUT PUCHAR  OutByte)

Definition at line 291 of file kdcom.c.

292 {
293  /* Poll the byte */
294  if (CpGetByte(&KdComPort, OutByte, FALSE, FALSE) == CP_GET_SUCCESS)
295  {
296  return KdPacketReceived;
297  }
298  else
299  {
300  return KdPacketTimedOut;
301  }
302 }
#define KdPacketReceived
Definition: kddll.h:5
USHORT NTAPI CpGetByte(IN PCPPORT Port, OUT PUCHAR Byte, IN BOOLEAN Wait, IN BOOLEAN Poll)
Definition: cport.c:256
#define FALSE
Definition: types.h:117
CPPORT KdComPort
Definition: kdcom.c:52
#define KdPacketTimedOut
Definition: kddll.h:6
#define CP_GET_SUCCESS
Definition: cportlib.h:18

◆ KdpPortInitialize()

NTSTATUS NTAPI KdpPortInitialize ( IN ULONG  ComPortNumber,
IN ULONG  ComPortBaudRate 
)

Definition at line 127 of file kdcom.c.

129 {
131 
133  UlongToPtr(BaseArray[ComPortNumber]),
134  ComPortBaudRate);
135  if (!NT_SUCCESS(Status))
136  {
138  }
139 
141  return STATUS_SUCCESS;
142 }
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
CPPORT KdComPort
Definition: kdcom.c:52
#define UlongToPtr(u)
Definition: config.h:106
PUCHAR KdComPortInUse
Definition: usage.c:17
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI CpInitialize(IN PCPPORT Port, IN PUCHAR Address, IN ULONG BaudRate)
Definition: cport.c:88
PUCHAR Address
Definition: cportlib.h:29
static const ULONG BaseArray[]
Definition: hwide.c:41
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ KdpReceiveByte()

KDSTATUS NTAPI KdpReceiveByte ( _Out_ PUCHAR  OutByte)

Definition at line 306 of file kdcom.c.

307 {
308  USHORT CpStatus;
309 
310  do
311  {
312  CpStatus = CpGetByte(&KdComPort, OutByte, TRUE, FALSE);
313  } while (CpStatus == CP_GET_NODATA);
314 
315  /* Get the byte */
316  if (CpStatus == CP_GET_SUCCESS)
317  {
318  return KdPacketReceived;
319  }
320 
321  return KdPacketTimedOut;
322 }
#define KdPacketReceived
Definition: kddll.h:5
#define TRUE
Definition: types.h:120
USHORT NTAPI CpGetByte(IN PCPPORT Port, OUT PUCHAR Byte, IN BOOLEAN Wait, IN BOOLEAN Poll)
Definition: cport.c:256
#define FALSE
Definition: types.h:117
CPPORT KdComPort
Definition: kdcom.c:52
#define KdPacketTimedOut
Definition: kddll.h:6
unsigned short USHORT
Definition: pedump.c:61
#define CP_GET_SUCCESS
Definition: cportlib.h:18
#define CP_GET_NODATA
Definition: cportlib.h:19

◆ KdpSendByte()

VOID NTAPI KdpSendByte ( _In_ UCHAR  Byte)

Definition at line 283 of file kdcom.c.

284 {
285  /* Send the byte */
287 }
CPPORT KdComPort
Definition: kdcom.c:52
VOID NTAPI CpPutByte(IN PCPPORT Port, IN UCHAR Byte)
Definition: cport.c:306
unsigned char Byte
Definition: zlib.h:37

◆ KdRestore()

NTSTATUS NTAPI KdRestore ( IN BOOLEAN  SleepTransition)

Definition at line 119 of file kdcom.c.

120 {
121  /* Nothing to do on COM ports */
122  return STATUS_SUCCESS;
123 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ KdSave()

NTSTATUS NTAPI KdSave ( IN BOOLEAN  SleepTransition)

Definition at line 111 of file kdcom.c.

112 {
113  /* Nothing to do on COM ports */
114  return STATUS_SUCCESS;
115 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

Variable Documentation

◆ KdComPort

CPPORT KdComPort

Definition at line 50 of file kdcom.c.

◆ KdComPortIrq

ULONG KdComPortIrq = 0

Definition at line 51 of file kdcom.c.