2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/base/kddll/gdb_send.c
5 * PURPOSE: Base functions for the kernel debugger.
10 /* LOCALS *********************************************************************/
11 const char hex_chars
[] = "0123456789abcdef";
13 /* PRIVATE FUNCTIONS **********************************************************/
16 exception_code_to_gdb(NTSTATUS code
, char* out
)
22 case STATUS_INTEGER_DIVIDE_BY_ZERO
:
23 SigVal
= 8; /* divide by zero */
25 case STATUS_SINGLE_STEP
:
26 case STATUS_BREAKPOINT
:
27 SigVal
= 5; /* breakpoint */
29 case STATUS_INTEGER_OVERFLOW
:
30 case STATUS_ARRAY_BOUNDS_EXCEEDED
:
31 SigVal
= 16; /* bound instruction */
33 case STATUS_ILLEGAL_INSTRUCTION
:
34 SigVal
= 4; /* Invalid opcode */
36 case STATUS_STACK_OVERFLOW
:
37 case STATUS_DATATYPE_MISALIGNMENT
:
38 case STATUS_ACCESS_VIOLATION
:
39 SigVal
= 11; /* access violation */
42 SigVal
= 7; /* "software generated" */
44 *out
++ = hex_chars
[(SigVal
>> 4) & 0xf];
45 *out
++ = hex_chars
[SigVal
& 0xf];
49 /* GLOBAL FUNCTIONS ***********************************************************/
51 send_gdb_packet(_In_ CHAR
* Buffer
)
61 /* Calculate checksum */
71 KdpSendByte(hex_chars
[(check_sum
>> 4) & 0xf]);
72 KdpSendByte(hex_chars
[check_sum
& 0xf]);
74 /* Wait for acknowledgement */
75 if (KdpReceiveByte(&ack
) != KdPacketReceived
)
77 KD_DEBUGGER_NOT_PRESENT
= TRUE
;
102 Byte
= hex_chars
[(*ptr
>> 4) & 0xf];
105 Byte
= hex_chars
[*ptr
++ & 0xf];
110 /* append check sum */
112 KdpSendByte(hex_chars
[(check_sum
>> 4) & 0xf]);
113 KdpSendByte(hex_chars
[check_sum
& 0xf]);
115 /* Wait for acknowledgement */
116 if (KdpReceiveByte(&ack
) != KdPacketReceived
)
118 KD_DEBUGGER_NOT_PRESENT
= TRUE
;
121 } while (ack
!= '+');
131 CHAR
* ptr
= String
->Buffer
;
133 USHORT Length
= String
->Length
;
144 Byte
= hex_chars
[(*ptr
>> 4) & 0xf];
147 Byte
= hex_chars
[*ptr
++ & 0xf];
152 /* append check sum */
154 KdpSendByte(hex_chars
[(check_sum
>> 4) & 0xf]);
155 KdpSendByte(hex_chars
[check_sum
& 0xf]);
157 /* Wait for acknowledgement */
158 if (KdpReceiveByte(&ack
) != KdPacketReceived
)
160 KD_DEBUGGER_NOT_PRESENT
= TRUE
;
163 } while (ack
!= '+');
167 gdb_send_exception(void)
171 DBGKM_EXCEPTION64
* Exception
= NULL
;
173 if (CurrentStateChange
.NewState
== DbgKdExceptionStateChange
)
174 Exception
= &CurrentStateChange
.u
.Exception
;
179 ptr
= exception_code_to_gdb(Exception
->ExceptionRecord
.ExceptionCode
, ptr
);
181 ptr
+= sprintf(ptr
, "05");
182 ptr
+= sprintf(ptr
, "thread:p%p.%p;",
183 PsGetThreadProcessId((PETHREAD
)(ULONG_PTR
)CurrentStateChange
.Thread
),
184 PsGetThreadId((PETHREAD
)(ULONG_PTR
)CurrentStateChange
.Thread
));
185 ptr
+= sprintf(ptr
, "core:%x;", CurrentStateChange
.Processor
);
186 send_gdb_packet(gdb_out
);