https://git.reactos.org/?p=reactos.git;a=commitdiff;h=253362509ec64a2def87fdc818f3d553f23a20c6

commit 253362509ec64a2def87fdc818f3d553f23a20c6
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sun Jan 26 18:59:05 2020 +0100
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Wed Jul 20 23:57:42 2022 +0200

    [KDBG] Fix x64 KDBG
---
 ntoskrnl/ex/handle.c            |   8 +-
 ntoskrnl/kdbg/amd64/amd64-dis.c |   0
 ntoskrnl/kdbg/amd64/kdb_help.S  | 152 ++++++++++++++++++++++++++++++--
 ntoskrnl/kdbg/i386/i386-dis.c   |  34 ++++---
 ntoskrnl/kdbg/kdb.c             |  19 ++--
 ntoskrnl/kdbg/kdb.h             |   4 +-
 ntoskrnl/kdbg/kdb_cli.c         | 191 +++++++++++++++++++++++++++++-----------
 ntoskrnl/kdbg/kdb_expr.c        |   9 +-
 ntoskrnl/kdbg/kdb_symbols.c     |   2 +-
 ntoskrnl/mm/ARM3/kdbg.c         |   4 +-
 10 files changed, 340 insertions(+), 83 deletions(-)

diff --git a/ntoskrnl/ex/handle.c b/ntoskrnl/ex/handle.c
index 94b345caeb3..e932ca2efbd 100644
--- a/ntoskrnl/ex/handle.c
+++ b/ntoskrnl/ex/handle.c
@@ -22,6 +22,12 @@ EX_PUSH_LOCK HandleTableListLock;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
+#ifdef _WIN64
+#define strtoulptr strtoull
+#else
+#define strtoulptr strtoul
+#endif
+
 CODE_SEG("INIT")
 VOID
 NTAPI
