[ros-diffs] [fireball] 30921: - Cleanup code, add inline assembly versions for MSVC compiler.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Nov 30 22:04:13 CET 2007


Author: fireball
Date: Sat Dec  1 00:04:12 2007
New Revision: 30921

URL: http://svn.reactos.org/svn/reactos?rev=30921&view=rev
Log:
- Cleanup code, add inline assembly versions for MSVC compiler.

Modified:
    trunk/reactos/ntoskrnl/kdbg/kdb.c

Modified: trunk/reactos/ntoskrnl/kdbg/kdb.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb.c?rev=30921&r1=30920&r2=30921&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb.c (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb.c Sat Dec  1 00:04:12 2007
@@ -135,17 +135,42 @@
 STATIC VOID
 KdbpTrapFrameToKdbTrapFrame(PKTRAP_FRAME TrapFrame, PKDB_KTRAP_FRAME KdbTrapFrame)
 {
+   ULONG TrapCr0, TrapCr2, TrapCr3, TrapCr4;
+
    /* Copy the TrapFrame only up to Eflags and zero the rest*/
    RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
    RtlZeroMemory((PVOID)((ULONG_PTR)&KdbTrapFrame->Tf + FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)),
                  sizeof (KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
+
+#ifndef _MSC_VER
    asm volatile(
       "movl %%cr0, %0"    "\n\t"
       "movl %%cr2, %1"    "\n\t"
       "movl %%cr3, %2"    "\n\t"
       "movl %%cr4, %3"    "\n\t"
-      : "=r"(KdbTrapFrame->Cr0), "=r"(KdbTrapFrame->Cr2),
-        "=r"(KdbTrapFrame->Cr3), "=r"(KdbTrapFrame->Cr4));
+      : "=r"(TrapCr0), "=r"(TrapCr2),
+        "=r"(TrapCr3), "=r"(TrapCr4));
+#else
+   __asm
+   {
+       mov eax, cr0;
+       mov TrapCr0, eax;
+
+       mov eax, cr2;
+       mov TrapCr2, eax;
+
+       mov eax, cr3;
+       mov TrapCr3, eax;
+/* FIXME: What's the problem with cr4? */
+       //mov eax, cr4;
+       //mov TrapCr4, eax;
+   }
+#endif
+
+    KdbTrapFrame->Cr0 = TrapCr0;
+    KdbTrapFrame->Cr2 = TrapCr2;
+    KdbTrapFrame->Cr3 = TrapCr3;
+    KdbTrapFrame->Cr4 = TrapCr4;
 
     KdbTrapFrame->Tf.HardwareEsp = KiEspFromTrapFrame(TrapFrame);
     KdbTrapFrame->Tf.HardwareSegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
@@ -282,7 +307,7 @@
 KdbpShouldStepOverInstruction(ULONG_PTR Eip)
 {
    UCHAR Mem[3];
-   UINT i = 0;
+   ULONG i = 0;
 
    if (!NT_SUCCESS(KdbpSafeReadMemory(Mem, (PVOID)Eip, sizeof (Mem))))
    {
@@ -342,7 +367,7 @@
 BOOLEAN
 KdbpStepIntoInstruction(ULONG_PTR Eip)
 {
-   KDESCRIPTOR Idtr;
+    KDESCRIPTOR Idtr = {0};
    UCHAR Mem[2];
    INT IntVect;
    ULONG IntDesc[2];
@@ -372,7 +397,7 @@
    }
 
    /* Read the interrupt descriptor table register  */
-   asm volatile("sidt %0" : : "m"(Idtr.Limit));
+   Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&Idtr.Limit);
    if (IntVect >= (Idtr.Limit + 1) / 8)
    {
       /*KdbpPrint("IDT does not contain interrupt vector %d\n.", IntVect);*/
@@ -677,7 +702,7 @@
    IN NTSTATUS ExceptionCode,
    IN PKTRAP_FRAME TrapFrame)
 {
-   UINT i;
+   ULONG i;
    ASSERT(ExceptionCode == STATUS_SINGLE_STEP || ExceptionCode == STATUS_BREAKPOINT);
 
    if (ExceptionCode == STATUS_BREAKPOINT) /* Software interrupt */
@@ -883,7 +908,7 @@
    IN LONG BreakPointNr  OPTIONAL,
    IN OUT PKDB_BREAKPOINT BreakPoint  OPTIONAL)
 {
-   UINT i;
+   ULONG i;
    NTSTATUS Status;
 
    if (BreakPointNr < 0)
@@ -933,7 +958,7 @@
             break;
          }
       }
-      if (i != (UINT)-1) /* not found */
+      if (i != (ULONG)-1) /* not found */
          ASSERT(0);
    }
    else
@@ -959,7 +984,7 @@
             break;
          }
       }
-      if (i != (UINT)-1) /* not found */
+      if (i != (ULONG)-1) /* not found */
          ASSERT(0);
    }
 
@@ -1048,7 +1073,7 @@
    /* Get a pointer to the thread */
    if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &Thread)))
    {
-      KdbpPrint("Invalid thread id: 0x%08x\n", (UINT)ThreadId);
+      KdbpPrint("Invalid thread id: 0x%08x\n", (ULONG)ThreadId);
       return FALSE;
    }
    Process = Thread->ThreadsProcess;
@@ -1127,14 +1152,14 @@
    /* Get a pointer to the process */
    if (!NT_SUCCESS(PsLookupProcessByProcessId(ProcessId, &Process)))
    {
-      KdbpPrint("Invalid process id: 0x%08x\n", (UINT)ProcessId);
+      KdbpPrint("Invalid process id: 0x%08x\n", (ULONG)ProcessId);
       return FALSE;
    }
 
    Entry = Process->ThreadListHead.Flink;
    if (Entry == &KdbCurrentProcess->ThreadListHead)
    {
-      KdbpPrint("No threads in process 0x%08x, cannot attach to process!\n", (UINT)ProcessId);
+      KdbpPrint("No threads in process 0x%08x, cannot attach to process!\n", (ULONG)ProcessId);
       return FALSE;
    }
 
@@ -1497,11 +1522,19 @@
           ExceptionRecord != NULL && ExceptionRecord->NumberParameters != 0)
       {
          /* FIXME: Add noexec memory stuff */
-         ULONG_PTR Cr2;
+         ULONG_PTR TrapCr2;
          ULONG Err;
-         asm volatile("movl %%cr2, %0" : "=r"(Cr2));
+#ifdef __GNUC__
+         asm volatile("movl %%cr2, %0" : "=r"(TrapCr2));
+#elif _MSC_VER
+         __asm mov eax, cr2;
+         __asm mov TrapCr2, eax;
+#else
+#error Unknown compiler for inline assembler
+#endif
+
          Err = TrapFrame->ErrCode;
-         DbgPrint("Memory at 0x%p could not be %s: ", Cr2, (Err & (1 << 1)) ? "written" : "read");
+         DbgPrint("Memory at 0x%p could not be %s: ", TrapCr2, (Err & (1 << 1)) ? "written" : "read");
          if ((Err & (1 << 0)) == 0)
             DbgPrint("Page not present.\n");
          else




More information about the Ros-diffs mailing list