ReactOS  0.4.15-dev-449-g64abd9f
gdb_receive.c File Reference
#include "kdgdb.h"
Include dependency graph for gdb_receive.c:

Go to the source code of this file.

Functions

char hex_value (char ch)
 
KDSTATUS NTAPI gdb_receive_packet (_Inout_ PKD_CONTEXT KdContext)
 

Variables

CHAR gdb_input [0x1000]
 

Function Documentation

◆ gdb_receive_packet()

KDSTATUS NTAPI gdb_receive_packet ( _Inout_ PKD_CONTEXT  KdContext)

Definition at line 31 of file gdb_receive.c.

32 {
33  UCHAR* ByteBuffer;
34  UCHAR Byte;
36  CHAR CheckSum, ReceivedCheckSum;
37 
38  do
39  {
41  if (Status != KdPacketReceived)
42  return Status;
43  } while (Byte != '$');
44 
45 get_packet:
46  CheckSum = 0;
47  ByteBuffer = (UCHAR*)gdb_input;
48 
49  while (TRUE)
50  {
51  /* Try to get a byte from the port */
53  if (Status != KdPacketReceived)
54  return Status;
55 
56  if (Byte == '#')
57  {
58  *ByteBuffer = '\0';
59  break;
60  }
61  CheckSum += (CHAR)Byte;
62 
63  /* See if we should escape */
64  if (Byte == 0x7d)
65  {
67  if (Status != KdPacketReceived)
68  return Status;
69  CheckSum += (CHAR)Byte;
70  Byte ^= 0x20;
71  }
72  *ByteBuffer++ = Byte;
73  }
74 
75  /* Get Check sum (two bytes) */
77  if (Status != KdPacketReceived)
78  goto end;
79  ReceivedCheckSum = hex_value(Byte) << 4;
80 
82  if (Status != KdPacketReceived)
83  goto end;
84  ReceivedCheckSum += hex_value(Byte);
85 
86 end:
87  if (ReceivedCheckSum != CheckSum)
88  {
89  /* Do not acknowledge to GDB */
90  KDDBGPRINT("Check sums don't match!");
91  KdpSendByte('-');
92  return KdPacketNeedsResend;
93  }
94 
95  /* Ensure there is nothing left in the pipe */
96  while (KdpPollByte(&Byte) == KdPacketReceived)
97  {
98  switch (Byte)
99  {
100  case '$':
101  KDDBGPRINT("Received new packet just after %s.\n", gdb_input);
102  goto get_packet;
103  case 0x03:
104  KdContext->KdpControlCPending = TRUE;
105  break;
106  }
107  }
108 
109  /* Acknowledge */
110  KdpSendByte('+');
111 
112  return KdPacketReceived;
113 }
#define KdPacketReceived
Definition: kddll.h:5
#define TRUE
Definition: types.h:120
#define KDDBGPRINT(...)
Definition: kddll.h:19
unsigned char Byte
Definition: zconf.h:391
char CHAR
Definition: xmlstorage.h:175
KDP_STATUS NTAPI KdpReceiveByte(OUT PUCHAR OutByte)
Definition: kdcom.c:321
GLuint GLuint end
Definition: gl.h:1545
#define KdPacketNeedsResend
Definition: kddll.h:7
char hex_value(char ch)
Definition: gdb_receive.c:15
KDP_STATUS NTAPI KdpPollByte(OUT PUCHAR OutByte)
Definition: kdcom.c:299
UCHAR CheckSum(LPSTR p, ULONG Len)
Definition: serial.c:197
VOID NTAPI KdpSendByte(IN UCHAR Byte)
Definition: kdcom.c:291
unsigned char UCHAR
Definition: xmlstorage.h:181
Status
Definition: gdiplustypes.h:24
ULONG KDSTATUS
Definition: kddll.h:4
CHAR gdb_input[0x1000]
Definition: gdb_receive.c:11
#define CHAR(Char)

Referenced by gdb_receive_and_interpret_packet().

◆ hex_value()

char hex_value ( char  ch)

Definition at line 15 of file gdb_receive.c.

16 {
17  if ((ch >= '0') && (ch <= '9'))
18  return (ch - '0');
19 
20  if ((ch >= 'a') && (ch <= 'f'))
21  return (ch - 'a' + 10);
22 
23  if ((ch >= 'A') && (ch <= 'F'))
24  return (ch - 'A' + 10);
25 
26  return -1;
27 }

Referenced by gdb_receive_packet(), gdb_send_register(), hex_to_address(), and hex_to_tid().

Variable Documentation

◆ gdb_input