Author: dgorbachev
Date: Mon Jun 22 17:26:12 2009
New Revision: 41537
URL:
http://svn.reactos.org/svn/reactos?rev=41537&view=rev
Log:
[FORMATTING]
Modified:
trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/wrappers/gdbst…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] Mon Jun 22 17:26:12 2009
@@ -33,9 +33,9 @@
static BOOLEAN GspInitialized;
static BOOLEAN GspRemoteDebug;
-static CONST CHAR HexChars[]="0123456789abcdef";
-
-static PETHREAD GspRunThread; /* NULL means run all threads */
+static CONST CHAR HexChars[] = "0123456789abcdef";
+
+static PETHREAD GspRunThread; /* NULL means run all threads */
static PETHREAD GspDbgThread;
static PETHREAD GspEnumThread;
@@ -54,202 +54,192 @@
enum REGISTER_NAMES
{
- EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
- PC /* also known as eip */,
- PS /* also known as eflags */,
- CS, SS, DS, ES, FS, GS
+ EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+ PC /* also known as eip */ ,
+ PS /* also known as eflags */ ,
+ CS, SS, DS, ES, FS, GS
};
typedef struct _CPU_REGISTER
{
- ULONG Size;
- ULONG OffsetInTF;
- ULONG OffsetInContext;
- BOOLEAN SetInContext;
+ ULONG Size;
+ ULONG OffsetInTF;
+ ULONG OffsetInContext;
+ BOOLEAN SetInContext;
} CPU_REGISTER, *PCPU_REGISTER;
static CPU_REGISTER GspRegisters[NUMREGS] =
{
- { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp ), FIELD_OFFSET(CONTEXT, Esp), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE },
- { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE }
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp), FIELD_OFFSET(CONTEXT, Esp), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE },
+ { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE }
};
-static PCHAR GspThreadStates[DeferredReady+1] =
-{
- "Initialized",
- "Ready",
- "Running",
- "Standby",
- "Terminated",
- "Waiting",
- "Transition",
- "DeferredReady"
+static PCHAR GspThreadStates[DeferredReady + 1] =
+{
+ "Initialized",
+ "Ready",
+ "Running",
+ "Standby",
+ "Terminated",
+ "Waiting",
+ "Transition",
+ "DeferredReady"
};
-
LONG
HexValue(CHAR ch)
{
- if ((ch >= '0') && (ch <= '9'))
- {
- return (ch - '0');
- }
- if ((ch >= 'a') && (ch <= 'f'))
- {
- return (ch - 'a' + 10);
- }
- if ((ch >= 'A') && (ch <= 'F'))
- {
- return (ch - 'A' + 10);
- }
-
- return -1;
-}
-
+ if ((ch >= '0') && (ch <= '9'))
+ return (ch - '0');
+
+ if ((ch >= 'a') && (ch <= 'f'))
+ return (ch - 'a' + 10);
+
+ if ((ch >= 'A') && (ch <= 'F'))
+ return (ch - 'A' + 10);
+
+ return -1;
+}
VOID
GdbPutChar(UCHAR Value)
{
- KdPortPutByteEx(&GdbPortInfo, Value);
+ KdPortPutByteEx(&GdbPortInfo, Value);
}
UCHAR
GdbGetChar(VOID)
{
- UCHAR Value;
-
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
-
- return Value;
-}
-
-/* scan for the sequence $<data>#<Checksum> */
+ UCHAR Value;
+
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value))
+ ;
+
+ return Value;
+}
+
+/* scan for the sequence $<data>#<Checksum> */
PCHAR
GspGetPacket()
{
- PCHAR Buffer = &GspInBuffer[0];
- CHAR Checksum;
- CHAR XmitChecksum;
- ULONG Count;
- CHAR ch;
-
- while (TRUE)
- {
- /* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar ()) != '$')
- ;
-
- retry:
- Checksum = 0;
- XmitChecksum = -1;
- Count = 0;
-
- /* now, read until a # or end of Buffer is found */
- while (Count < sizeof(GspInBuffer) - 1)
- {
- ch = GdbGetChar();
- if (ch == '$')
- {
- goto retry;
- }
- if (ch == '#')
- {
- break;
- }
- Checksum = Checksum + ch;
- Buffer[Count] = ch;
- Count = Count + 1;
- }
- Buffer[Count] = 0;
-
- if (ch == '#')
- {
- ch = GdbGetChar();
- XmitChecksum = (CHAR)(HexValue(ch) << 4);
- ch = GdbGetChar();
- XmitChecksum += (CHAR)(HexValue(ch));
-
- if (Checksum != XmitChecksum)
- {
- GdbPutChar('-'); /* failed checksum */
- }
- else
- {
- GdbPutChar('+'); /* successful transfer */
-
- return &Buffer[0];
- }
- }
- }
-}
-
-/* send the packet in Buffer. */
+ PCHAR Buffer = &GspInBuffer[0];
+ CHAR Checksum;
+ CHAR XmitChecksum;
+ ULONG Count;
+ CHAR ch;
+
+ while (TRUE)
+ {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = GdbGetChar()) != '$')
+ ;
+
+retry:
+ Checksum = 0;
+ XmitChecksum = -1;
+ Count = 0;
+
+ /* now, read until a # or end of Buffer is found */
+ while (Count < sizeof(GspInBuffer) - 1)
+ {
+ ch = GdbGetChar();
+ if (ch == '$')
+ goto retry;
+
+ if (ch == '#')
+ break;
+
+ Checksum = Checksum + ch;
+ Buffer[Count] = ch;
+ Count = Count + 1;
+ }
+ Buffer[Count] = 0;
+
+ if (ch == '#')
+ {
+ ch = GdbGetChar();
+ XmitChecksum = (CHAR)(HexValue(ch) << 4);
+ ch = GdbGetChar();
+ XmitChecksum += (CHAR)(HexValue(ch));
+
+ if (Checksum != XmitChecksum)
+ {
+ GdbPutChar('-'); /* failed checksum */
+ }
+ else
+ {
+ GdbPutChar('+'); /* successful transfer */
+ return &Buffer[0];
+ }
+ }
+ }
+}
+
+/* send the packet in Buffer. */
VOID
GspPutPacket(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- do
- {
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
- }
- while (GdbGetChar() != '+');
-}
-
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ do
+ {
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
+ }
+ while (GdbGetChar() != '+');
+}
VOID
GspPutPacketNoWait(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
}
/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an error. */
@@ -259,8 +249,10 @@
GspReadMemSafe(PCHAR Address)
{
CHAR ch = 0;
+
if (!KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch))
- GspMemoryError = TRUE;
+ GspMemoryError = TRUE;
+
return ch;
}
@@ -268,118 +260,101 @@
GspWriteMemSafe(PCHAR Address, CHAR Ch)
{
if (!KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch))
- GspMemoryError = TRUE;
-}
-
-/* Convert the memory pointed to by Address into hex, placing result in Buffer */
-/* Return a pointer to the last char put in Buffer (null) */
-/* If MayFault is TRUE, then we should set GspMemoryError in response to
- a fault; if FALSE treat a fault like any other fault in the stub. */
+ GspMemoryError = TRUE;
+}
+
+/* Convert the memory pointed to by Address into hex, placing result in Buffer
+ * Return a pointer to the last char put in Buffer (null)
+ * If MayFault is TRUE, then we should set GspMemoryError in response to
+ * a fault; if FALSE treat a fault like any other fault in the stub.
+ */
static PCHAR
-GspMem2Hex(PCHAR Address,
- PCHAR Buffer,
- LONG Count,
- BOOLEAN MayFault)
-{
- ULONG i;
- CHAR ch;
-
- for (i = 0; i < (ULONG) Count; i++)
- {
- if (MayFault)
- {
- ch = GspReadMemSafe(Address);
- if (GspMemoryError)
- {
- return Buffer;
- }
- }
- else
- {
- ch = *Address;
- }
- *Buffer++ = HexChars[(ch >> 4) & 0xf];
- *Buffer++ = HexChars[ch & 0xf];
- Address++;
- }
-
- *Buffer = 0;
- return Buffer;
+GspMem2Hex(PCHAR Address, PCHAR Buffer, LONG Count, BOOLEAN MayFault)
+{
+ ULONG i;
+ CHAR ch;
+
+ for (i = 0; i < (ULONG)Count; i++)
+ {
+ if (MayFault)
+ {
+ ch = GspReadMemSafe(Address);
+ if (GspMemoryError)
+ return Buffer;
+ }
+ else
+ {
+ ch = *Address;
+ }
+ *Buffer++ = HexChars[(ch >> 4) & 0xf];
+ *Buffer++ = HexChars[ch & 0xf];
+ Address++;
+ }
+
+ *Buffer = 0;
+ return Buffer;
}
static ULONG
-GspWriteMem(PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault,
- CHAR (*GetContent)(PVOID Context, ULONG Offset),
- PVOID Context)
-{
- PCHAR Current;
- PCHAR Page;
- ULONG CountInPage;
- ULONG i;
- CHAR ch;
-
- Current = Address;
- while (Current < Address + Count)
- {
- Page = (PCHAR)PAGE_ROUND_DOWN(Current);
- if (Address + Count <= Page + PAGE_SIZE)
- {
- /* Fits in this page */
- CountInPage = Count;
- }
- else
- {
- /* Flows into next page, handle only current page in this iteration */
- CountInPage = PAGE_SIZE - (Address - Page);
- }
-
- for (i = 0; i < CountInPage && ! GspMemoryError; i++)
- {
- ch = (*GetContent)(Context, Current - Address);
-
- if (MayFault)
- {
- GspWriteMemSafe(Current, ch);
- }
- else
- {
- *Current = ch;
- }
-
- Current++;
- }
- if (MayFault)
- {
- if (GspMemoryError)
- {
- return Current - Address;
- }
- }
- }
-
- return Current - Address;
+GspWriteMem(PCHAR Address, ULONG Count, BOOLEAN MayFault,
+ CHAR (*GetContent)(PVOID Context, ULONG Offset), PVOID Context)
+{
+ PCHAR Current;
+ PCHAR Page;
+ ULONG CountInPage;
+ ULONG i;
+ CHAR ch;
+
+ Current = Address;
+ while (Current < Address + Count)
+ {
+ Page = (PCHAR)PAGE_ROUND_DOWN(Current);
+ if (Address + Count <= Page + PAGE_SIZE)
+ {
+ /* Fits in this page */
+ CountInPage = Count;
+ }
+ else
+ {
+ /* Flows into next page, handle only current page in this iteration */
+ CountInPage = PAGE_SIZE - (Address - Page);
+ }
+
+ for (i = 0; i < CountInPage && !GspMemoryError; i++)
+ {
+ ch = (*GetContent)(Context, Current - Address);
+
+ if (MayFault)
+ GspWriteMemSafe(Current, ch);
+ else
+ *Current = ch;
+
+ Current++;
+ }
+ if (MayFault)
+ {
+ if (GspMemoryError)
+ return Current - Address;
+ }
+ }
+
+ return Current - Address;
}
static CHAR
GspHex2MemGetContent(PVOID Context, ULONG Offset)
{
- return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
- HexValue(*((PCHAR) Context + 2 * Offset + 1)));
+ return (CHAR)((HexValue(*((PCHAR)Context + 2 * Offset)) << 4) +
+ HexValue(*((PCHAR)Context + 2 * Offset + 1)));
}
/* Convert the hex array pointed to by Buffer into binary to be placed at Address
* Return a pointer to the character AFTER the last byte read from Buffer */
static PCHAR
-GspHex2Mem(PCHAR Buffer,
- PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault)
-{
- Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
-
- return Buffer + 2 * Count;
+GspHex2Mem(PCHAR Buffer, PCHAR Address, ULONG Count, BOOLEAN MayFault)
+{
+ Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
+ return Buffer + 2 * Count;
}
/**********************************************/
@@ -387,47 +362,42 @@
/* RETURN NUMBER OF CHARS PROCESSED */
/**********************************************/
LONG
-GspHex2Long(PCHAR *Address,
- PLONG Value)
-{
- LONG NumChars = 0;
- LONG Hex;
-
- *Value = 0;
-
- while (**Address)
- {
- Hex = HexValue(**Address);
- if (Hex >= 0)
- {
- *Value = (*Value << 4) | Hex;
- NumChars++;
- }
- else
- {
- break;
- }
-
- (*Address)++;
- }
-
- return NumChars;
-}
-
+GspHex2Long(PCHAR *Address, PLONG Value)
+{
+ LONG NumChars = 0;
+ LONG Hex;
+
+ *Value = 0;
+
+ while (**Address)
+ {
+ Hex = HexValue(**Address);
+ if (Hex >= 0)
+ {
+ *Value = (*Value << 4) | Hex;
+ NumChars++;
+ }
+ else
+ {
+ break;
+ }
+
+ (*Address)++;
+ }
+
+ return NumChars;
+}
VOID
-GspLong2Hex(PCHAR *Address,
- LONG Value)
-{
- LONG Save;
-
- Save = (((Value >> 0) & 0xff) << 24) |
- (((Value >> 8) & 0xff) << 16) |
- (((Value >> 16) & 0xff) << 8) |
- (((Value >> 24) & 0xff) << 0);
- *Address = GspMem2Hex((PCHAR) &Save, *Address, 4, FALSE);
-}
-
+GspLong2Hex(PCHAR *Address, LONG Value)
+{
+ LONG Save;
+
+ Save = (((Value >> 0) & 0xff) << 24) | (((Value >> 8) &
0xff) << 16) |
+ (((Value >> 16) & 0xff) << 8) | (((Value >> 24) &
0xff) << 0);
+
+ *Address = GspMem2Hex((PCHAR)&Save, *Address, 4, FALSE);
+}
/*
* When coming from kernel mode, Esp is not stored in the trap frame.
@@ -438,447 +408,428 @@
static LONG
GspGetEspFromTrapFrame(PKTRAP_FRAME TrapFrame)
{
- return KeGetPreviousMode() == KernelMode
- ? (LONG) &TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp;
-}
-
+ return KeGetPreviousMode() == KernelMode ?
+ (LONG)&TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp;
+}
static VOID
-GspGetRegisters(PCHAR Address,
- PKTRAP_FRAME TrapFrame)
-{
- ULONG_PTR Value;
- PULONG p;
- ULONG i;
- PETHREAD Thread;
- ULONG_PTR *KernelStack;
-
- if (NULL == GspDbgThread)
- {
- Thread = PsGetCurrentThread();
- }
- else
- {
- TrapFrame = GspDbgThread->Tcb.TrapFrame;
- Thread = GspDbgThread;
- }
-
- if (Waiting == Thread->Tcb.State)
- {
- KernelStack = Thread->Tcb.KernelStack;
- for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
- {
- switch(i)
- {
- case EBP:
- Value = KernelStack[3];
- break;
- case EDI:
- Value = KernelStack[4];
- break;
- case ESI:
- Value = KernelStack[5];
- break;
- case EBX:
- Value = KernelStack[6];
- break;
- case PC:
- Value = KernelStack[7];
- break;
- case ESP:
- Value = (ULONG_PTR) (KernelStack + 8);
- break;
- case CS:
- Value = KGDT_R0_CODE;
- break;
- case DS:
- Value = KGDT_R0_DATA;
- break;
- default:
+GspGetRegisters(PCHAR Address, PKTRAP_FRAME TrapFrame)
+{
+ ULONG_PTR Value;
+ PULONG p;
+ ULONG i;
+ PETHREAD Thread;
+ ULONG_PTR *KernelStack;
+
+ if (NULL == GspDbgThread)
+ {
+ Thread = PsGetCurrentThread();
+ }
+ else
+ {
+ TrapFrame = GspDbgThread->Tcb.TrapFrame;
+ Thread = GspDbgThread;
+ }
+
+ if (Waiting == Thread->Tcb.State)
+ {
+ KernelStack = Thread->Tcb.KernelStack;
+ for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
+ {
+ switch (i)
+ {
+ case EBP:
+ Value = KernelStack[3];
+ break;
+ case EDI:
+ Value = KernelStack[4];
+ break;
+ case ESI:
+ Value = KernelStack[5];
+ break;
+ case EBX:
+ Value = KernelStack[6];
+ break;
+ case PC:
+ Value = KernelStack[7];
+ break;
+ case ESP:
+ Value = (ULONG_PTR)(KernelStack + 8);
+ break;
+ case CS:
+ Value = KGDT_R0_CODE;
+ break;
+ case DS:
+ Value = KGDT_R0_DATA;
+ break;
+ default:
+ Value = 0;
+ break;
+ }
+
+ Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size,
FALSE);
+ }
+ }
+ else
+ {
+ for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
+ {
+ if (TrapFrame)
+ {
+ if (ESP == i)
+ {
+ Value = GspGetEspFromTrapFrame(TrapFrame);
+ }
+ else
+ {
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF);
+ Value = *p;
+ }
+ }
+ else if (i == PC)
+ {
+ /*
+ * This thread has not been sheduled yet so assume it
+ * is still in PsBeginThreadWithContextInternal().
+ */
+ Value = (ULONG)KiThreadStartup;
+ }
+ else
+ {
Value = 0;
- break;
- }
- Address = GspMem2Hex((PCHAR) &Value, Address, GspRegisters[i].Size,
- FALSE);
- }
- }
- else
- {
- for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++)
- {
- if (TrapFrame)
- {
- if (ESP == i)
- {
- Value = GspGetEspFromTrapFrame(TrapFrame);
- }
- else
- {
- p = (PULONG)((ULONG_PTR) TrapFrame +
- GspRegisters[i].OffsetInTF);
- Value = *p;
- }
- }
- else if (i == PC)
- {
- /*
- * This thread has not been sheduled yet so assume it
- * is still in PsBeginThreadWithContextInternal().
- */
- Value = (ULONG)KiThreadStartup;
- }
- else
- {
- Value = 0;
- }
- Address = GspMem2Hex((PCHAR) &Value, Address,
- GspRegisters[i].Size, FALSE);
- }
- }
-}
-
+ }
+
+ Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size,
FALSE);
+ }
+ }
+}
VOID
-GspSetRegistersInTrapFrame(PCHAR Address,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame)
-{
- ULONG Value;
- PCHAR Buffer;
- PULONG p;
- ULONG i;
-
- if (!TrapFrame)
- {
- return;
- }
-
- Buffer = Address;
- for (i = 0; i < NUMREGS; i++)
- {
- if (GspRegisters[i].SetInContext)
- {
- p = (PULONG) ((ULONG_PTR) Context + GspRegisters[i].OffsetInContext);
- }
- else
- {
- p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[i].OffsetInTF);
- }
- Value = 0;
- Buffer = GspHex2Mem(Buffer, (PCHAR) &Value, GspRegisters[i].Size, FALSE);
- *p = Value;
- }
-}
-
+GspSetRegistersInTrapFrame(PCHAR Address, PCONTEXT Context, PKTRAP_FRAME TrapFrame)
+{
+ ULONG Value;
+ PCHAR Buffer;
+ PULONG p;
+ ULONG i;
+
+ if (!TrapFrame)
+ return;
+
+ Buffer = Address;
+ for (i = 0; i < NUMREGS; i++)
+ {
+ if (GspRegisters[i].SetInContext)
+ {
+ p = (PULONG)((ULONG_PTR)Context + GspRegisters[i].OffsetInContext);
+ }
+ else
+ {
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF);
+ }
+
+ Value = 0;
+ Buffer = GspHex2Mem(Buffer, (PCHAR)&Value, GspRegisters[i].Size, FALSE);
+ *p = Value;
+ }
+}
VOID
-GspSetSingleRegisterInTrapFrame(PCHAR Address,
- LONG Number,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame)
-{
- ULONG Value;
- PULONG p;
-
- if (!TrapFrame)
- {
- return;
- }
-
- if (GspRegisters[Number].SetInContext)
- {
- p = (PULONG) ((ULONG_PTR) Context + GspRegisters[Number].OffsetInContext);
- }
- else
- {
- p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[Number].OffsetInTF);
- }
- Value = 0;
- GspHex2Mem(Address, (PCHAR) &Value, GspRegisters[Number].Size, FALSE);
- *p = Value;
-}
-
+GspSetSingleRegisterInTrapFrame(PCHAR Address, LONG Number, PCONTEXT Context,
PKTRAP_FRAME TrapFrame)
+{
+ ULONG Value;
+ PULONG p;
+
+ if (!TrapFrame)
+ return;
+
+ if (GspRegisters[Number].SetInContext)
+ {
+ p = (PULONG)((ULONG_PTR)Context + GspRegisters[Number].OffsetInContext);
+ }
+ else
+ {
+ p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[Number].OffsetInTF);
+ }
+
+ Value = 0;
+ GspHex2Mem(Address, (PCHAR)&Value, GspRegisters[Number].Size, FALSE);
+ *p = Value;
+}
BOOLEAN
-GspFindThread(PCHAR Data,
- PETHREAD *Thread)
-{
- PETHREAD ThreadInfo = NULL;
-
- if (strcmp (Data, "-1") == 0)
- {
- /* All threads */
- ThreadInfo = NULL;
- }
- else
- {
- ULONG uThreadId;
- HANDLE ThreadId;
- PCHAR ptr = &Data[0];
-
- GspHex2Long(&ptr, (PLONG) &uThreadId);
- ThreadId = (HANDLE)uThreadId;
-
- if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo)))
- {
- *Thread = NULL;
- return FALSE;
- }
- }
- *Thread = ThreadInfo;
- return TRUE;
-}
-
+GspFindThread(PCHAR Data, PETHREAD *Thread)
+{
+ PETHREAD ThreadInfo = NULL;
+
+ if (strcmp(Data, "-1") == 0)
+ {
+ /* All threads */
+ ThreadInfo = NULL;
+ }
+ else
+ {
+ ULONG uThreadId;
+ HANDLE ThreadId;
+ PCHAR ptr = &Data[0];
+
+ GspHex2Long(&ptr, (PLONG)&uThreadId);
+ ThreadId = (HANDLE)uThreadId;
+
+ if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo)))
+ {
+ *Thread = NULL;
+ return FALSE;
+ }
+ }
+
+ *Thread = ThreadInfo;
+ return TRUE;
+}
VOID
GspSetThread(PCHAR Request)
{
- PETHREAD ThreadInfo;
- PCHAR ptr = &Request[1];
-
- switch (Request[0])
- {
- case 'c': /* Run thread */
- if (GspFindThread(ptr, &ThreadInfo))
- {
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
-
- if (NULL != GspRunThread)
- {
- ObDereferenceObject(GspRunThread);
- }
- GspRunThread = ThreadInfo;
- if (NULL != GspRunThread)
- {
- ObReferenceObject(GspRunThread);
- }
- }
- else
- {
- GspOutBuffer[0] = 'E';
- }
- break;
- case 'g': /* Debug thread */
- if (GspFindThread(ptr, &ThreadInfo))
- {
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
-
- if (NULL != GspDbgThread)
- {
- ObDereferenceObject(GspDbgThread);
- }
-
- if (ThreadInfo == PsGetCurrentThread())
- {
- GspDbgThread = NULL;
- ObDereferenceObject(ThreadInfo);
- }
- else
- {
- GspDbgThread = ThreadInfo;
- }
- }
- else
- {
- GspOutBuffer[0] = 'E';
- }
- break;
- default:
- break;
- }
-}
-
+ PETHREAD ThreadInfo;
+ PCHAR ptr = &Request[1];
+
+ switch (Request[0])
+ {
+ case 'c': /* Run thread */
+ if (GspFindThread(ptr, &ThreadInfo))
+ {
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
+
+ if (NULL != GspRunThread)
+ ObDereferenceObject(GspRunThread);
+
+ GspRunThread = ThreadInfo;
+
+ if (NULL != GspRunThread)
+ ObReferenceObject(GspRunThread);
+ }
+ else
+ {
+ GspOutBuffer[0] = 'E';
+ }
+ break;
+
+ case 'g': /* Debug thread */
+ if (GspFindThread(ptr, &ThreadInfo))
+ {
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
+
+ if (NULL != GspDbgThread)
+ ObDereferenceObject(GspDbgThread);
+
+ if (ThreadInfo == PsGetCurrentThread())
+ {
+ GspDbgThread = NULL;
+ ObDereferenceObject(ThreadInfo);
+ }
+ else
+ {
+ GspDbgThread = ThreadInfo;
+ }
+ }
+ else
+ {
+ GspOutBuffer[0] = 'E';
+ }
+ break;
+
+ default:
+ break;
+ }
+}
VOID
GspQuery(PCHAR Request)
{
- ULONG Value;
-
- if (strncmp(Request, "C", 1) == 0)
- {
- PCHAR ptr = &GspOutBuffer[2];
-
- /* Get current thread id */
- GspOutBuffer[0] = 'Q';
- GspOutBuffer[1] = 'C';
- if (NULL != GspDbgThread)
- {
- Value = (ULONG) GspDbgThread->Cid.UniqueThread;
- }
- else
- {
- Value = (ULONG) PsGetCurrentThread()->Cid.UniqueThread;
- }
- GspLong2Hex(&ptr, Value);
- }
- else if (strncmp(Request, "fThreadInfo", 11) == 0)
- {
- PEPROCESS Process;
- PLIST_ENTRY AThread, AProcess;
- PCHAR ptr = &GspOutBuffer[1];
-
- /* Get first thread id */
- GspEnumThread = NULL;
- AProcess = PsActiveProcessHead.Flink;
- while(AProcess != &PsActiveProcessHead)
- {
- Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
- AThread = Process->ThreadListHead.Flink;
- if (AThread != &Process->ThreadListHead)
- {
- GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
- ETHREAD, ThreadListEntry);
- break;
- }
- AProcess = AProcess->Flink;
- }
- if(GspEnumThread != NULL)
- {
- GspOutBuffer[0] = 'm';
- Value = (ULONG) GspEnumThread->Cid.UniqueThread;
- GspLong2Hex(&ptr, Value);
- }
- else
- {
- /* FIXME - what to do here? This case should never happen though, there
- should always be at least one thread on the system... */
- /* GspOutBuffer[0] = 'l'; */
- }
- }
- else if (strncmp(Request, "sThreadInfo", 11) == 0)
- {
- PEPROCESS Process;
- PLIST_ENTRY AThread, AProcess;
- PCHAR ptr = &GspOutBuffer[1];
-
- /* Get next thread id */
- if (GspEnumThread != NULL)
- {
- /* find the next thread */
- Process = GspEnumThread->ThreadsProcess;
- if(GspEnumThread->ThreadListEntry.Flink != &Process->ThreadListHead)
- {
- GspEnumThread = CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink,
- ETHREAD, ThreadListEntry);
- }
- else
- {
- PETHREAD Thread = NULL;
- AProcess = Process->ActiveProcessLinks.Flink;
- while(AProcess != &PsActiveProcessHead)
+ ULONG Value;
+
+ if (strncmp(Request, "C", 1) == 0)
+ {
+ PCHAR ptr = &GspOutBuffer[2];
+
+ /* Get current thread id */
+ GspOutBuffer[0] = 'Q';
+ GspOutBuffer[1] = 'C';
+
+ if (NULL != GspDbgThread)
+ Value = (ULONG)GspDbgThread->Cid.UniqueThread;
+ else
+ Value = (ULONG)PsGetCurrentThread()->Cid.UniqueThread;
+
+ GspLong2Hex(&ptr, Value);
+ }
+ else if (strncmp(Request, "fThreadInfo", 11) == 0)
+ {
+ PEPROCESS Process;
+ PLIST_ENTRY AThread, AProcess;
+ PCHAR ptr = &GspOutBuffer[1];
+
+ /* Get first thread id */
+ GspEnumThread = NULL;
+ AProcess = PsActiveProcessHead.Flink;
+ while (AProcess != &PsActiveProcessHead)
+ {
+ Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
+ AThread = Process->ThreadListHead.Flink;
+ if (AThread != &Process->ThreadListHead)
+ {
+ GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
+ ETHREAD, ThreadListEntry);
+ break;
+ }
+ AProcess = AProcess->Flink;
+ }
+ if (GspEnumThread != NULL)
+ {
+ GspOutBuffer[0] = 'm';
+ Value = (ULONG)GspEnumThread->Cid.UniqueThread;
+ GspLong2Hex(&ptr, Value);
+ }
+ else
+ {
+ /* FIXME - what to do here? This case should never happen though, there
+ should always be at least one thread on the system... */
+ /* GspOutBuffer[0] = 'l'; */
+ }
+ }
+ else if (strncmp(Request, "sThreadInfo", 11) == 0)
+ {
+ PEPROCESS Process;
+ PLIST_ENTRY AThread, AProcess;
+ PCHAR ptr = &GspOutBuffer[1];
+
+ /* Get next thread id */
+ if (GspEnumThread != NULL)
+ {
+ /* find the next thread */
+ Process = GspEnumThread->ThreadsProcess;
+ if (GspEnumThread->ThreadListEntry.Flink !=
&Process->ThreadListHead)
+ {
+ GspEnumThread =
CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink,
+ ETHREAD, ThreadListEntry);
+ }
+ else
+ {
+ PETHREAD Thread = NULL;
+ AProcess = Process->ActiveProcessLinks.Flink;
+ while (AProcess != &PsActiveProcessHead)
{
- Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
- AThread = Process->ThreadListHead.Flink;
- if (AThread != &Process->ThreadListHead)
+ Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks);
+ AThread = Process->ThreadListHead.Flink;
+ if (AThread != &Process->ThreadListHead)
{
- Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
- ETHREAD, ThreadListEntry);
- break;
+ Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink,
+ ETHREAD, ThreadListEntry);
+ break;
}
- AProcess = AProcess->Flink;
+ AProcess = AProcess->Flink;
}
- GspEnumThread = Thread;
- }
-
- if (GspEnumThread != NULL)
- {
- /* return the ID */
- GspOutBuffer[0] = 'm';
- Value = (ULONG) GspEnumThread->Cid.UniqueThread;
- GspLong2Hex(&ptr, Value);
- }
- else
- {
- GspOutBuffer[0] = 'l';
- }
- }
- else
- {
- GspOutBuffer[0] = 'l';
- }
- }
- else if (strncmp(Request, "ThreadExtraInfo", 15) == 0)
- {
- PETHREAD ThreadInfo;
-
- /* Get thread information */
- if (GspFindThread(Request + 16, &ThreadInfo))
- {
- char Buffer[64];
- PEPROCESS Proc;
-
- Proc = (PEPROCESS) ThreadInfo->ThreadsProcess;
-
- Buffer[0] = '\0';
- if (NULL != Proc )
- {
- sprintf(Buffer, "%s [%d:0x%x], ", Proc->ImageFileName,
- (int) Proc->UniqueProcessId,
- (int) ThreadInfo->Cid.UniqueThread);
- }
- strcpy(Buffer + strlen(Buffer),
- GspThreadStates[ThreadInfo->Tcb.State]);
-
- ObDereferenceObject(ThreadInfo);
-
- GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE);
- }
- }
- else if (strncmp(Request, "Supported", 9) == 0)
- {
- /* tell maximum incoming packet size */
- sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1);
- }
- else if (strncmp(Request, "Rcmd,", 5) == 0)
- {
- ;
+ GspEnumThread = Thread;
+ }
+
+ if (GspEnumThread != NULL)
+ {
+ /* return the ID */
+ GspOutBuffer[0] = 'm';
+ Value = (ULONG)GspEnumThread->Cid.UniqueThread;
+ GspLong2Hex(&ptr, Value);
+ }
+ else
+ {
+ GspOutBuffer[0] = 'l';
+ }
+ }
+ else
+ {
+ GspOutBuffer[0] = 'l';
+ }
+ }
+ else if (strncmp(Request, "ThreadExtraInfo", 15) == 0)
+ {
+ PETHREAD ThreadInfo;
+
+ /* Get thread information */
+ if (GspFindThread(Request + 16, &ThreadInfo))
+ {
+ char Buffer[64];
+ PEPROCESS Proc;
+
+ Proc = (PEPROCESS)ThreadInfo->ThreadsProcess;
+
+ Buffer[0] = '\0';
+
+ if (NULL != Proc)
+ sprintf(Buffer, "%s [%d:0x%x], ",
+ Proc->ImageFileName,
+ (int)Proc->UniqueProcessId,
+ (int)ThreadInfo->Cid.UniqueThread);
+
+ strcpy(Buffer + strlen(Buffer), GspThreadStates[ThreadInfo->Tcb.State]);
+
+ ObDereferenceObject(ThreadInfo);
+
+ GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE);
+ }
+ }
+ else if (strncmp(Request, "Supported", 9) == 0)
+ {
+ /* tell maximum incoming packet size */
+ sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1);
+ }
+ else if (strncmp(Request, "Rcmd,", 5) == 0)
+ {
+ ;
}
}
VOID
GspQueryThreadStatus(PCHAR Request)
{
- PETHREAD ThreadInfo;
- PCHAR ptr = &Request[0];
-
- if (GspFindThread(ptr, &ThreadInfo))
- {
- ObDereferenceObject(ThreadInfo);
-
- GspOutBuffer[0] = 'O';
- GspOutBuffer[1] = 'K';
- GspOutBuffer[2] = '\0';
- }
- else
- {
- GspOutBuffer[0] = 'E';
- GspOutBuffer[1] = '\0';
- }
-}
-
-#define DR6_BS 0x00004000 /* Single step */
-
-#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */
-#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */
-#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */
-#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */
-#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */
-#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */
-#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */
-#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */
-#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */
-#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */
-#define DR7_GD 0x00002000 /* General detect enable */
-#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */
-#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */
-#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */
-#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */
-#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */
-#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */
-#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */
-#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */
+ PETHREAD ThreadInfo;
+ PCHAR ptr = &Request[0];
+
+ if (GspFindThread(ptr, &ThreadInfo))
+ {
+ ObDereferenceObject(ThreadInfo);
+
+ GspOutBuffer[0] = 'O';
+ GspOutBuffer[1] = 'K';
+ GspOutBuffer[2] = '\0';
+ }
+ else
+ {
+ GspOutBuffer[0] = 'E';
+ GspOutBuffer[1] = '\0';
+ }
+}
+
+#define DR6_BS 0x00004000 /* Single step */
+
+#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */
+#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */
+#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */
+#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */
+#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */
+#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */
+#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */
+#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */
+#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */
+#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */
+#define DR7_GD 0x00002000 /* General detect enable */
+#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */
+#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */
+#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */
+#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */
+#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */
+#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */
+#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */
+#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */
#define DR7_GLOBAL_ENABLE(Bp) (2 << (2 * (Bp)))
#define DR7_TYPE(Bp, Type) ((Type) << (16 + 4 * (Bp)))
#define DR7_LEN(Bp, Len) ((Len) << (18 + 4 * (Bp)))
@@ -897,9 +848,9 @@
typedef struct _GSPHWBREAKPOINT
{
- ULONG Type;
- ULONG_PTR Address;
- ULONG Length;
+ ULONG Type;
+ ULONG_PTR Address;
+ ULONG Length;
} GSPHWBREAKPOINT;
#define MAX_HW_BREAKPOINTS 4
@@ -908,9 +859,9 @@
typedef struct _GSPSWBREAKPOINT
{
- ULONG_PTR Address;
- CHAR PrevContent;
- BOOLEAN Active;
+ ULONG_PTR Address;
+ CHAR PrevContent;
+ BOOLEAN Active;
} GSPSWBREAKPOINT;
#define MAX_SW_BREAKPOINTS 64
@@ -920,280 +871,269 @@
static void
GspSetHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length)
{
- DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
-
- if (GDB_ZTYPE_READ_WATCHPOINT == Type)
- {
- DPRINT1("Read watchpoint not supported\n");
- strcpy(GspOutBuffer, "E22");
- }
- else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length)
- {
- DPRINT1("Invalid length %lu for hardware breakpoint\n", Length);
- strcpy(GspOutBuffer, "E22");
- }
- else if (1 != Length && 2 != Length && 4 != Length)
- {
- DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type);
- strcpy(GspOutBuffer, "E22");
- }
- else if (0 != (Address & (Length - 1)))
- {
- DPRINT1("Invalid alignment for address 0x%p and length %d\n",
- Address, Length);
- strcpy(GspOutBuffer, "E22");
- }
- else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount)
- {
- DPRINT1("Trying to set too many hardware breakpoints\n");
- strcpy(GspOutBuffer, "E22");
- }
- else
- {
- DPRINT("Stored at index %u\n", GspHwBreakpointCount);
- GspHwBreakpoints[GspHwBreakpointCount].Type = Type;
- GspHwBreakpoints[GspHwBreakpointCount].Address = Address;
- GspHwBreakpoints[GspHwBreakpointCount].Length = Length;
- GspHwBreakpointCount++;
- strcpy(GspOutBuffer, "OK");
+ DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
+
+ if (GDB_ZTYPE_READ_WATCHPOINT == Type)
+ {
+ DPRINT1("Read watchpoint not supported\n");
+ strcpy(GspOutBuffer, "E22");
+ }
+ else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length)
+ {
+ DPRINT1("Invalid length %lu for hardware breakpoint\n", Length);
+ strcpy(GspOutBuffer, "E22");
+ }
+ else if (1 != Length && 2 != Length && 4 != Length)
+ {
+ DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type);
+ strcpy(GspOutBuffer, "E22");
+ }
+ else if (0 != (Address & (Length - 1)))
+ {
+ DPRINT1("Invalid alignment for address 0x%p and length %d\n", Address,
Length);
+ strcpy(GspOutBuffer, "E22");
+ }
+ else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount)
+ {
+ DPRINT1("Trying to set too many hardware breakpoints\n");
+ strcpy(GspOutBuffer, "E22");
+ }
+ else
+ {
+ DPRINT("Stored at index %u\n", GspHwBreakpointCount);
+ GspHwBreakpoints[GspHwBreakpointCount].Type = Type;
+ GspHwBreakpoints[GspHwBreakpointCount].Address = Address;
+ GspHwBreakpoints[GspHwBreakpointCount].Length = Length;
+ GspHwBreakpointCount++;
+ strcpy(GspOutBuffer, "OK");
}
}
static void
GspRemoveHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length)
{
- unsigned Index;
-
- DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
- for (Index = 0; Index < GspHwBreakpointCount; Index++)
- {
- if (GspHwBreakpoints[Index].Type == Type &&
- GspHwBreakpoints[Index].Address == Address &&
- GspHwBreakpoints[Index].Length == Length)
- {
- DPRINT("Found match at index %u\n", Index);
- if (Index + 1 < GspHwBreakpointCount)
- {
- memmove(GspHwBreakpoints + Index,
- GspHwBreakpoints + (Index + 1),
- (GspHwBreakpointCount - Index - 1) *
- sizeof(GSPHWBREAKPOINT));
- }
- GspHwBreakpointCount--;
- strcpy(GspOutBuffer, "OK");
- return;
- }
- }
-
- DPRINT1("Not found\n");
- strcpy(GspOutBuffer, "E22");
+ unsigned Index;
+
+ DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length);
+ for (Index = 0; Index < GspHwBreakpointCount; Index++)
+ {
+ if (GspHwBreakpoints[Index].Type == Type &&
+ GspHwBreakpoints[Index].Address == Address &&
+ GspHwBreakpoints[Index].Length == Length)
+ {
+ DPRINT("Found match at index %u\n", Index);
+ if (Index + 1 < GspHwBreakpointCount)
+ memmove(GspHwBreakpoints + Index,
+ GspHwBreakpoints + (Index + 1),
+ (GspHwBreakpointCount - Index - 1) * sizeof(GSPHWBREAKPOINT));
+
+ GspHwBreakpointCount--;
+ strcpy(GspOutBuffer, "OK");
+ return;
+ }
+ }
+
+ DPRINT1("Not found\n");
+ strcpy(GspOutBuffer, "E22");
}
static BOOLEAN
GspFindSwBreakpoint(ULONG_PTR Address, PULONG PIndex)
{
- ULONG Index;
-
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
- if (GspSwBreakpoints[Index].Address == Address)
- {
- if (PIndex) *PIndex = Index;
- return TRUE;
- }
-
- return FALSE;
+ ULONG Index;
+
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ if (GspSwBreakpoints[Index].Address == Address)
+ {
+ if (PIndex)
+ *PIndex = Index;
+ return TRUE;
+ }
+
+ return FALSE;
}
static void
GspSetSwBreakpoint(ULONG_PTR Address)
{
- DPRINT("GspSetSwBreakpoint(0x%p)\n", Address);
-
- if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount)
- {
- DPRINT1("Trying to set too many software breakpoints\n");
- strcpy(GspOutBuffer, "E22");
- return;
- }
-
- if (GspFindSwBreakpoint(Address, NULL))
- {
- strcpy(GspOutBuffer, "E22");
- return;
- }
-
- DPRINT("Stored at index %u\n", GspSwBreakpointCount);
- GspSwBreakpoints[GspSwBreakpointCount].Address = Address;
- GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE;
- GspSwBreakpointCount++;
- strcpy(GspOutBuffer, "OK");
+ DPRINT("GspSetSwBreakpoint(0x%p)\n", Address);
+
+ if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount)
+ {
+ DPRINT1("Trying to set too many software breakpoints\n");
+ strcpy(GspOutBuffer, "E22");
+ return;
+ }
+
+ if (GspFindSwBreakpoint(Address, NULL))
+ {
+ strcpy(GspOutBuffer, "E22");
+ return;
+ }
+
+ DPRINT("Stored at index %u\n", GspSwBreakpointCount);
+ GspSwBreakpoints[GspSwBreakpointCount].Address = Address;
+ GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE;
+ GspSwBreakpointCount++;
+ strcpy(GspOutBuffer, "OK");
}
static void
GspRemoveSwBreakpoint(ULONG_PTR Address)
{
- ULONG Index;
-
- DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address);
-
- if (GspFindSwBreakpoint(Address, &Index))
- {
- DPRINT("Found match at index %u\n", Index);
- ASSERT(! GspSwBreakpoints[Index].Active);
-
- if (Index + 1 < GspSwBreakpointCount)
- {
- memmove(GspSwBreakpoints + Index,
- GspSwBreakpoints + (Index + 1),
- (GspSwBreakpointCount - Index - 1) *
- sizeof(GSPSWBREAKPOINT));
- }
- GspSwBreakpointCount--;
- strcpy(GspOutBuffer, "OK");
- return;
- }
-
- DPRINT1("Not found\n");
- strcpy(GspOutBuffer, "E22");
+ ULONG Index;
+
+ DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address);
+
+ if (GspFindSwBreakpoint(Address, &Index))
+ {
+ DPRINT("Found match at index %u\n", Index);
+ ASSERT(!GspSwBreakpoints[Index].Active);
+
+ if (Index + 1 < GspSwBreakpointCount)
+ memmove(GspSwBreakpoints + Index,
+ GspSwBreakpoints + (Index + 1),
+ (GspSwBreakpointCount - Index - 1) * sizeof(GSPSWBREAKPOINT));
+
+ GspSwBreakpointCount--;
+ strcpy(GspOutBuffer, "OK");
+ return;
+ }
+
+ DPRINT1("Not found\n");
+ strcpy(GspOutBuffer, "E22");
}
static void
-GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame,
- unsigned BpIndex,
- ULONG_PTR Address,
- ULONG Length,
- ULONG Type)
-{
- DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n", TrapFrame, BpIndex,
- Address, Type);
-
- /* Set the DR7_Gx bit to globally enable the breakpoint */
- TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) |
- DR7_LEN(BpIndex, Length) |
- DR7_TYPE(BpIndex, Type);
-
- switch (BpIndex)
- {
- case 0:
- DPRINT("Setting DR0 to 0x%p\n", Address);
- TrapFrame->Dr0 = Address;
- break;
-
- case 1:
- DPRINT("Setting DR1 to 0x%p\n", Address);
- TrapFrame->Dr1 = Address;
- break;
-
- case 2:
- DPRINT("Setting DR2 to 0x%p\n", Address);
- TrapFrame->Dr2 = Address;
- break;
-
- case 3:
- DPRINT("Setting DR3 to 0x%p\n", Address);
- TrapFrame->Dr3 = Address;
- break;
+GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame, unsigned BpIndex,
+ ULONG_PTR Address, ULONG Length, ULONG Type)
+{
+ DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n",
+ TrapFrame, BpIndex, Address, Type);
+
+ /* Set the DR7_Gx bit to globally enable the breakpoint */
+ TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) |
+ DR7_LEN(BpIndex, Length) |
+ DR7_TYPE(BpIndex, Type);
+
+ switch (BpIndex)
+ {
+ case 0:
+ DPRINT("Setting DR0 to 0x%p\n", Address);
+ TrapFrame->Dr0 = Address;
+ break;
+
+ case 1:
+ DPRINT("Setting DR1 to 0x%p\n", Address);
+ TrapFrame->Dr1 = Address;
+ break;
+
+ case 2:
+ DPRINT("Setting DR2 to 0x%p\n", Address);
+ TrapFrame->Dr2 = Address;
+ break;
+
+ case 3:
+ DPRINT("Setting DR3 to 0x%p\n", Address);
+ TrapFrame->Dr3 = Address;
+ break;
}
}
static void
GspLoadSwBreakpoint(ULONG Index)
{
- GspMemoryError = FALSE;
- GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR)
GspSwBreakpoints[Index].Address);
- if (! GspMemoryError)
- {
- GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, I386_OPCODE_INT3);
- }
- GspSwBreakpoints[Index].Active = ! GspMemoryError;
- if (GspMemoryError)
- {
- DPRINT1("Failed to set software breakpoint at 0x%p\n",
- GspSwBreakpoints[Index].Address);
- }
- else
- {
- DPRINT("Successfully set software breakpoint at 0x%p\n",
- GspSwBreakpoints[Index].Address);
- }
+ GspMemoryError = FALSE;
+
+ GspSwBreakpoints[Index].PrevContent =
GspReadMemSafe((PCHAR)GspSwBreakpoints[Index].Address);
+
+ if (!GspMemoryError)
+ GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address, I386_OPCODE_INT3);
+
+ GspSwBreakpoints[Index].Active = !GspMemoryError;
+
+ if (GspMemoryError)
+ DPRINT1("Failed to set software breakpoint at 0x%p\n",
GspSwBreakpoints[Index].Address);
+ else
+ DPRINT("Successfully set software breakpoint at 0x%p\n",
GspSwBreakpoints[Index].Address);
}
static void
GspLoadBreakpoints(PKTRAP_FRAME TrapFrame)
{
- unsigned Index;
- ULONG i386Type;
-
- DPRINT("GspLoadBreakpoints\n");
- DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7);
-
- /* Remove all breakpoints */
- TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 |
- DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 |
- DR7_TYPE0_MASK | DR7_LEN0_MASK |
- DR7_TYPE1_MASK | DR7_LEN1_MASK |
- DR7_TYPE2_MASK | DR7_LEN2_MASK |
- DR7_TYPE3_MASK | DR7_LEN3_MASK);
-
- for (Index = 0; Index < GspHwBreakpointCount; Index++)
- {
- switch(GspHwBreakpoints[Index].Type)
- {
- case GDB_ZTYPE_HARDWARE_BREAKPOINT:
- i386Type = I386_BP_TYPE_EXECUTE;
- break;
- case GDB_ZTYPE_WRITE_WATCHPOINT:
- i386Type = I386_BP_TYPE_DATA_WRITE;
- break;
- case GDB_ZTYPE_ACCESS_WATCHPOINT:
- i386Type = I386_BP_TYPE_DATA_READWRITE;
- break;
- default:
- ASSERT(FALSE);
- i386Type = I386_BP_TYPE_EXECUTE;
- break;
- }
-
- GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address,
- GspHwBreakpoints[Index].Length - 1, i386Type);
- }
-
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
- {
- DPRINT("Using real software breakpoint\n");
- GspLoadSwBreakpoint(Index);
- }
-
- DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7);
+ unsigned Index;
+ ULONG i386Type;
+
+ DPRINT("GspLoadBreakpoints\n");
+ DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7);
+
+ /* Remove all breakpoints */
+ TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 |
+ DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 |
+ DR7_TYPE0_MASK | DR7_LEN0_MASK |
+ DR7_TYPE1_MASK | DR7_LEN1_MASK |
+ DR7_TYPE2_MASK | DR7_LEN2_MASK |
+ DR7_TYPE3_MASK | DR7_LEN3_MASK);
+
+ for (Index = 0; Index < GspHwBreakpointCount; Index++)
+ {
+ switch (GspHwBreakpoints[Index].Type)
+ {
+ case GDB_ZTYPE_HARDWARE_BREAKPOINT:
+ i386Type = I386_BP_TYPE_EXECUTE;
+ break;
+ case GDB_ZTYPE_WRITE_WATCHPOINT:
+ i386Type = I386_BP_TYPE_DATA_WRITE;
+ break;
+ case GDB_ZTYPE_ACCESS_WATCHPOINT:
+ i386Type = I386_BP_TYPE_DATA_READWRITE;
+ break;
+ default:
+ ASSERT(FALSE);
+ i386Type = I386_BP_TYPE_EXECUTE;
+ break;
+ }
+
+ GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address,
+ GspHwBreakpoints[Index].Length - 1, i386Type);
+ }
+
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ {
+ DPRINT("Using real software breakpoint\n");
+ GspLoadSwBreakpoint(Index);
+ }
+
+ DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7);
}
static void
GspUnloadBreakpoints(void)
{
- unsigned Index;
-
- DPRINT("GspUnloadBreakpoints\n");
-
- /* Disable hardware debugging while we are inside the stub */
- Ke386SetDr7(0);
-
- for (Index = 0; Index < GspSwBreakpointCount; Index++)
- {
- if (GspSwBreakpoints[Index].Active)
- {
- GspMemoryError = FALSE;
- GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address,
- GspSwBreakpoints[Index].PrevContent);
- GspSwBreakpoints[Index].Active = FALSE;
- if (GspMemoryError)
- {
- DPRINT1("Failed to remove software breakpoint from 0x%p\n",
- GspSwBreakpoints[Index].Address);
- }
- else
- {
- DPRINT("Successfully removed software breakpoint from 0x%p\n",
- GspSwBreakpoints[Index].Address);
+ unsigned Index;
+
+ DPRINT("GspUnloadBreakpoints\n");
+
+ /* Disable hardware debugging while we are inside the stub */
+ Ke386SetDr7(0);
+
+ for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ {
+ if (GspSwBreakpoints[Index].Active)
+ {
+ GspMemoryError = FALSE;
+ GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address,
+ GspSwBreakpoints[Index].PrevContent);
+ GspSwBreakpoints[Index].Active = FALSE;
+ if (GspMemoryError)
+ {
+ DPRINT1("Failed to remove software breakpoint from 0x%p\n",
+ GspSwBreakpoints[Index].Address);
+ }
+ else
+ {
+ DPRINT("Successfully removed software breakpoint from 0x%p\n",
+ GspSwBreakpoints[Index].Address);
}
}
}
@@ -1206,57 +1146,56 @@
ULONG SigVal;
LONG Esp;
- switch (ExceptionCode)
- {
- case STATUS_INTEGER_DIVIDE_BY_ZERO:
- SigVal = 8; /* divide by zero */
- break;
- case STATUS_SINGLE_STEP:
- case STATUS_BREAKPOINT:
- SigVal = 5; /* breakpoint */
- break;
- case STATUS_INTEGER_OVERFLOW:
- case STATUS_ARRAY_BOUNDS_EXCEEDED:
- SigVal = 16; /* bound instruction */
- break;
- case STATUS_ILLEGAL_INSTRUCTION:
- SigVal = 4; /* Invalid opcode */
- break;
- case STATUS_STACK_OVERFLOW:
- case STATUS_DATATYPE_MISALIGNMENT:
- case STATUS_ACCESS_VIOLATION:
- SigVal = 11; /* access violation */
- break;
- default:
- SigVal = 7; /* "software generated" */
- }
-
- ptr = GspOutBuffer;
-
- *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */
- *ptr++ = HexChars[(SigVal >> 4) & 0xf];
- *ptr++ = HexChars[SigVal & 0xf];
-
- *ptr++ = HexChars[ESP];
- *ptr++ = ':';
-
- Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */
- ptr = GspMem2Hex((PCHAR) &Esp, ptr, 4, 0);
- *ptr++ = ';';
-
- *ptr++ = HexChars[EBP];
- *ptr++ = ':';
- ptr = GspMem2Hex((PCHAR) &TrapFrame->Ebp, ptr, 4, 0); /* FP */
- *ptr++ = ';';
-
- *ptr++ = HexChars[PC];
- *ptr++ = ':';
- ptr = GspMem2Hex((PCHAR) &TrapFrame->Eip, ptr, 4, 0); /* PC */
- *ptr++ = ';';
-
- *ptr = '\0';
-}
-
+ switch (ExceptionCode)
+ {
+ case STATUS_INTEGER_DIVIDE_BY_ZERO:
+ SigVal = 8; /* divide by zero */
+ break;
+ case STATUS_SINGLE_STEP:
+ case STATUS_BREAKPOINT:
+ SigVal = 5; /* breakpoint */
+ break;
+ case STATUS_INTEGER_OVERFLOW:
+ case STATUS_ARRAY_BOUNDS_EXCEEDED:
+ SigVal = 16; /* bound instruction */
+ break;
+ case STATUS_ILLEGAL_INSTRUCTION:
+ SigVal = 4; /* Invalid opcode */
+ break;
+ case STATUS_STACK_OVERFLOW:
+ case STATUS_DATATYPE_MISALIGNMENT:
+ case STATUS_ACCESS_VIOLATION:
+ SigVal = 11; /* access violation */
+ break;
+ default:
+ SigVal = 7; /* "software generated" */
+ }
+
+ ptr = GspOutBuffer;
+
+ *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */
+ *ptr++ = HexChars[(SigVal >> 4) & 0xf];
+ *ptr++ = HexChars[SigVal & 0xf];
+
+ *ptr++ = HexChars[ESP];
+ *ptr++ = ':';
+
+ Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */
+ ptr = GspMem2Hex((PCHAR)&Esp, ptr, 4, 0);
+ *ptr++ = ';';
+
+ *ptr++ = HexChars[EBP];
+ *ptr++ = ':';
+ ptr = GspMem2Hex((PCHAR)&TrapFrame->Ebp, ptr, 4, 0); /* FP */
+ *ptr++ = ';';
+
+ *ptr++ = HexChars[PC];
+ *ptr++ = ':';
+ ptr = GspMem2Hex((PCHAR)&TrapFrame->Eip, ptr, 4, 0); /* PC */
+ *ptr++ = ';';
+
+ *ptr = '\0';
+}
/*
* This function does all command procesing for interfacing to GDB.
@@ -1277,224 +1216,219 @@
/* FIXME: Stop on other CPUs too */
DPRINT("Thread %p entering stub\n", PsGetCurrentThread());
- ExceptionCode = (NTSTATUS) ExceptionRecord->ExceptionCode;
-
- /* Can only debug 1 thread at a time... */
- ExAcquireFastMutex(&GspLock);
- DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread());
-
- GspUnloadBreakpoints();
-
- /* Make sure we're debugging the current thread. */
- if (NULL != GspDbgThread)
- {
- DPRINT1("Internal error: entering stub with non-NULL
GspDbgThread\n");
- ObDereferenceObject(GspDbgThread);
- GspDbgThread = NULL;
- }
-
- if (GdbAttached)
- {
- GspStopReply(ExceptionCode, TrapFrame);
- GspPutPacket(GspOutBuffer);
- // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
- }
- else
- {
- GdbAttached = TRUE;
- }
-
- while (TRUE)
- {
- /* Zero the buffer now so we don't have to worry about the terminating zero
character */
- memset(GspOutBuffer, 0, sizeof(GspOutBuffer));
- ptr = GspGetPacket();
- // DbgPrint("<<< (%s) <<<\n", ptr);
-
- switch(*ptr++)
- {
+ ExceptionCode = (NTSTATUS)ExceptionRecord->ExceptionCode;
+
+ /* Can only debug 1 thread at a time... */
+ ExAcquireFastMutex(&GspLock);
+ DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread());
+
+ GspUnloadBreakpoints();
+
+ /* Make sure we're debugging the current thread. */
+ if (NULL != GspDbgThread)
+ {
+ DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n");
+ ObDereferenceObject(GspDbgThread);
+ GspDbgThread = NULL;
+ }
+
+ if (GdbAttached)
+ {
+ GspStopReply(ExceptionCode, TrapFrame);
+ GspPutPacket(GspOutBuffer);
+ // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
+ }
+ else
+ {
+ GdbAttached = TRUE;
+ }
+
+ while (TRUE)
+ {
+ /* Zero the buffer now so we don't have to worry about the terminating zero
character */
+ memset(GspOutBuffer, 0, sizeof(GspOutBuffer));
+ ptr = GspGetPacket();
+ // DbgPrint("<<< (%s) <<<\n", ptr);
+
+ switch (*ptr++)
+ {
case '?':
- /* a little hack to send more complete status information */
- GspStopReply(ExceptionCode, TrapFrame);
- break;
+ /* a little hack to send more complete status information */
+ GspStopReply(ExceptionCode, TrapFrame);
+ break;
+
case 'd':
- GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */
- break;
+ GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */
+ break;
+
case 'g': /* return the value of the CPU Registers */
- GspGetRegisters(GspOutBuffer, TrapFrame);
- break;
+ GspGetRegisters(GspOutBuffer, TrapFrame);
+ break;
+
case 'G': /* set the value of the CPU Registers - return OK */
- if (NULL != GspDbgThread)
+ if (NULL != GspDbgThread)
+ GspSetRegistersInTrapFrame(ptr, Context,
GspDbgThread->Tcb.TrapFrame);
+ else
+ GspSetRegistersInTrapFrame(ptr, Context, TrapFrame);
+
+ strcpy(GspOutBuffer, "OK");
+ break;
+
+ case 'P': /* set the value of a single CPU register - return OK */
+ {
+ LONG Register;
+
+ if ((GspHex2Long(&ptr, &Register)) && (*ptr++ ==
'='))
{
- GspSetRegistersInTrapFrame(ptr, Context,
GspDbgThread->Tcb.TrapFrame);
- }
- else
- {
- GspSetRegistersInTrapFrame(ptr, Context, TrapFrame);
- }
- strcpy(GspOutBuffer, "OK");
- break;
- case 'P': /* set the value of a single CPU register - return OK */
- {
- LONG Register;
-
- if ((GspHex2Long(&ptr, &Register)) && (*ptr++ ==
'='))
- {
if ((Register >= 0) && (Register < NUMREGS))
- {
+ {
if (GspDbgThread)
- {
- GspSetSingleRegisterInTrapFrame(ptr, Register,
- Context,
+ {
+ GspSetSingleRegisterInTrapFrame(ptr, Register, Context,
GspDbgThread->Tcb.TrapFrame);
- }
+ }
else
- {
- GspSetSingleRegisterInTrapFrame(ptr, Register,
- Context, TrapFrame);
- }
+ {
+ GspSetSingleRegisterInTrapFrame(ptr, Register, Context,
TrapFrame);
+ }
strcpy(GspOutBuffer, "OK");
break;
- }
- }
+ }
+ }
strcpy(GspOutBuffer, "E01");
break;
- }
+ }
/* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
case 'm':
- /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
- if (GspHex2Long(&ptr, &Address) &&
- *(ptr++) == ',' &&
- GspHex2Long(&ptr, &Length))
+ {
+ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
+ if (GspHex2Long(&ptr, &Address) && *(ptr++) ==
',' && GspHex2Long(&ptr, &Length))
{
- PEPROCESS DbgProcess = NULL;
-
- ptr = NULL;
- if (NULL != GspDbgThread &&
- PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
+ PEPROCESS DbgProcess = NULL;
+
+ ptr = NULL;
+ if (NULL != GspDbgThread &&
+ PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
{
- DbgProcess = GspDbgThread->ThreadsProcess;
- KeAttachProcess(&DbgProcess->Pcb);
+ DbgProcess = GspDbgThread->ThreadsProcess;
+ KeAttachProcess(&DbgProcess->Pcb);
}
- GspMemoryError = FALSE;
- GspMem2Hex((PCHAR) Address, GspOutBuffer, Length, 1);
- if (NULL != DbgProcess)
+
+ GspMemoryError = FALSE;
+ GspMem2Hex((PCHAR)Address, GspOutBuffer, Length, 1);
+
+ if (NULL != DbgProcess)
+ KeDetachProcess();
+
+ if (GspMemoryError)
{
- KeDetachProcess();
- }
- if (GspMemoryError)
- {
- strcpy(GspOutBuffer, "E03");
- DPRINT1("Fault during memory read\n");
+ strcpy(GspOutBuffer, "E03");
+ DPRINT1("Fault during memory read\n");
}
}
- if (NULL != ptr)
- {
- strcpy(GspOutBuffer, "E01");
- }
- break;
+ if (NULL != ptr)
+ strcpy(GspOutBuffer, "E01");
+
+ break;
+ }
/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
case 'M':
- /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
- if (GspHex2Long(&ptr, &Address))
+ {
+ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
+ if (GspHex2Long(&ptr, &Address))
{
- if (*(ptr++) == ',' &&
- GspHex2Long(&ptr, &Length) &&
- *(ptr++) == ':')
+ if (*(ptr++) == ',' && GspHex2Long(&ptr,
&Length) && *(ptr++) == ':')
{
- PEPROCESS DbgProcess = NULL;
-
- if (NULL != GspDbgThread &&
- PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
+ PEPROCESS DbgProcess = NULL;
+
+ if (NULL != GspDbgThread &&
+ PsGetCurrentProcess() != GspDbgThread->ThreadsProcess)
{
- DbgProcess = GspDbgThread->ThreadsProcess;
- KeAttachProcess(&DbgProcess->Pcb);
+ DbgProcess = GspDbgThread->ThreadsProcess;
+ KeAttachProcess(&DbgProcess->Pcb);
}
- GspMemoryError = FALSE;
- GspHex2Mem(ptr, (PCHAR) Address, Length, TRUE);
- if (NULL != DbgProcess)
+ GspMemoryError = FALSE;
+ GspHex2Mem(ptr, (PCHAR)Address, Length, TRUE);
+ if (NULL != DbgProcess)
+ KeDetachProcess();
+
+ if (GspMemoryError)
{
- KeDetachProcess();
+ strcpy(GspOutBuffer, "E03");
+ DPRINT1("Fault during memory write\n");
}
- if (GspMemoryError)
+ else
{
- strcpy(GspOutBuffer, "E03");
- DPRINT1("Fault during memory write\n");
+ strcpy(GspOutBuffer, "OK");
}
- else
- {
- strcpy(GspOutBuffer, "OK");
- }
- ptr = NULL;
+ ptr = NULL;
}
}
- if (NULL != ptr)
- {
- strcpy(GspOutBuffer, "E02");
- }
- break;
-
- /* cAA..AA Continue at address AA..AA(optional) */
- /* sAA..AA Step one instruction from AA..AA(optional) */
+ if (NULL != ptr)
+ strcpy(GspOutBuffer, "E02");
+
+ break;
+ }
+
+ /* cAA..AA Continue at address AA..AA */
+ /* sAA..AA Step one instruction from AA..AA */
case 's':
- Stepping = TRUE;
+ Stepping = TRUE;
case 'c':
- {
+ {
ULONG BreakpointNumber;
ULONG Dr6;
/* try to read optional parameter, pc changed if param */
- if (GspHex2Long (&ptr, &Address))
- {
+ if (GspHex2Long(&ptr, &Address))
+ {
Context->Eip = Address;
- }
+ }
else if (ExceptionCode == STATUS_BREAKPOINT)
- {
- if (GspReadMemSafe((PCHAR) Context->Eip) == (CHAR)
I386_OPCODE_INT3)
- {
+ {
+ if (GspReadMemSafe((PCHAR)Context->Eip) ==
(CHAR)I386_OPCODE_INT3)
Context->Eip++;
- }
- }
+ }
/* clear the trace bit */
Context->EFlags &= ~EFLAGS_TF;
/* set the trace bit if we're Stepping */
if (Stepping)
- {
Context->EFlags |= EFLAGS_TF;
- }
Dr6 = Ke386GetDr6();
if (!(Dr6 & DR6_BS))
- {
- for (BreakpointNumber = 0; BreakpointNumber < MAX_HW_BREAKPOINTS;
++BreakpointNumber)
- {
+ {
+ for (BreakpointNumber = 0;
+ BreakpointNumber < MAX_HW_BREAKPOINTS;
+ BreakpointNumber++)
+ {
if (Dr6 & (1 << BreakpointNumber))
- {
+ {
if (GspHwBreakpoints[BreakpointNumber].Type ==
I386_BP_TYPE_EXECUTE)
- {
+ {
/* Set restore flag */
Context->EFlags |= EFLAGS_RF;
break;
- }
- }
- }
- }
+ }
+ }
+ }
+ }
GspLoadBreakpoints(TrapFrame);
Ke386SetDr6(0);
if (NULL != GspDbgThread)
- {
+ {
ObDereferenceObject(GspDbgThread);
GspDbgThread = NULL;
- }
+ }
DPRINT("Thread %p releasing mutex\n", PsGetCurrentThread());
ExReleaseFastMutex(&GspLock);
@@ -1502,31 +1436,29 @@
if (ExceptionCode == STATUS_BREAKPOINT ||
ExceptionCode == STATUS_SINGLE_STEP)
- {
return kdContinue;
- }
return kdHandleException;
- }
-
- case 'k': /* kill the program */
- strcpy(GspOutBuffer, "OK");
- break;
+ }
+
+ case 'k': /* kill the program */
+ strcpy(GspOutBuffer, "OK");
+ break;
case 'H': /* Set thread */
- GspSetThread(ptr);
- break;
+ GspSetThread(ptr);
+ break;
case 'q': /* Query */
- GspQuery(ptr);
- break;
+ GspQuery(ptr);
+ break;
case 'T': /* Query thread status */
- GspQueryThreadStatus(ptr);
- break;
+ GspQueryThreadStatus(ptr);
+ break;
case 'Z':
- {
+ {
LONG Type;
LONG Address;
LONG Length;
@@ -1536,19 +1468,17 @@
GspHex2Long(&ptr, &Address);
ptr++;
GspHex2Long(&ptr, &Length);
+
if (0 == Type)
- {
- GspSetSwBreakpoint((ULONG_PTR) Address);
- }
+ GspSetSwBreakpoint((ULONG_PTR)Address);
else
- {
- GspSetHwBreakpoint(Type, (ULONG_PTR) Address, Length);
- }
- break;
- }
+ GspSetHwBreakpoint(Type, (ULONG_PTR)Address, Length);
+
+ break;
+ }
case 'z':
- {
+ {
LONG Type;
LONG Address;
LONG Length;
@@ -1558,68 +1488,60 @@
GspHex2Long(&ptr, &Address);
ptr++;
GspHex2Long(&ptr, &Length);
+
if (0 == Type)
- {
- GspRemoveSwBreakpoint((ULONG_PTR) Address);
- }
+ GspRemoveSwBreakpoint((ULONG_PTR)Address);
else
- {
- GspRemoveHwBreakpoint(Type, (ULONG_PTR) Address, Length);
- }
- break;
- }
+ GspRemoveHwBreakpoint(Type, (ULONG_PTR)Address, Length);
+
+ break;
+ }
default:
- break;
- }
-
- /* reply to the request */
- GspPutPacket(GspOutBuffer);
- // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
- }
-}
-
+ break;
+ }
+
+ /* reply to the request */
+ GspPutPacket(GspOutBuffer);
+ // DbgPrint(">>> (%s) >>>\n", GspOutBuffer);
+ }
+}
BOOLEAN
NTAPI
-GspBreakIn(PKINTERRUPT Interrupt,
- PVOID ServiceContext)
-{
- PKTRAP_FRAME TrapFrame;
- BOOLEAN DoBreakIn;
- CONTEXT Context;
- KIRQL OldIrql;
- UCHAR Value;
-
- DPRINT("Break In\n");
-
- DoBreakIn = FALSE;
- while (KdPortGetByteEx(&GdbPortInfo, &Value))
- {
- if (Value == 0x03)
- {
- DoBreakIn = TRUE;
- }
- }
-
- if (!DoBreakIn)
- {
- return TRUE;
- }
-
- KeRaiseIrql(HIGH_LEVEL, &OldIrql);
-
- TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
-
- KeTrapFrameToContext(TrapFrame, NULL, &Context);
-
- KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
-
- KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode);
-
- KeLowerIrql(OldIrql);
-
- return TRUE;
+GspBreakIn(PKINTERRUPT Interrupt, PVOID ServiceContext)
+{
+ PKTRAP_FRAME TrapFrame;
+ BOOLEAN DoBreakIn;
+ CONTEXT Context;
+ KIRQL OldIrql;
+ UCHAR Value;
+
+ DPRINT("Break In\n");
+
+ DoBreakIn = FALSE;
+ while (KdPortGetByteEx(&GdbPortInfo, &Value))
+ {
+ if (Value == 0x03)
+ DoBreakIn = TRUE;
+ }
+
+ if (!DoBreakIn)
+ return TRUE;
+
+ KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+
+ TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
+
+ KeTrapFrameToContext(TrapFrame, NULL, &Context);
+
+ KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
+
+ KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags,
KernelMode);
+
+ KeLowerIrql(OldIrql);
+
+ return TRUE;
}
VOID
@@ -1631,40 +1553,37 @@
/* Initialize the GDB stub */
VOID
NTAPI
-KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable,
- ULONG BootPhase)
-{
- if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
- {
- return;
- }
-
- if (BootPhase == 0)
- {
- ExInitializeFastMutex(&GspLock);
-
- /* Write out the functions that we support for now */
- WrapperTable->KdpInitRoutine = KdpGdbStubInit;
- WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
- WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
-
- /* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
- }
- else if (BootPhase == 1)
- {
- GspInitialized = TRUE;
-
- GspRunThread = NULL;
- GspDbgThread = NULL;
- GspEnumThread = NULL;
-
- HalDisplayString("Waiting for GDB to attach\n");
- DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
- }
- else if (BootPhase == 2)
- {
- HalDisplayString("\n GDB debugging enabled\n\n");
+KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, ULONG BootPhase)
+{
+ if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
+ return;
+
+ if (BootPhase == 0)
+ {
+ ExInitializeFastMutex(&GspLock);
+
+ /* Write out the functions that we support for now */
+ WrapperTable->KdpInitRoutine = KdpGdbStubInit;
+ WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
+ WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
+
+ /* Initialize the Port */
+ KdPortInitializeEx(&GdbPortInfo, 0, 0);
+ }
+ else if (BootPhase == 1)
+ {
+ GspInitialized = TRUE;
+
+ GspRunThread = NULL;
+ GspDbgThread = NULL;
+ GspEnumThread = NULL;
+
+ HalDisplayString("Waiting for GDB to attach\n");
+ DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+ }
+ else if (BootPhase == 2)
+ {
+ HalDisplayString("\n GDB debugging enabled\n\n");
}
}