[ros-diffs] [sserapion] 44749: [ntoskrnl] - enable KdpEnableSafeMem for amd64 - unhack ExInitPoolLookasidePointers - hackplement KiInitializeContextThread - Remove extended eflag code from kdb, its useless. - Rewrite KdbpCmdGdtLdtIdt - Enable KdbpCmdTss - misc kdb fixes.

sserapion at svn.reactos.org sserapion at svn.reactos.org
Thu Dec 24 05:12:02 CET 2009


Author: sserapion
Date: Thu Dec 24 05:12:02 2009
New Revision: 44749

URL: http://svn.reactos.org/svn/reactos?rev=44749&view=rev
Log:
[ntoskrnl]
- enable KdpEnableSafeMem for amd64
- unhack ExInitPoolLookasidePointers
- hackplement KiInitializeContextThread
- Remove extended eflag code from kdb, its useless.
- Rewrite KdbpCmdGdtLdtIdt
- Enable KdbpCmdTss
- misc kdb fixes.

Modified:
    branches/ros-amd64-bringup/reactos/ntoskrnl/ex/lookas.c
    branches/ros-amd64-bringup/reactos/ntoskrnl/kd/kdinit.c
    branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/kdb_cli.c
    branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c
    branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ex/lookas.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/ex/lookas.c?rev=44749&r1=44748&r2=44749&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ex/lookas.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ex/lookas.c [iso-8859-1] Thu Dec 24 05:12:02 2009
@@ -72,24 +72,16 @@
         InitializeSListHead(&Entry->ListHead);
 
         /* Bind to PRCB */
-#ifdef _M_AMD64
-    DPRINT1("Something is missing here, Prcb = %p\n", Prcb);
- // FIXME
-#else
         Prcb->PPNPagedLookasideList[i].P = Entry;
         Prcb->PPNPagedLookasideList[i].L = Entry;
-#endif
+
         /* Initialize the paged list */
         Entry = &ExpSmallPagedPoolLookasideLists[i];
         InitializeSListHead(&Entry->ListHead);
 
         /* Bind to PRCB */
-#ifdef _M_AMD64
- // FIXME
-#else
         Prcb->PPPagedLookasideList[i].P = Entry;
         Prcb->PPPagedLookasideList[i].L = Entry;