@@ -1360,7 +1366,7 @@ BOOLEAN ExpKdbgExtHandle(ULONG Argc, PCHAR Argv[])
         }
         else
         {
-            ProcessId = (HANDLE)strtoul(Argv[1], &endptr, 10);
+            ProcessId = (HANDLE)strtoulptr(Argv[1], &endptr, 10);
             if (*endptr != '\0')
             {
                 KdbpPrint("Invalid parameter: %s\n", Argv[1]);
diff --git a/ntoskrnl/kdbg/amd64/amd64-dis.c b/ntoskrnl/kdbg/amd64/amd64-dis.c
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/ntoskrnl/kdbg/amd64/kdb_help.S b/ntoskrnl/kdbg/amd64/kdb_help.S
index 39ae8721f8e..bba83e3308b 100644
--- a/ntoskrnl/kdbg/amd64/kdb_help.S
+++ b/ntoskrnl/kdbg/amd64/kdb_help.S
@@ -1,22 +1,162 @@
 
 #include <asm.inc>
 
+#include <ksamd64.inc>
+
 .code64
 
+EXTERN KdbEnterDebuggerException : PROC
+
+PUBLIC KdbEnter
+FUNC KdbEnter
+
+    /* save flags */
+    pushfq
+    .allocstack 8
+
+    /* Make room for a KTRAP_FRAME */
+    sub rsp, KTRAP_FRAME_LENGTH
+    .allocstack KTRAP_FRAME_LENGTH
+    .ENDPROLOG
+
+    /* Save rbp */
+    mov [rsp + KTRAP_FRAME_Rbp], rbp
+
+    /* Save non-volatile registers */
+    mov [rsp + KTRAP_FRAME_Rbx], rbx
+    mov [rsp + KTRAP_FRAME_Rdi], rdi
+    mov [rsp + KTRAP_FRAME_Rsi], rsi
+
+    /* Save volatile registers */
+    mov [rsp + KTRAP_FRAME_Rax], rax
+    mov [rsp + KTRAP_FRAME_Rcx], rcx
+    mov [rsp + KTRAP_FRAME_Rdx], rdx
+    mov [rsp + KTRAP_FRAME_R8], r8
+    mov [rsp + KTRAP_FRAME_R9], r9
+    mov [rsp + KTRAP_FRAME_R10], r10
+    mov [rsp + KTRAP_FRAME_R11], r11
+
+    /* Save xmm registers */
+    movdqa [rsp + KTRAP_FRAME_Xmm0], xmm0
+    movdqa [rsp + KTRAP_FRAME_Xmm1], xmm1
+    movdqa [rsp + KTRAP_FRAME_Xmm2], xmm2
+    movdqa [rsp + KTRAP_FRAME_Xmm3], xmm3
+    movdqa [rsp + KTRAP_FRAME_Xmm4], xmm4
+    movdqa [rsp + KTRAP_FRAME_Xmm5], xmm5
+
+    /* Save cs and previous mode */
+    mov ax, cs
+    mov [rsp + KTRAP_FRAME_SegCs], ax
+    and ax, 1
+    mov [rsp + KTRAP_FRAME_PreviousMode], al
+
+    /* Save segment selectors */
+    mov ax, ds
+    mov [rsp + KTRAP_FRAME_SegDs], ax
+    mov ax, es
+    mov [rsp + KTRAP_FRAME_SegEs], ax
+    mov ax, fs
+    mov [rsp + KTRAP_FRAME_SegFs], ax
+    mov ax, gs
+    mov [rsp + KTRAP_FRAME_SegGs], ax
+
+    /* Save previous irql */
+    mov rax, cr8
+    mov [rsp + KTRAP_FRAME_PreviousIrql], al
+
+    /* Save debug registers */
+    mov rax, dr0
+    mov [rsp + KTRAP_FRAME_Dr0], rax
+    mov rax, dr1
+    mov [rsp + KTRAP_FRAME_Dr1], rax
+    mov rax, dr2
+    mov [rsp + KTRAP_FRAME_Dr2], rax
+    mov rax, dr3
+    mov [rsp + KTRAP_FRAME_Dr3], rax
+    mov rax, dr6
+    mov [rsp + KTRAP_FRAME_Dr6], rax
+    mov rax, dr7
+    mov [rsp + KTRAP_FRAME_Dr7], rax
+
+    /* Point rbp, where rsp was before */
+    lea rbp, [rsp + KTRAP_FRAME_LENGTH]
+    mov [rsp + KTRAP_FRAME_Rsp], rbp
+
+    /* Store the EFLAGS we previously pushed on the stack */
+    mov rax, [rbp + 8]
+    mov [rsp + KTRAP_FRAME_EFlags], rax
+
+    /* Get RIP from the stack */
+    mov rax, [rbp + 16]
+    mov [rsp + KTRAP_FRAME_Rip], rax
+
+    /* Make sure the direction flag is cleared */
+    cld
+
+    /* Clear all breakpoint enables in dr7. */
+    mov rax, dr7
+    and rax, HEX(ffffffffFFFF0000)
+    mov dr7, rax
+
+    /* Call KDB */
+    mov byte ptr [rsp + KTRAP_FRAME_P5], 1 /* FirstChance */
+    mov r9, rsp                /* Pointer to the trap frame */
+    mov r8, 0                  /* Context */
+    mov dl, 0                  /* PreviousMode (KernelMode) */
+    mov rcx, 0                 /* ExceptionRecord */
+    call KdbEnterDebuggerException
+
+    /* Restore segment selectors */
+    mov ax, [rsp + KTRAP_FRAME_SegDs]
+    mov ds, ax
+    mov ax, [rsp + KTRAP_FRAME_SegEs]
+    mov es, ax
+    mov ax, [rsp + KTRAP_FRAME_SegFs]
+    mov fs, ax
+
+    /* Restore non-volatile registers */
+    mov rbx, [rsp + KTRAP_FRAME_Rbx]
+    mov rdi, [rsp + KTRAP_FRAME_Rdi]
+    mov rsi, [rsp + KTRAP_FRAME_Rsi]
+
+    /* Restore volatile registers */
+    mov rax, [rsp + KTRAP_FRAME_Rax]
+    mov rcx, [rsp + KTRAP_FRAME_Rcx]
+    mov rdx, [rsp + KTRAP_FRAME_Rdx]
+    mov r8, [rsp + KTRAP_FRAME_R8]
+    mov r9, [rsp + KTRAP_FRAME_R9]
+    mov r10, [rsp + KTRAP_FRAME_R10]
+    mov r11, [rsp + KTRAP_FRAME_R11]
+
+    /* Restore RSP */
+    mov rsp, [rsp + KTRAP_FRAME_Rsp]
+
+    /* Restore EFLAGS */
+    popfq
+
+    ret
+ENDFUNC
+
 PUBLIC KdbpStackSwitchAndCall
 KdbpStackSwitchAndCall:
-    push rbp
-    mov rbp, rsp    /* Old stack - frame */
 
-    /* Switch stack */
+    /* Save old stack */
+    mov rax, rsp
+
+    /* Set new stack */
     mov rsp, rcx
 
+    /* Save old stack on new stack */
+    push rax
+
     /* Call function */
     call rdx
 
-    /* Switch back to old stack */
-    pop rsp
+    /* Restore old stack */
+    pop rax
+    mov rsp, rax
 
-    ret 8
+    /* Return */
+    ret
 
 END
diff --git a/ntoskrnl/kdbg/i386/i386-dis.c b/ntoskrnl/kdbg/i386/i386-dis.c
index 4b8a0d1ec3b..c60470aa436 100644
--- a/ntoskrnl/kdbg/i386/i386-dis.c
+++ b/ntoskrnl/kdbg/i386/i386-dis.c
@@ -22,11 +22,11 @@ typedef enum bfd_architecture
 {
   bfd_arch_i386,
 } bfd_arch;
-typedef unsigned int bfd_vma;
+typedef uintptr_t bfd_vma;
 typedef unsigned char bfd_byte;
 enum bfd_endian { BFD_ENDIAN_BIG, BIG_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
 typedef void* bfd;
-typedef signed int bfd_signed_vma;
+typedef intptr_t bfd_signed_vma;
 #define bfd_mach_x86_64_intel_syntax 0
 #define bfd_mach_x86_64 1
 #define bfd_mach_i386_i386_intel_syntax 2
@@ -36,7 +36,7 @@ typedef signed int bfd_signed_vma;
 #define _(X) X
 #define ATTRIBUTE_UNUSED
 extern int sprintf(char *str, const char *format, ...);
-#define sprintf_vma(BUF, VMA) sprintf(BUF, "0x%X", VMA)
+#define sprintf_vma(BUF, VMA) sprintf(BUF, "0x%IX", VMA)
 struct disassemble_info;
 
 int
@@ -63,20 +63,20 @@ KdbpNopPrintDisasm(void* Ignored, const char* fmt, ...)
 }
 
 static int
-KdbpReadMemory(unsigned int Addr, unsigned char* Data, unsigned int Length,
+KdbpReadMemory(uintptr_t Addr, unsigned char* Data, unsigned int Length,
               struct disassemble_info * Ignored)
 {
   return KdbpSafeReadMemory(Data, (void *)Addr, Length); /* 0 means no error */
 }
 
 static void
-KdbpMemoryError(int Status, unsigned int Addr,
+KdbpMemoryError(int Status, uintptr_t Addr,
                struct disassemble_info * Ignored)
 {
 }
 
 static void
-KdbpPrintAddressInCode(unsigned int Addr, struct disassemble_info * Ignored)
+KdbpPrintAddressInCode(uintptr_t Addr, struct disassemble_info * Ignored)
 {
     if (!KdbSymPrintAddress((void*)Addr, NULL))
     {
@@ -85,14 +85,14 @@ KdbpPrintAddressInCode(unsigned int Addr, struct 
disassemble_info * Ignored)
 }
 
 static void
-KdbpNopPrintAddress(unsigned int Addr, struct disassemble_info * Ignored)
+KdbpNopPrintAddress(uintptr_t Addr, struct disassemble_info * Ignored)
 {
 }
 
 #include "dis-asm.h"
 
 LONG
-KdbpGetInstLength(IN ULONG Address)
+KdbpGetInstLength(IN ULONG_PTR Address)
 {
   disassemble_info info;
 
@@ -101,7 +101,11 @@ KdbpGetInstLength(IN ULONG Address)
   info.application_data = NULL;
   info.flavour = bfd_target_unknown_flavour;
   info.arch = bfd_arch_i386;
+#ifdef _M_AMD64
+  info.mach = bfd_mach_x86_64;
+#else
   info.mach = bfd_mach_i386_i386;
+#endif
   info.insn_sets = 0;
   info.flags = 0;
   info.read_memory_func = KdbpReadMemory;
@@ -118,7 +122,7 @@ KdbpGetInstLength(IN ULONG Address)
 }
 
 LONG
-KdbpDisassemble(IN ULONG Address, IN ULONG IntelSyntax)
+KdbpDisassemble(IN ULONG_PTR Address, IN ULONG IntelSyntax)
 {
   disassemble_info info;
 
@@ -263,7 +267,11 @@ struct dis_private {
 #define FWAIT_OPCODE (0x9b)
 
 /* Set to 1 for 64bit mode disassembly.  */
+#ifdef _M_AMD64
+static int mode_64bit = 1;
+#else
 static int mode_64bit;
+#endif
 
 /* Flags for the prefixes for the current instruction.  See below.  */
 static int prefixes;
@@ -2079,7 +2087,7 @@ static int
 print_insn (bfd_vma pc, disassemble_info *info)
 {
   const struct dis386 *dp;
-  int i;
+  intptr_t i;
   char *first, *second, *third;
   int needcomma;
   unsigned char uses_SSE_prefix;
@@ -2151,8 +2159,12 @@ print_insn (bfd_vma pc, disassemble_info *info)
       if (p != NULL)
        p++;
     }
+#else
+#ifdef _M_AMD64
+  mode_64bit = 1;
 #else
   mode_64bit = 0;
+#endif
   priv.orig_sizeflag = AFLAG | DFLAG;
   /*intel_syntax = 0;*/
 #endif
@@ -3188,7 +3200,7 @@ print_operand_value (char *buf, int hex, bfd_vma disp)
          if (v < 0)
            {
              *(buf++) = '-';
-             v = -disp;
+             v = -v;
              /* Check for possible overflow on 0x8000000000000000.  */
              if (v < 0)
                {
diff --git a/ntoskrnl/kdbg/kdb.c b/ntoskrnl/kdbg/kdb.c
index df1da7da3d2..abe8f96b2cd 100644
--- a/ntoskrnl/kdbg/kdb.c
+++ b/ntoskrnl/kdbg/kdb.c
@@ -18,6 +18,13 @@
 /* DEFINES *******************************************************************/
 
 #define KDB_STACK_SIZE                   (4096*3)
+#ifdef _M_AMD64
+#define KDB_STACK_ALIGN                 16
+#define KDB_STACK_RESERVE               (5 * sizeof(PVOID)) /* Home space + 
return address */
+#else
+#define KDB_STACK_ALIGN                 4
+#define KDB_STACK_RESERVE               sizeof(ULONG) /* Return address */
+#endif
 #define KDB_MAXIMUM_BREAKPOINT_COUNT     256
 #define KDB_MAXIMUM_HW_BREAKPOINT_COUNT  4
 #define KDB_MAXIMUM_SW_BREAKPOINT_COUNT  256
@@ -28,7 +35,7 @@
 /* GLOBALS *******************************************************************/
 
 static LONG KdbEntryCount = 0;
-static CHAR KdbStack[KDB_STACK_SIZE];
+static DECLSPEC_ALIGN(KDB_STACK_ALIGN) CHAR KdbStack[KDB_STACK_SIZE];
 
 static ULONG KdbBreakPointCount = 0;  /* Number of used breakpoints in the 
array */
 static KDB_BREAKPOINT KdbBreakPoints[KDB_MAXIMUM_BREAKPOINT_COUNT] = {{0}};  
/* Breakpoint array */
@@ -333,7 +340,7 @@ KdbpStepIntoInstruction(
     }
 
     /* Get the interrupt descriptor */
-    if (!NT_SUCCESS(KdbpSafeReadMemory(IntDesc, (PVOID)(ULONG_PTR)(Idtr.Base + 
(IntVect * 8)), sizeof (IntDesc))))
+    if (!NT_SUCCESS(KdbpSafeReadMemory(IntDesc, (PVOID)((ULONG_PTR)Idtr.Base + 
(IntVect * 8)), sizeof(IntDesc))))
     {
         /*KdbpPrint("Couldn't access memory at 0x%p\n", (ULONG_PTR)Idtr.Base + 
(IntVect * 8));*/
         return FALSE;
@@ -479,7 +486,7 @@ KdbpInsertBreakPoint(
     IN  BOOLEAN Global,
     OUT PLONG BreakPointNr  OPTIONAL)
 {
-    LONG i;
+    LONG_PTR i;
     PVOID Condition;
     PCHAR ConditionExpressionDup;
     LONG ErrOffset;
@@ -673,7 +680,7 @@ KdbpIsBreakPointOurs(
                    KdbHwBreakPoints[i]->Enabled);
             DebugReg = KdbHwBreakPoints[i]->Data.Hw.DebugReg;
 
-            if ((Context->Dr6 & (1 << DebugReg)) != 0)
+            if ((Context->Dr6 & ((ULONG_PTR)1 << DebugReg)) != 0)
             {
                 return KdbHwBreakPoints[i] - KdbBreakPoints;
             }
@@ -1174,7 +1181,7 @@ KdbpInternalEnter(VOID)
 
     // KdbpPrint("Switching to KDB stack 0x%08x-0x%08x (Current Stack is 
0x%08x)\n", Thread->Tcb.StackLimit, Thread->Tcb.StackBase, Esp);
 
-    KdbpStackSwitchAndCall(KdbStack + KDB_STACK_SIZE - sizeof(ULONG), 
KdbpCallMainLoop);
+    KdbpStackSwitchAndCall(KdbStack + KDB_STACK_SIZE - KDB_STACK_RESERVE, 
KdbpCallMainLoop);
 
     Thread->Tcb.InitialStack = SavedInitialStack;
     Thread->Tcb.StackBase = SavedStackBase;
@@ -1489,7 +1496,7 @@ KdbEnterDebuggerException(
         }
 
         KdbpPrint("\nEntered debugger on embedded INT3 at 0x%04x:0x%p.\n",
-                  Context->SegCs & 0xffff, KeGetContextPc(Context) - 1);
+                  Context->SegCs & 0xffff, KeGetContextPc(Context));
     }
     else
     {
diff --git a/ntoskrnl/kdbg/kdb.h b/ntoskrnl/kdbg/kdb.h
index aa8cb8e8f18..68f4ce03b05 100644
--- a/ntoskrnl/kdbg/kdb.h
+++ b/ntoskrnl/kdbg/kdb.h
@@ -64,12 +64,12 @@ typedef enum _KDB_OUTPUT_SETTINGS
 
 LONG
 KdbpDisassemble(
-   IN ULONG Address,
+   IN ULONG_PTR Address,
    IN ULONG IntelSyntax);
 
 LONG
 KdbpGetInstLength(
-   IN ULONG Address);
+   IN ULONG_PTR Address);
 
 /* from i386/kdb_help.S */
 
diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c
index 6c903f93695..4958dd9be71 100644
--- a/ntoskrnl/kdbg/kdb_cli.c
+++ b/ntoskrnl/kdbg/kdb_cli.c
@@ -21,7 +21,7 @@
  * FILE:            ntoskrnl/kdbg/kdb_cli.c
  * PURPOSE:         Kernel debugger command line interface
  * PROGRAMMER:      Gregor Anich ([email protected])
- *                  Herv� Poussineau
+ *                  Hervé Poussineau
  * UPDATE HISTORY:
  *                  Created 16/01/2005
  */
@@ -101,6 +101,8 @@ BOOLEAN ExpKdbgExtDefWrites(ULONG Argc, PCHAR Argv[]);
 BOOLEAN ExpKdbgExtIrpFind(ULONG Argc, PCHAR Argv[]);
 BOOLEAN ExpKdbgExtHandle(ULONG Argc, PCHAR Argv[]);
 
+extern char __ImageBase;
+
 #ifdef __ROS_DWARF__
 static BOOLEAN KdbpCmdPrintStruct(ULONG Argc, PCHAR Argv[]);
 #endif
@@ -364,7 +366,9 @@ static const struct
     /* Data */
     { NULL, NULL, "Data", NULL },
     { "?", "? expression", "Evaluate expression.", KdbpCmdEvalExpression },
+#ifdef _M_IX86 // FIXME: this is broken on x64
     { "disasm", "disasm [address] [L count]", "Disassemble count instructions 
at address.", KdbpCmdDisassembleX },
+#endif // _M_IX86
     { "x", "x [address] [L count]", "Display count dwords, starting at 
address.", KdbpCmdDisassembleX },
     { "regs", "regs", "Display general purpose registers.", KdbpCmdRegs },
     { "sregs", "sregs", "Display status registers.", KdbpCmdRegs },
@@ -373,7 +377,6 @@ static const struct
 #ifdef __ROS_DWARF__
     { "dt", "dt [mod] [type] [addr]", "Print a struct. The address is 
optional.", KdbpCmdPrintStruct },
 #endif
-
     /* Flow control */
     { NULL, NULL, "Flow control", NULL },
     { "cont", "cont", "Continue execution (leave debugger).", KdbpCmdContinue 
},
@@ -485,7 +488,8 @@ KdbpCmdEvalExpression(
     ULONG Argc,
     PCHAR Argv[])
 {
-    ULONG i, len;
+    ULONG i;
+    SIZE_T len;
     ULONGLONG Result = 0;
     ULONG ul;
     LONG l = 0;
@@ -882,7 +886,7 @@ KdbpCmdDisassembleX(
         while (Count > 0)
         {
             if (!KdbSymPrintAddress((PVOID)Address, NULL))
-                KdbpPrint("<%08x>:", Address);
+                KdbpPrint("<%p>:", (PVOID)Address);
             else
                 KdbpPrint(":");
 
@@ -1085,6 +1089,10 @@ KdbpIsNestedTss(
     if (!Tss)
         return FALSE;
 
+#ifdef _M_AMD64
+    // HACK
+    return FALSE;
+#else
     /* Retrieve the TSS Backlink */
     if (!NT_SUCCESS(KdbpSafeReadMemory(&Backlink,
                                        (PVOID)&Tss->Backlink,
@@ -1092,6 +1100,7 @@ KdbpIsNestedTss(
     {
         return FALSE;
     }
+#endif
 
     return (Backlink != 0 && Backlink != TssSelector);
 }
@@ -1107,6 +1116,10 @@ KdbpContextFromPrevTss(
     USHORT Backlink;
     PKTSS Tss = *pTss;
 
+#ifdef _M_AMD64
+    // HACK
+    return FALSE;
+#else
     /* Retrieve the TSS Backlink */
     if (!NT_SUCCESS(KdbpSafeReadMemory(&Backlink,
                                        (PVOID)&Tss->Backlink,
@@ -1139,10 +1152,103 @@ KdbpContextFromPrevTss(
     *pTss = Tss;
     Context->Eip = Eip;
     Context->Ebp = Ebp;
+#endif
     return TRUE;
 }
 #endif
 
+#ifdef _M_AMD64
+
+static
+BOOLEAN
+GetNextFrame(
+    _Inout_ PCONTEXT Context)
+{
+    PRUNTIME_FUNCTION FunctionEntry;
+    ULONG64 ImageBase, EstablisherFrame;
+    PVOID HandlerData;
+
+    _SEH2_TRY
+    {
+        /* Lookup the FunctionEntry for the current RIP */
+        FunctionEntry = RtlLookupFunctionEntry(Context->Rip, &ImageBase, NULL);
+        if (FunctionEntry == NULL)
+        {
+            /* No function entry, so this must be a leaf function. Pop the 
return address from the stack.
+            Note: this can happen after the first frame as the result of an 
exception */
+            Context->Rip = *(DWORD64*)Context->Rsp;
+            Context->Rsp += sizeof(DWORD64);
+            return TRUE;
+        }
+        else
+        {
+            RtlVirtualUnwind(UNW_FLAG_NHANDLER,
+                             ImageBase,
+                             Context->Rip,
+                             FunctionEntry,
+                             Context,
+                             &HandlerData,
+                             &EstablisherFrame,
+                             NULL);
+        }
+    }
+    _SEH2_EXCEPT(1)
+    {
+        return FALSE;
+    }
+    _SEH2_END
+
+    return TRUE;
+}
+
+static BOOLEAN
+KdbpCmdBackTrace(
+    ULONG Argc,
+    PCHAR Argv[])
+{
+    CONTEXT Context = *KdbCurrentTrapFrame;
+    ULONG64 CurrentRsp, CurrentRip;
+
+    KdbpPrint("Rip:\n");
+    if (!KdbSymPrintAddress((PVOID)KeGetContextPc(&Context), &Context))
+        KdbpPrint("<%p>\n", KeGetContextPc(&Context));
+    else
+        KdbpPrint("\n");
+
+    /* Walk through the frames */
+    KdbpPrint("Frames:\n");
+    for (;;)
+    {
+        CurrentRip = Context.Rip;
+        CurrentRsp = Context.Rsp;
+
+        BOOLEAN GotNextFrame = GetNextFrame(&Context);
+
+        KdbpPrint("[%p] ", (PVOID)CurrentRsp);
+        Context.Rsp = Context.Rsp;
+
+        /* Print the location afrer the call instruction */
+        if (!KdbSymPrintAddress((PVOID)CurrentRip, &Context))
+            KdbpPrint("<%p>", (PVOID)Context.Rip);
+
+        KdbpPrint(" (stack: 0x%Ix)\n", Context.Rsp - CurrentRsp);
+
+        if (KdbOutputAborted)
+            break;
+
+        if (Context.Rsp == 0)
+            break;
+
+        if (!GotNextFrame)
+        {
+            KdbpPrint("Couldn't access memory at 0x%p!\n", (PVOID)Context.Rsp);
+            break;
+        }
+    }
+
+    return TRUE;
+}
+#else
 /*!\brief Displays a backtrace.
  */
 static BOOLEAN
@@ -1316,6 +1422,8 @@ CheckForParentTSS:
     return TRUE;
 }
 
+#endif // M_AMD64
+
 /*!\brief Continues execution of the system/leaves KDB.
  */
 static BOOLEAN
@@ -1410,7 +1518,7 @@ KdbpCmdBreakPointList(
         else
         {
             GlobalOrLocal = Buffer;
-            sprintf(Buffer, "  PID 0x%lx",
+            sprintf(Buffer, "  PID 0x%Ix",
                     (ULONG_PTR)(Process ? Process->UniqueProcessId : 
INVALID_HANDLE_VALUE));
         }
 
@@ -1989,9 +2097,9 @@ KdbpCmdMod(
     {
         if (!KdbpSymFindModule(NULL, 0, &LdrEntry))
         {
-            ULONG_PTR ntoskrnlBase = ((ULONG_PTR)KdbpCmdMod) & 0xfff00000;
+            ULONG_PTR ntoskrnlBase = (ULONG_PTR)__ImageBase;
             KdbpPrint("  Base      Size      Name\n");
-            KdbpPrint("  %08x  %08x  %s\n", ntoskrnlBase, 0, "ntoskrnl.exe");
+            KdbpPrint("  %p  %08x  %s\n", (PVOID)ntoskrnlBase, 0, 
"ntoskrnl.exe");
             return TRUE;
         }
 
@@ -2239,6 +2347,7 @@ KdbpCmdPcr(
     PKIPCR Pcr = (PKIPCR)KeGetPcr();
 
     KdbpPrint("Current PCR is at 0x%p.\n", Pcr);
+#ifdef _M_IX86
     KdbpPrint("  Tib.ExceptionList:         0x%08x\n"
               "  Tib.StackBase:             0x%08x\n"
               "  Tib.StackLimit:            0x%08x\n"
@@ -2246,75 +2355,59 @@ KdbpCmdPcr(
               "  Tib.FiberData/Version:     0x%08x\n"
               "  Tib.ArbitraryUserPointer:  0x%08x\n"
               "  Tib.Self:                  0x%08x\n"
-#ifdef _M_IX86
               "  SelfPcr:                   0x%08x\n"
-#else
-              "  Self:                      0x%p\n"
-#endif
               "  PCRCB:                     0x%08x\n"
               "  Irql:                      0x%02x\n"
-#ifdef _M_IX86
               "  IRR:                       0x%08x\n"
               "  IrrActive:                 0x%08x\n"
               "  IDR:                       0x%08x\n"
-#endif
               "  KdVersionBlock:            0x%08x\n"
-#ifdef _M_IX86
               "  IDT:                       0x%08x\n"
               "  GDT:                       0x%08x\n"
               "  TSS:                       0x%08x\n"
-#endif
               "  MajorVersion:              0x%04x\n"
               "  MinorVersion:              0x%04x\n"
-#ifdef _M_IX86
               "  SetMember:                 0x%08x\n"
-#endif
               "  StallScaleFactor:          0x%08x\n"
-#ifdef _M_IX86
               "  Number:                    0x%02x\n"
-#endif
               "  L2CacheAssociativity:      0x%02x\n"
-#ifdef _M_IX86
               "  VdmAlert:                  0x%08x\n"
-#endif
               "  L2CacheSize:               0x%08x\n"
-#ifdef _M_IX86
               "  InterruptMode:             0x%08x\n"
-#endif
               , Pcr->NtTib.ExceptionList, Pcr->NtTib.StackBase, 
Pcr->NtTib.StackLimit,
               Pcr->NtTib.SubSystemTib, Pcr->NtTib.FiberData, 
Pcr->NtTib.ArbitraryUserPointer,
               Pcr->NtTib.Self
-#ifdef _M_IX86
               , Pcr->SelfPcr
-#else
-              , Pcr->Self
-#endif
               , Pcr->Prcb, Pcr->Irql
-#ifdef _M_IX86
               , Pcr->IRR, Pcr->IrrActive , Pcr->IDR
-#endif
               , Pcr->KdVersionBlock
-#ifdef _M_IX86
               , Pcr->IDT, Pcr->GDT, Pcr->TSS
-#endif
               , Pcr->MajorVersion, Pcr->MinorVersion
-#ifdef _M_IX86
               , Pcr->SetMember
-#endif
               , Pcr->StallScaleFactor
-#ifdef _M_IX86
               , Pcr->Number
-#endif
               , Pcr->SecondLevelCacheAssociativity
-#ifdef _M_IX86
               , Pcr->VdmAlert
-#endif
               , Pcr->SecondLevelCacheSize
-#ifdef _M_IX86
-              , Pcr->InterruptMode
+              , Pcr->InterruptMode);
+#else
+    KdbpPrint("  GdtBase:                       0x%p\n", Pcr->GdtBase);
+    KdbpPrint("  TssBase:                       0x%p\n", Pcr->TssBase);
+    KdbpPrint("  UserRsp:                       0x%p\n", (PVOID)Pcr->UserRsp);
+    KdbpPrint("  Self:                          0x%p\n", Pcr->Self);
+    KdbpPrint("  CurrentPrcb:                   0x%p\n", Pcr->CurrentPrcb);
+    KdbpPrint("  LockArray:                     0x%p\n", Pcr->LockArray);
+    KdbpPrint("  Used_Self:                     0x%p\n", Pcr->Used_Self);
+    KdbpPrint("  IdtBase:                       0x%p\n", Pcr->IdtBase);
+    KdbpPrint("  Irql:                          %u\n", Pcr->Irql);
+    KdbpPrint("  SecondLevelCacheAssociativity: 0x%u\n", 
Pcr->SecondLevelCacheAssociativity);
+    KdbpPrint("  ObsoleteNumber:                %u\n", Pcr->ObsoleteNumber);
+    KdbpPrint("  MajorVersion:                  0x%x\n", Pcr->MajorVersion);
+    KdbpPrint("  MinorVersion:                  0x%x\n", Pcr->MinorVersion);
+    KdbpPrint("  StallScaleFactor:              0x%lx\n", 
Pcr->StallScaleFactor);
+    KdbpPrint("  SecondLevelCacheSize:          0x%lx\n", 
Pcr->SecondLevelCacheSize);
+    KdbpPrint("  KdVersionBlock:                0x%p\n", Pcr->KdVersionBlock);
 #endif
-              );
-
 
     return TRUE;
 }
@@ -2417,7 +2510,7 @@ KdbpCmdTss(
 
     return TRUE;
 }
-#endif
+#endif // _M_IX86
 
 /*!\brief Bugchecks the system.
  */
@@ -2724,7 +2817,7 @@ KdbpPrint(
     CHAR c = '\0';
     PCHAR p, p2;
     ULONG Length;
-    ULONG i, j;
+    SIZE_T i, j;
     LONG RowsPrintedByTerminal;
     ULONG ScanCode;
     va_list ap;
@@ -3039,7 +3132,7 @@ KdbpPager(
     CHAR c = '\0';
     PCHAR p, p2;
     ULONG Length;
-    ULONG i, j;
+    SIZE_T i, j;
     LONG RowsPrintedByTerminal;
     ULONG ScanCode;
 
@@ -3298,8 +3391,8 @@ static VOID
 KdbpCommandHistoryAppend(
     IN PCHAR Command)
 {
-    ULONG Length1 = strlen(Command) + 1;
-    ULONG Length2 = 0;
+    SIZE_T Length1 = strlen(Command) + 1;
+    SIZE_T Length2 = 0;
     INT i;
     PCHAR Buffer;
 
@@ -3380,7 +3473,7 @@ KdbpReadCommand(
     static CHAR LastCommand[1024];
     static CHAR NextKey = '\0';
     INT CmdHistIndex = -1;
-    INT i;
+    INT_PTR i;
 
     EchoOn = !((KdbDebugState & KD_DEBUG_KDNOECHO) != 0);
 
@@ -3644,7 +3737,7 @@ static BOOLEAN
 KdbpDoCommand(
     IN PCHAR Command)
 {
-    ULONG i;
+    SIZE_T i;
     PCHAR p;
     ULONG Argc;
     // FIXME: for what do we need a 1024 characters command line and 256 
tokens?
@@ -3784,7 +3877,7 @@ VOID
 KdbpCliInterpretInitFile(VOID)
 {
     PCHAR p1, p2;
-    INT i;
+    INT_PTR i;
     CHAR c;
 
     /* Execute the commands in the init file */
diff --git a/ntoskrnl/kdbg/kdb_expr.c b/ntoskrnl/kdbg/kdb_expr.c
index 348d71286c3..73bff96cde1 100644
--- a/ntoskrnl/kdbg/kdb_expr.c
+++ b/ntoskrnl/kdbg/kdb_expr.c
@@ -437,8 +437,8 @@ RpnpParseExpression(
     RPN_OP ComparativeOp;
     BOOLEAN ComparativeOpFilled = FALSE;
     BOOLEAN IsComparativeOp;
-    INT i, i2;
-    ULONG ul;
+    INT_PTR i, i2;
+    ULONG64 ull;
     UCHAR MemorySize;
     CHAR Buffer[16];
     BOOLEAN First;
@@ -596,13 +596,12 @@ get_operand:
             else
             {
                 /* Immediate value */
-                /* FIXME: Need string to ULONGLONG function */
-                ul = strtoul(p, &pend, 0);
+                ull = strtoull(p, &pend, 0);
                 if (p != pend)
                 {
                     RpnOp.Type = RpnOpImmediate;
                     RpnOp.CharacterOffset = CharacterOffset;
-                    RpnOp.Data.Immediate = (ULONGLONG)ul;
+                    RpnOp.Data.Immediate = ull;
                     CharacterOffset += pend - p;
                     p = pend;
                 }
diff --git a/ntoskrnl/kdbg/kdb_symbols.c b/ntoskrnl/kdbg/kdb_symbols.c
index 997b55e5516..2f2703b717c 100644
--- a/ntoskrnl/kdbg/kdb_symbols.c
+++ b/ntoskrnl/kdbg/kdb_symbols.c
@@ -175,7 +175,7 @@ KdbSymPrintAddress(
             /* Use KdpPrintString because KdpDprintf is limited wrt string 
size */
             KdpDprintf("<%s:%x (", ModuleNameAnsi, RelativeAddress);
             str.Buffer = FileName;
-            str.Length = strnlen(FileName, sizeof(FileName));
+            str.Length = (USHORT)strnlen(FileName, sizeof(FileName));
             str.MaximumLength = sizeof(FileName);
             KdpPrintString(&str);
             KdpDprintf(":%d (%s))>", LineNumber, FunctionName);
diff --git a/ntoskrnl/mm/ARM3/kdbg.c b/ntoskrnl/mm/ARM3/kdbg.c
index 5b2554a425f..92fe6af47dd 100644
--- a/ntoskrnl/mm/ARM3/kdbg.c
+++ b/ntoskrnl/mm/ARM3/kdbg.c
@@ -144,7 +144,7 @@ VOID
 ExpKdbgExtPoolUsedGetTag(PCHAR Arg, PULONG Tag, PULONG Mask)
 {
     CHAR Tmp[4];
-    ULONG Len;
+    SIZE_T Len;
     USHORT i;
 
     /* Get the tag */
@@ -175,7 +175,7 @@ ExpKdbgExtPoolUsed(
 {
     ULONG Tag = 0;
     ULONG Mask = 0;
-    ULONG Flags = 0;
+    ULONG_PTR Flags = 0;
 
     if (Argc > 1)
     {

Reply via email to