-#endif
     }
 }
 

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/kd/kdinit.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/kd/kdinit.c?rev=44749&r1=44748&r2=44749&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/kd/kdinit.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/kd/kdinit.c [iso-8859-1] Thu Dec 24 05:12:02 2009
@@ -249,7 +249,7 @@
     }
     else /* BootPhase > 0 */
     {
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
         KdpEnableSafeMem();
 #endif
     }

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/kdb_cli.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/kdb_cli.c?rev=44749&r1=44748&r2=44749&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] Thu Dec 24 05:12:02 2009
@@ -602,21 +602,13 @@
 {
     PKTRAP_FRAME Tf = &KdbCurrentTrapFrame->Tf;
     INT i;
-    const PCHAR EflagsBits[64] = { " CF", NULL, " PF", " BIT3", " AF", " BIT5",
+    const PCHAR EflagsBits[32] = { " CF", NULL, " PF", " BIT3", " AF", " BIT5",
                                           " ZF", " SF", " TF", " IF", " DF", " OF",
                                           NULL, NULL, " NT", " BIT15", " RF", " VF",
                                           " AC", " VIF", " VIP", " ID", " BIT22",
                                           " BIT23", " BIT24", " BIT25", " BIT26",
-                                          " BIT27", " BIT28", " BIT29", " BIT30",
-                                          " BIT31", " BIT32", " BIT33", " BIT34",
-										  " BIT35", " BIT36", " BIT37", " BIT38",
-										  " BIT39", " BIT40", " BIT41", " BIT42",
-										  " BIT43", " BIT44", " BIT45", " BIT46",
-										  " BIT47", " BIT48", " BIT49", " BIT50",
-										  " BIT51", " BIT52", " BIT53", " BIT54",
-										  " BIT55", " BIT56", " BIT57", " BIT58",
-										  " BIT59", " BIT60", " BIT61", " BIT62",
-										  " BIT63",
+                                          " BIT27", " BIT28", " BIT29", " BIT30"
+                                          
 		};
 
     if (Argv[0][0] == 'r') /* regs */
@@ -654,11 +646,7 @@
 #endif
         KdbpPrint("EFLAGS  0x%08x ", Tf->EFlags);
 
-#ifdef _M_IX86
         for (i = 0; i < 32; i++)
-#elif defined(_M_AMD64)
-        for (i = 0; i < 64; i++)
-#endif
         {
             if (i == 1)
             {
@@ -1591,19 +1579,21 @@
 
 /*!\brief Displays GDT, LDT or IDTd.
  */
+#ifdef _M_AMD64
 static BOOLEAN
 KdbpCmdGdtLdtIdt(
     ULONG Argc,
     PCHAR Argv[])
 {
     KDESCRIPTOR Reg;
-    ULONG SegDesc[2];
-    ULONG SegBase;
+    KIDTENTRY IdtEntry;
+    KGDTENTRY GdtEntry;
+    ULONG_PTR SegBase;
     ULONG SegLimit;
     PCHAR SegType;
     USHORT SegSel;
     UCHAR Type, Dpl;
-    INT i;
+    INT i = 0;
     ULONG ul;
 
     if (Argv[0][0] == 'i')
@@ -1617,49 +1607,53 @@
             return TRUE;
         }
 
-        KdbpPrint("IDT Base: 0x%08x  Limit: 0x%04x\n", Reg.Base, Reg.Limit);
+        KdbpPrint("IDT Base: 0x%p  Limit: 0x%04x\n", Reg.Base, Reg.Limit);
         KdbpPrint("  Idx  Type        Seg. Sel.  Offset      DPL\n");
 
-        for (i = 0; (i + sizeof(SegDesc) - 1) <= Reg.Limit; i += 8)
-        {
-            if (!NT_SUCCESS(KdbpSafeReadMemory(SegDesc, (PVOID)((ULONG_PTR)Reg.Base + i), sizeof(SegDesc))))
-            {
-                KdbpPrint("Couldn't access memory at 0x%08x!\n", (ULONG_PTR)Reg.Base + i);
+        while (i < (Reg.Limit)/sizeof(IdtEntry))
+        {
+            if (!NT_SUCCESS(KdbpSafeReadMemory(&IdtEntry, (PVOID)((ULONG_PTR)Reg.Base +(i *sizeof(IdtEntry))), sizeof(IdtEntry))))
+            {
+                KdbpPrint("Couldn't access memory at 0x%x!\n", (ULONG_PTR)Reg.Base + sizeof(IdtEntry));
                 return TRUE;
             }
 
-            Dpl = ((SegDesc[1] >> 13) & 3);
-            if ((SegDesc[1] & 0x1f00) == 0x0500)        /* Task gate */
+            Dpl = IdtEntry.Dpl;
+            if (IdtEntry.Type == 0x5)        /* Task gate */
                 SegType = "TASKGATE";
-            else if ((SegDesc[1] & 0x1fe0) == 0x0e00)   /* 32 bit Interrupt gate */
+            else if (IdtEntry.Type == 0xE)   /* 32 bit Interrupt gate */
                 SegType = "INTGATE32";
-            else if ((SegDesc[1] & 0x1fe0) == 0x0600)   /* 16 bit Interrupt gate */
+            else if (IdtEntry.Type == 0x6)   /* 16 bit Interrupt gate */
                 SegType = "INTGATE16";
-            else if ((SegDesc[1] & 0x1fe0) == 0x0f00)   /* 32 bit Trap gate */
+            else if (IdtEntry.Type == 0xF)   /* 32 bit Trap gate */
                 SegType = "TRAPGATE32";
-            else if ((SegDesc[1] & 0x1fe0) == 0x0700)   /* 16 bit Trap gate */
+            else if (IdtEntry.Type == 0x7)   /* 16 bit Trap gate */
                 SegType = "TRAPGATE16";
             else
                 SegType = "UNKNOWN";
 
-            if ((SegDesc[1] & (1 << 15)) == 0) /* not present */
+            if (IdtEntry.Present == 0) /* not present */
             {
                 KdbpPrint("  %03d  %-10s  [NP]       [NP]        %02d\n",
-                          i / 8, SegType, Dpl);
-            }
-            else if ((SegDesc[1] & 0x1f00) == 0x0500) /* Task gate */
-            {
-                SegSel = SegDesc[0] >> 16;
+                          i, SegType, Dpl);
+            }
+            else if (IdtEntry.Type == 0x5) /* Task gate */
+            {
+                SegSel = IdtEntry.Selector;
                 KdbpPrint("  %03d  %-10s  0x%04x                 %02d\n",
-                          i / 8, SegType, SegSel, Dpl);
+                          i, SegType, SegSel, Dpl);
             }
             else
             {
-                SegSel = SegDesc[0] >> 16;
-                SegBase = (SegDesc[1] & 0xffff0000) | (SegDesc[0] & 0x0000ffff);
-                KdbpPrint("  %03d  %-10s  0x%04x     0x%08x  %02d\n",
-                          i / 8, SegType, SegSel, SegBase, Dpl);
-            }
+                SegSel = IdtEntry.Selector;
+                SegBase = (ULONG64)IdtEntry.OffsetLow |
+                   (ULONG64)IdtEntry.OffsetMiddle << 16 |
+                   (ULONG64)IdtEntry.OffsetHigh << 32;
+
+                KdbpPrint("  %03d  %-10s       0x%04x        0x%p     %02d\n",
+                          i , SegType, SegSel, SegBase, Dpl);
+            }
+            i++;
         }
     }
     else
@@ -1669,25 +1663,17 @@
         if (Argv[0][0] == 'g')
         {
             /* Read GDTR */
-#ifdef _M_IX86
-            Ke386GetGlobalDescriptorTable(&Reg.Limit);
-#elif defined(_M_AMD64)
 			__sgdt(&Reg.Limit);
-#endif
-            i = 8;
+
         }
         else
         {
             ASSERT(Argv[0][0] == 'l');
 
             /* Read LDTR */
-#ifdef _M_IX86
-            Reg.Limit = Ke386GetLocalDescriptorTable();
-#elif defined(_M_AMD64)
-			__sldt(&Reg.Limit);
-#endif
+            __sldt(&Reg.Limit);
+
             Reg.Base = 0;
-            i = 0;
             ul = 1 << 2;
         }
 
@@ -1698,28 +1684,27 @@
             return TRUE;
         }
 
-        KdbpPrint("%cDT Base: 0x%08x  Limit: 0x%04x\n",
+        KdbpPrint("%cDT Base: 0x%p  Limit: 0x%04x\n",
                   Argv[0][0] == 'g' ? 'G' : 'L', Reg.Base, Reg.Limit);
         KdbpPrint("  Idx  Sel.    Type         Base        Limit       DPL  Attribs\n");
 
-        for (; (i + sizeof(SegDesc) - 1) <= Reg.Limit; i += 8)
-        {
-            if (!NT_SUCCESS(KdbpSafeReadMemory(SegDesc, (PVOID)((ULONG_PTR)Reg.Base + i), sizeof(SegDesc))))
-            {
-                KdbpPrint("Couldn't access memory at 0x%08x!\n", (ULONG_PTR)Reg.Base + i);
+        while (i < (Reg.Limit)/sizeof(GdtEntry))
+        {
+            if (!NT_SUCCESS(KdbpSafeReadMemory(&GdtEntry, (PVOID)((ULONG_PTR)Reg.Base +(i * 8)), sizeof(GdtEntry))))
+            {
+                KdbpPrint("Couldn't access memory at 0x%p!\n", (ULONG_PTR)Reg.Base + i);
                 return TRUE;
             }
 
-            Dpl = ((SegDesc[1] >> 13) & 3);
-            Type = ((SegDesc[1] >> 8) & 0xf);
-
-            SegBase = SegDesc[0] >> 16;
-            SegBase |= (SegDesc[1] & 0xff) << 16;
-            SegBase |= SegDesc[1] & 0xff000000;
-            SegLimit = SegDesc[0] & 0x0000ffff;
-            SegLimit |= (SegDesc[1] >> 16) & 0xf;
-
-            if ((SegDesc[1] & (1 << 23)) != 0)
+            Dpl = GdtEntry.Bits.Dpl;
+            Type = GdtEntry.Bits.Type;
+
+            SegBase = (ULONG_PTR)KiGetGdtDescriptorBase(&GdtEntry);
+
+            SegLimit = GdtEntry.LimitLow;
+            SegLimit |= (ULONG64)GdtEntry.Bits.LimitHigh << 32;
+
+            if (GdtEntry.Bits.DefaultBig != 0)
             {
                 SegLimit *= 4096;
                 SegLimit += 4095;
@@ -1729,7 +1714,7 @@
                 SegLimit++;
             }
 
-            if ((SegDesc[1] & (1 << 12)) == 0) /* System segment */
+            if (GdtEntry.Bits.System == 1) /* System segment */
             {
                 switch (Type)
                 {
@@ -1755,6 +1740,230 @@
                     SegLimit = 0;
                 }
             }
+            else if ((Type & (1 << 3)) == 0) /* Data segment */
+            {
+                if (GdtEntry.Bits.LongMode != 0)
+                    SegType = "DATA32";
+                else
+                    SegType = "DATA16";
+            }
+            else /* Code segment */
+            {
+                if (GdtEntry.Bits.LongMode != 0)
+                    SegType = "CODE32";
+                else
+                    SegType = "CODE16";
+            }
+
+            if (GdtEntry.Bits.Present == 0) /* not present */
+            {
+                KdbpPrint("  %03d  0x%04x  %-11s  [NP]        [NP]        %02d   NP\n",
+                          i, i | Dpl | ul, SegType, Dpl);
+            }
+            else
+            {
+                KdbpPrint("  %03d  0x%04x  %-11s  0x%p  0x%08x  %02d  ",
+                          i, i | Dpl | ul, SegType, SegBase, SegLimit, Dpl);
+
+                if (GdtEntry.Bits.System == 1) /* System segment */
+                {
+                    /* FIXME: Display system segment */
+                    /* they are twice as big as regular segments */
+                    i++;
+                }
+                else if ((Type & (1 << 3)) == 0) /* Data segment */
+                {
+                    if ((Type & (1 << 2)) != 0) /* Expand-down */
+                        KdbpPrint(" E");
+
+                    KdbpPrint((Type & (1 << 1)) ? " R/W" : " R");
+
+                    if ((Type & (1 >> 1)) != 0)
+                        KdbpPrint(" A");
+                }
+                else /* Code segment */
+                {
+                    if ((Type & (1 << 2)) != 0) /* Conforming */
+                        KdbpPrint(" C");
+
+                    KdbpPrint((Type & (1 << 1)) ? " R/X" : " X");
+
+                    if ((Type & (1 << 1)) != 0)
+                        KdbpPrint(" A");
+                }
+
+                if ((GdtEntry.Bits.LimitHigh & (1 << 3)) != 0)
+                    KdbpPrint(" AVL");
+
+                KdbpPrint("\n");
+            }
+            i++;
+        }
+    }
+
+    return TRUE;
+}
+#endif
+
+/*!\brief Displays GDT, LDT or IDTd.
+ */
+#ifdef _M_IX86
+static BOOLEAN
+KdbpCmdGdtLdtIdt(
+    ULONG Argc,
+    PCHAR Argv[])
+{
+    KDESCRIPTOR Reg;
+    ULONG SegDesc[2];
+    ULONG SegBase;
+    ULONG SegLimit;
+    PCHAR SegType;
+    USHORT SegSel;
+    UCHAR Type, Dpl;
+    INT i;
+    ULONG ul;
+
+    if (Argv[0][0] == 'i')
+    {
+        /* Read IDTR */
+        __sidt(&Reg.Limit);
+
+        if (Reg.Limit < 7)
+        {
+            KdbpPrint("Interrupt descriptor table is empty.\n");
+            return TRUE;
+        }
+
+        KdbpPrint("IDT Base: 0x%08x  Limit: 0x%04x\n", Reg.Base, Reg.Limit);
+        KdbpPrint("  Idx  Type        Seg. Sel.  Offset      DPL\n");
+
+        for (i = 0; (i + sizeof(SegDesc) - 1) <= Reg.Limit; i += 8)
+        {
+            if (!NT_SUCCESS(KdbpSafeReadMemory(SegDesc, (PVOID)((ULONG_PTR)Reg.Base + i), sizeof(SegDesc))))
+            {
+                KdbpPrint("Couldn't access memory at 0x%08x!\n", (ULONG_PTR)Reg.Base + i);
+                return TRUE;
+            }
+
+            Dpl = ((SegDesc[1] >> 13) & 3);
+            if ((SegDesc[1] & 0x1f00) == 0x0500)        /* Task gate */
+                SegType = "TASKGATE";
+            else if ((SegDesc[1] & 0x1fe0) == 0x0e00)   /* 32 bit Interrupt gate */
+                SegType = "INTGATE32";
+            else if ((SegDesc[1] & 0x1fe0) == 0x0600)   /* 16 bit Interrupt gate */
+                SegType = "INTGATE16";
+            else if ((SegDesc[1] & 0x1fe0) == 0x0f00)   /* 32 bit Trap gate */
+                SegType = "TRAPGATE32";
+            else if ((SegDesc[1] & 0x1fe0) == 0x0700)   /* 16 bit Trap gate */
+                SegType = "TRAPGATE16";
+            else
+                SegType = "UNKNOWN";
+
+            if ((SegDesc[1] & (1 << 15)) == 0) /* not present */
+            {
+                KdbpPrint("  %03d  %-10s  [NP]       [NP]        %02d\n",
+                          i / 8, SegType, Dpl);
+            }
+            else if ((SegDesc[1] & 0x1f00) == 0x0500) /* Task gate */
+            {
+                SegSel = SegDesc[0] >> 16;
+                KdbpPrint("  %03d  %-10s  0x%04x                 %02d\n",
+                          i / 8, SegType, SegSel, Dpl);
+            }
+            else
+            {
+                SegSel = SegDesc[0] >> 16;
+                SegBase = (SegDesc[1] & 0xffff0000) | (SegDesc[0] & 0x0000ffff);
+                KdbpPrint("  %03d  %-10s  0x%04x     0x%08x  %02d\n",
+                          i / 8, SegType, SegSel, SegBase, Dpl);
+            }
+        }
+    }
+    else
+    {
+        ul = 0;
+
+        if (Argv[0][0] == 'g')
+        {
+            /* Read GDTR */
+            Ke386GetGlobalDescriptorTable(&Reg.Limit);
+            i = 8;
+        }
+        else
+        {
+            ASSERT(Argv[0][0] == 'l');
+
+            /* Read LDTR */
+            Reg.Limit = Ke386GetLocalDescriptorTable();
+            Reg.Base = 0;
+            i = 0;
+            ul = 1 << 2;
+        }
+
+        if (Reg.Limit < 7)
+        {
+            KdbpPrint("%s descriptor table is empty.\n",
+                      Argv[0][0] == 'g' ? "Global" : "Local");
+            return TRUE;
+        }
+
+        KdbpPrint("%cDT Base: 0x%08x  Limit: 0x%04x\n",
+                  Argv[0][0] == 'g' ? 'G' : 'L', Reg.Base, Reg.Limit);
+        KdbpPrint("  Idx  Sel.    Type         Base        Limit       DPL  Attribs\n");
+
+        for (; (i + sizeof(SegDesc) - 1) <= Reg.Limit; i += 8)
+        {
+            if (!NT_SUCCESS(KdbpSafeReadMemory(SegDesc, (PVOID)((ULONG_PTR)Reg.Base + i), sizeof(SegDesc))))
+            {
+                KdbpPrint("Couldn't access memory at 0x%08x!\n", (ULONG_PTR)Reg.Base + i);
+                return TRUE;
+            }
+
+            Dpl = ((SegDesc[1] >> 13) & 3);
+            Type = ((SegDesc[1] >> 8) & 0xf);
+
+            SegBase = SegDesc[0] >> 16;
+            SegBase |= (SegDesc[1] & 0xff) << 16;
+            SegBase |= SegDesc[1] & 0xff000000;
+            SegLimit = SegDesc[0] & 0x0000ffff;
+            SegLimit |= (SegDesc[1] >> 16) & 0xf;
+
+            if ((SegDesc[1] & (1 << 23)) != 0)
+            {
+                SegLimit *= 4096;
+                SegLimit += 4095;
+            }
+            else
+            {
+                SegLimit++;
+            }
+
+            if ((SegDesc[1] & (1 << 12)) == 0) /* System segment */
+            {
+                switch (Type)
+                {
+                    case 1: SegType = "TSS16(Avl)"; break;
+                    case 2: SegType = "LDT"; break;
+                    case 3: SegType = "TSS16(Busy)"; break;
+                    case 4: SegType = "CALLGATE16"; break;
+                    case 5: SegType = "TASKGATE"; break;
+                    case 6: SegType = "INTGATE16"; break;
+                    case 7: SegType = "TRAPGATE16"; break;
+                    case 9: SegType = "TSS32(Avl)"; break;
+                    case 11: SegType = "TSS32(Busy)"; break;
+                    case 12: SegType = "CALLGATE32"; break;
+                    case 14: SegType = "INTGATE32"; break;
+                    case 15: SegType = "INTGATE32"; break;
+                    default: SegType = "UNKNOWN"; break;
+                }
+
+                if (!(Type >= 1 && Type <= 3) &&
+                    Type != 9 && Type != 11)
+                {
+                    SegBase = 0;
+                    SegLimit = 0;
+                }
+            }
             else if ((SegDesc[1] & (1 << 11)) == 0) /* Data segment */
             {
                 if ((SegDesc[1] & (1 << 22)) != 0)
@@ -1815,6 +2024,7 @@
 
     return TRUE;
 }
+#endif
 
 /*!\brief Displays the KPCR
  */
@@ -1862,21 +2072,21 @@
               Pcr->VdmAlert, Pcr->SecondLevelCacheSize, Pcr->InterruptMode);
 #elif defined(_M_AMD64)
     KdbpPrint("Current PCR is at 0x%x.\n", (INT_PTR)Pcr);
-    KdbpPrint("  Tib.ExceptionList:         0x%x\n"
-              "  Tib.StackBase:             0x%x\n"
+    KdbpPrint("  Tib.ExceptionList:         0x%p\n"
+              "  Tib.StackBase:             0x%p\n"
               "  Tib.StackLimit:            0x%x\n"
-              "  Tib.SubSystemTib:          0x%x\n"
+              "  Tib.SubSystemTib:          0x%p\n"
               "  Tib.FiberData/Version:     0x%x\n"
-              "  Tib.ArbitraryUserPointer:  0x%x\n"
-              "  Tib.Self:                  0x%x\n"
-              "  Self:                      0x%x\n"
-              "  PCRCB:                     0x%x\n"
+              "  Tib.ArbitraryUserPointer:  0x%p\n"
+              "  Tib.Self:                  0x%p\n"
+              "  Self:                      0x%p\n"
+              "  PCRCB:                     0x%p\n"
               "  Irql:                      0x%x\n"
               "  KdVersionBlock:            0x%08x\n"
-              "  IDT:                       0x%08x\n"
-              "  GDT:                       0x%08x\n"
-              "  TSS:                       0x%08x\n"
-              "  UserRsp:                   0x%08x\n"
+              "  IDT:                       0x%p\n"
+              "  GDT:                       0x%p\n"
+              "  TSS:                       0x%p\n"
+              "  UserRsp:                   0x%p\n"
               "  MajorVersion:              0x%04x\n"
               "  MinorVersion:              0x%04x\n"
               "  StallScaleFactor:          0x%08x\n"
@@ -1902,8 +2112,8 @@
 #ifdef _M_IX86
     KTSS *Tss = KeGetPcr()->TSS;
 
-    KdbpPrint("Current TSS is at 0x%08x.\n", (INT)Tss);
-    KdbpPrint("  Eip:           0x%08x\n"
+    KdbpPrint("Current TSS is at 0x%p.\n", (INT_PTR)Tss);
+    KdbpPrint("  Eip:           0x%p\n"
               "  Es:            0x%04x\n"
               "  Cs:            0x%04x\n"
               "  Ss:            0x%04x\n"
@@ -1912,10 +2122,18 @@
               "  Gs:            0x%04x\n"
               "  IoMapBase:     0x%04x\n",
               Tss->Eip, Tss->Es, Tss->Cs, Tss->Ds, Tss->Fs, Tss->Gs, Tss->IoMapBase);
-
+#elif defined(_M_AMD64)
+    KTSS *Tss = KeGetPcr()->TssBase;
+
+    KdbpPrint("Current TSS is at 0x%p.\n", (INT_PTR)Tss);
+    KdbpPrint("  Rsp0:           0x%p\n"
+              "  Rsp1:           0x%p\n"
+              "  Rsp2:           0x%p\n"
+              "  Ist:            0x%p\n"
+              "  IoMapBase:      0x%04x\n",
+              Tss->Rsp0, Tss->Rsp1, Tss->Rsp2, Tss->Ist, Tss->IoMapBase);
+#endif
     return TRUE;
-#endif
-    return FALSE;
 }
 
 /*!\brief Bugchecks the system.

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c?rev=44749&r1=44748&r2=44749&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c [iso-8859-1] Thu Dec 24 05:12:02 2009
@@ -714,7 +714,10 @@
         if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
 
         /* Hack! Wait for the debugger! */
-        //while (!KdPollBreakIn());
+#ifdef _WINKD_
+        while (!KdPollBreakIn());
+        DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+#endif
 
     }
 

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c?rev=44749&r1=44748&r2=44749&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c [iso-8859-1] Thu Dec 24 05:12:02 2009
@@ -11,7 +11,7 @@
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <debug.h>
-#if 0
+
 typedef struct _KSWITCHFRAME
 {
     PVOID ExceptionList;
@@ -32,16 +32,16 @@
     KSWITCHFRAME CtxSwitchFrame;
     KSTART_FRAME StartFrame;
     KTRAP_FRAME TrapFrame;
-    FX_SAVE_AREA FxSaveArea;
+    //FX_SAVE_AREA FxSaveArea;
 } KUINIT_FRAME, *PKUINIT_FRAME;
 
 typedef struct _KKINIT_FRAME
 {
     KSWITCHFRAME CtxSwitchFrame;
     KSTART_FRAME StartFrame;
-    FX_SAVE_AREA FxSaveArea;
+    //FX_SAVE_AREA FxSaveArea;
 } KKINIT_FRAME, *PKKINIT_FRAME;
-#endif
+
 /* FUNCTIONS *****************************************************************/
 
 VOID
@@ -52,10 +52,8 @@
                            IN PVOID StartContext,
                            IN PCONTEXT ContextPointer)
 {
-	FrLdrDbgPrint("KiInitializeContextThread stub\n");
-#if 0
-    PFX_SAVE_AREA FxSaveArea;
-    PFXSAVE_FORMAT FxSaveFormat;
+    //PFX_SAVE_AREA FxSaveArea;
+    //PFXSAVE_FORMAT FxSaveFormat;
     PKSTART_FRAME StartFrame;
     PKSWITCHFRAME CtxSwitchFrame;
     PKTRAP_FRAME TrapFrame;
@@ -78,60 +76,60 @@
 
         /* Zero out the trap frame and save area */
         RtlZeroMemory(&InitFrame->TrapFrame,
-                      KTRAP_FRAME_LENGTH + sizeof(FX_SAVE_AREA));
+                      KTRAP_FRAME_LENGTH);
 
         /* Setup the Fx Area */
-        FxSaveArea = &InitFrame->FxSaveArea;
+        //FxSaveArea = &InitFrame->FxSaveArea;
 
         /* Check if we support FXsr */
-        if (KeI386FxsrPresent)
-        {
-            /* Get the FX Save Format Area */
-            FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters;
-
-            /* Set an initial state */
-            FxSaveFormat->ControlWord = 0x27F;
-            FxSaveFormat->StatusWord = 0;
-            FxSaveFormat->TagWord = 0;
-            FxSaveFormat->ErrorOffset = 0;
-            FxSaveFormat->ErrorSelector = 0;
-            FxSaveFormat->DataOffset = 0;
-            FxSaveFormat->DataSelector = 0;
-            FxSaveFormat->MXCsr = 0x1F80;
-        }
-        else
-        {
-            /* Setup the regular save area */
-            Context->FloatSave.ControlWord = 0x27F;
-            Context->FloatSave.StatusWord = 0;
-            Context->FloatSave.TagWord = -1;
-            Context->FloatSave.ErrorOffset = 0;
-            Context->FloatSave.ErrorSelector = 0;
-            Context->FloatSave.DataOffset =0;
-            Context->FloatSave.DataSelector = 0;
-        }
+//        if (KeI386FxsrPresent)
+//        {
+//            /* Get the FX Save Format Area */
+//            FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters;
+//
+//            /* Set an initial state */
+//            FxSaveFormat->ControlWord = 0x27F;
+//            FxSaveFormat->StatusWord = 0;
+//            FxSaveFormat->TagWord = 0;
+//            FxSaveFormat->ErrorOffset = 0;
+//            FxSaveFormat->ErrorSelector = 0;
+//            FxSaveFormat->DataOffset = 0;
+//            FxSaveFormat->DataSelector = 0;
+//            FxSaveFormat->MXCsr = 0x1F80;
+//        }
+//        else
+//        {
+//            /* Setup the regular save area */
+//            Context->FloatSave.ControlWord = 0x27F;
+//            Context->FloatSave.StatusWord = 0;
+//            Context->FloatSave.TagWord = -1;
+//            Context->FloatSave.ErrorOffset = 0;
+//            Context->FloatSave.ErrorSelector = 0;
+//            Context->FloatSave.DataOffset =0;
+//            Context->FloatSave.DataSelector = 0;
+//        }
 
         /* Check if the CPU has NPX */
         if (KeI386NpxPresent)
         {
             /* Set an intial NPX State */
-            Context->FloatSave.Cr0NpxState = 0;
-            FxSaveArea->Cr0NpxState = 0;
-            FxSaveArea->NpxSavedCpu = 0;
+            //Context->FloatSave.Cr0NpxState = 0;
+            //FxSaveArea->Cr0NpxState = 0;
+            //FxSaveArea->NpxSavedCpu = 0;
 
             /* Now set the context flags depending on XMM support */
-            ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS :
-                                                  CONTEXT_FLOATING_POINT;
+            //ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS :
+            //                                      CONTEXT_FLOATING_POINT;
 
             /* Set the Thread's NPX State */
-            Thread->NpxState = NPX_STATE_NOT_LOADED;
+            Thread->NpxState = 0xA;
             Thread->DispatcherHeader.NpxIrql = PASSIVE_LEVEL;
         }
         else
         {
             /* We'll use emulation */
-            FxSaveArea->Cr0NpxState = CR0_EM;
-            Thread->NpxState = NPX_STATE_NOT_LOADED &~ CR0_MP;
+            //FxSaveArea->Cr0NpxState = CR0_EM;
+            Thread->NpxState = 0xA &~ CR0_MP;
         }
 
         /* Disable any debug regiseters */
@@ -148,19 +146,16 @@
                              UserMode);
 
         /* Set SS, DS, ES's RPL Mask properly */
-        TrapFrame->HardwareSegSs |= RPL_MASK;
+        TrapFrame->SegSs |= RPL_MASK;
         TrapFrame->SegDs |= RPL_MASK;
         TrapFrame->SegEs |= RPL_MASK;
         TrapFrame->Dr7 = 0;
 
-        /* Set the debug mark */
-        TrapFrame->DbgArgMark = 0xBADB0D00;
-
         /* Set the previous mode as user */
-        TrapFrame->PreviousPreviousMode = UserMode;
+        TrapFrame->PreviousMode = UserMode;
 
         /* Terminate the Exception Handler List */
-        TrapFrame->ExceptionList = EXCEPTION_CHAIN_END;
+        TrapFrame->ExceptionFrame = 0;
 
         /* Setup the Stack for KiThreadStartup and Context Switching */
         StartFrame = &InitFrame->StartFrame;
@@ -180,25 +175,26 @@
                                     sizeof(KKINIT_FRAME));
 
         /* Setup the Fx Area */
-        FxSaveArea = &InitFrame->FxSaveArea;
-        RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA));
+        //FxSaveArea = &InitFrame->FxSaveArea;
+        //RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA));
 
         /* Check if we have Fxsr support */
         if (KeI386FxsrPresent)
         {
-            /* Set the stub FX area */
-            FxSaveArea->U.FxArea.ControlWord = 0x27F;
-            FxSaveArea->U.FxArea.MXCsr = 0x1F80;
+              DPRINT1("FxsrPresent but did nothing\n");
+//            /* Set the stub FX area */
+//            FxSaveArea->U.FxArea.ControlWord = 0x27F;
+//            FxSaveArea->U.FxArea.MXCsr = 0x1F80;
+//        }
+//        else
+//        {
+//            /* Set the stub FN area */
+//            FxSaveArea->U.FnArea.ControlWord = 0x27F;
+//            FxSaveArea->U.FnArea.TagWord = -1;
         }
-        else
-        {
-            /* Set the stub FN area */
-            FxSaveArea->U.FnArea.ControlWord = 0x27F;
-            FxSaveArea->U.FnArea.TagWord = -1;
-        }
 
         /* No NPX State */
-        Thread->NpxState = NPX_STATE_NOT_LOADED;
+        Thread->NpxState = 0xA;
 
         /* Setup the Stack for KiThreadStartup and Context Switching */
         StartFrame = &InitFrame->StartFrame;
@@ -223,7 +219,7 @@
 
     /* Save back the new value of the kernel stack. */
     Thread->KernelStack = (PVOID)CtxSwitchFrame;
-#endif
+
 }
 
 /* EOF */




More information about the Ros-diffs mailing list