[FREELDR]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 12 Apr 2010 22:28:22 +0000 (22:28 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 12 Apr 2010 22:28:22 +0000 (22:28 +0000)
- Don't prefix amd64 symbol names with underscores
- Cleanup unused amd64 functions
- Fix amd64 GDT entries
- Fix amd64 APIC_BASE

svn path=/trunk/; revision=46856

reactos/boot/freeldr/freeldr/arch/amd64/arch.S
reactos/boot/freeldr/freeldr/arch/amd64/boot.S
reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S
reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S
reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S
reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S
reactos/boot/freeldr/freeldr/arch/amd64/int386.S
reactos/boot/freeldr/freeldr/arch/amd64/loader.c
reactos/boot/freeldr/freeldr/arch/amd64/mb.S
reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c

index 0f6c257..9def109 100644 (file)
@@ -21,22 +21,22 @@ RealEntryPoint:
        mov ss, ax
 
        /* checkPoint Charlie - where it all began... */
-       mov si, offset _CheckPoint0
+       mov si, offset CheckPoint0
        call writestr   
-       
+
        /* Setup a real mode stack */
        mov     sp, stack16
 
        /* Zero BootDrive and BootPartition */
        xor eax, eax
-       mov _BootDrive, eax
-       mov _BootPartition, eax
+       mov BootDrive, eax
+       mov BootPartition, eax
 
        /* Store the boot drive */
-       mov _BootDrive, dl
+       mov BootDrive, dl
 
        /* Store the boot partition */
-       mov _BootPartition, dh
+       mov BootPartition, dh
 
        /* Load the GDT */
        lgdt gdtptr
@@ -46,13 +46,13 @@ RealEntryPoint:
        call x86_16_EnableA20
 
        /* checkPoint Charlie - where it all began... */
-       mov si, offset _CheckPoint1
+       mov si, offset CheckPoint1
        call writestr   
        
        call x86_16_BuildPageTables
        
        /* checkPoint Charlie - where it all began... */
-       mov si, offset _CheckPoint2
+       mov si, offset CheckPoint2
        call writestr   
 
        /* Check if CPU supports CPUID */
@@ -89,26 +89,26 @@ RealEntryPoint:
        /* X64 Processor */
        
        /* checkPoint Charlie - where it all began... */
-       mov si, offset _CheckPoint3
+       mov si, offset CheckPoint3
        call writestr   
 
-       jmp _switch64
+       jmp switch64
        
 NO_X64_SUPPORT_DETECTED:
-       mov  si, offset _NotAnX64Processor      // Loading message
+       mov  si, offset NotAnX64Processor       // Loading message
        call writestr
-       jmp _fail
+       jmp fail
 
 NO_CPUID_SUPPORT_DETECTED:
-       mov  si, offset _NoCPUIDSupport // Loading message
-       call writestr
+       mov  si, offset NoCPUIDSupport  // Loading message
+       call writestr
 
-_fail:
-       jmp _fail
+fail:
+       jmp fail
        nop
        nop
 
-_switch64:
+switch64:
        call x86_16_SwitchToLong
 
        .code64
@@ -119,7 +119,7 @@ _switch64:
 
        /* GO! */
        xor rcx, rcx
-       call _BootMain
+       call BootMain
 
        /* Checkpoint */
 //     mov ax, LMODE_DS
@@ -174,14 +174,14 @@ x86_16_BuildPageTables:
        push es
 
        /* Get segment of pml4 */
-       mov eax, offset _pml4_startup
+       mov eax, offset pml4_startup
        shr eax, 4
        mov es, ax
        cld
        xor di, di
 
        /* One entry in the PML4 pointing to PDP */
-       mov eax, offset _pdp_startup
+       mov eax, offset pdp_startup
        or eax, 0x00f
        stosd
        /* clear rest */
@@ -190,7 +190,7 @@ x86_16_BuildPageTables:
        rep stosd
 
        /* One entry in the PDP pointing to PD */
-       mov eax, offset _pd_startup
+       mov eax, offset pd_startup
        or eax, 0x00f
        stosd
        /* clear rest */
@@ -268,7 +268,7 @@ x86_16_SwitchToLong:
        mov eax, 0x00a0                 // Set PAE and PGE: 10100000b
        mov cr4, eax
 
-       mov edx, offset _pml4_startup // Point cr3 at PML4
+       mov edx, offset pml4_startup // Point cr3 at PML4
        mov cr3, edx
 
        mov ecx, 0xC0000080             // Specify EFER MSR
@@ -405,42 +405,42 @@ gdtptr:
        .long   gdt                     /* Base Address */
 
 
-.global _BootDrive
-_BootDrive:
+.global BootDrive
+BootDrive:
     .long 0
     
-.global _BootPartition
-_BootPartition:
+.global BootPartition
+BootPartition:
     .long 0
 
-.global _NotAnX64Processor
-_NotAnX64Processor:
+.global NotAnX64Processor
+NotAnX64Processor:
        .ascii "FreeLoader: No x64-compatible CPU detected! Exiting..."
        .byte 0x0d, 0x0a, 0
 
-.global _NoCPUIDSupport
-_NoCPUIDSupport:
+.global NoCPUIDSupport
+NoCPUIDSupport:
        .ascii "FreeLoader: No CPUID instruction support detected! Exiting..."
        .byte 0x0d, 0x0a, 0
 
 /////////////////////////// Checkpoint messages ///////////////////////////////
-.global _CheckPoint0
-_CheckPoint0:
+.global CheckPoint0
+CheckPoint0:
        .ascii "Starting FreeLoader..."
        .byte 0x0d, 0x0a, 0
        
-.global _CheckPoint1
-_CheckPoint1:
+.global CheckPoint1
+CheckPoint1:
        .ascii "FreeLoader[16-bit]: building page tables..."
        .byte 0x0d, 0x0a, 0
        
-.global _CheckPoint2
-_CheckPoint2:
+.global CheckPoint2
+CheckPoint2:
        .ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..."
        .byte 0x0d, 0x0a, 0
 
-.global _CheckPoint3
-_CheckPoint3:
+.global CheckPoint3
+CheckPoint3:
        .ascii "FreeLoader: Switching to x64 long mode..."
        .byte 0x0d, 0x0a, 0
 
index ce7bb35..eb3ba3c 100644 (file)
 #include <arch.h>
 
 
-EXTERN(_ChainLoadBiosBootSectorCode)
+EXTERN(ChainLoadBiosBootSectorCode)
        .code64
 
        call x86_64_SwitchToReal
        .code16
 
        /* Set the boot drive */
-       mov dl, _BootDrive
+       mov dl, BootDrive
 
        /* Load segment registers */
        cli
@@ -46,7 +46,7 @@ EXTERN(_ChainLoadBiosBootSectorCode)
 //     ljmpl   $0x0000,$0x7C00
        jmp 0x7c00:0x0000
 
-EXTERN(_SoftReboot)
+EXTERN(SoftReboot)
        .code64
 
        call    x86_64_SwitchToReal
index d6b081c..6871fe0 100644 (file)
@@ -24,7 +24,7 @@
 #include <arch.h>
 
 
-EXTERN(_DriveMapInt13HandlerStart)
+EXTERN(DriveMapInt13HandlerStart)
 Int13Handler:
 
        pushw   %bp
@@ -82,7 +82,7 @@ CallOldInt13Handler:
 
        /* Call old int 13h handler with new drive number */
        .byte   0x9a /* lcall */
-EXTERN(_DriveMapOldInt13HandlerAddress)
+EXTERN(DriveMapOldInt13HandlerAddress)
        .word   0
        .word   0
 
@@ -105,7 +105,7 @@ CallersFlags:
 PassedInDriveNumber:
        .byte   0
 
-EXTERN(_DriveMapInt13HandlerMapList)
+EXTERN(DriveMapInt13HandlerMapList)
 Int13HandlerMapCount:
        .byte   0
 
@@ -129,4 +129,4 @@ Int13HandlerDrive4:
 Int13HandlerDriveNew4:
        .byte   0
 
-EXTERN(_DriveMapInt13HandlerEnd)
+EXTERN(DriveMapInt13HandlerEnd)
index 6dfb91d..ee3ee6f 100644 (file)
@@ -33,7 +33,7 @@
  *    0x00000400: Found 80486 CPU without CPUID support
  */
 
-EXTERN(_CpuidSupported)
+EXTERN(CpuidSupported)
        .code32
 
        pushl   %ecx                    /* save ECX */
@@ -80,7 +80,7 @@ NoCpuid:
  * VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);
  */
 
-EXTERN(_GetCpuid)
+EXTERN(GetCpuid)
        .code32
 
        pushl   %ebp
@@ -123,7 +123,7 @@ EXTERN(_GetCpuid)
  * U64 RDTSC(VOID);
  */
 
-EXTERN(_RDTSC)
+EXTERN(RDTSC)
        .code32
        rdtsc
        ret
index ff0ae71..1958927 100644 (file)
@@ -35,7 +35,7 @@ _pnp_bios_entry_point:
 _pnp_bios_data_segment:
        .word   0
 
-EXTERN(_PnpBiosSupported)
+EXTERN(PnpBiosSupported)
        .code64
 
        push rdi
@@ -113,7 +113,7 @@ _pnp_node_size:
 _pnp_node_count:
        .word   0
 
-EXTERN(_PnpBiosGetDeviceNodeCount)
+EXTERN(PnpBiosGetDeviceNodeCount)
        .code64
 
        push rbp
@@ -182,7 +182,7 @@ _pnp_buffer_offset:
 _pnp_node_number:
        .byte   0
 
-EXTERN(_PnpBiosGetDeviceNode)
+EXTERN(PnpBiosGetDeviceNode)
        .code64
 
        push rbp
index 833fcc3..195bf09 100644 (file)
@@ -273,7 +273,7 @@ i386CommonExceptionHandler:
        SAVE_CPU_REGS
 
        pushl   $SCREEN_ATTR
-       call    _MachVideoClearScreen
+       call    MachVideoClearScreen
        add     $4,%esp
 
        movl    $i386ExceptionHandlerText,%esi
@@ -485,7 +485,7 @@ i386PrintChar:
        pushl   $SCREEN_ATTR
        andl    $0xff,%eax
        pushl   %eax
-       call    _MachVideoPutChar
+       call    MachVideoPutChar
        addl    $16,%esp
 
        ret
index 1c1f2db..a22e409 100644 (file)
@@ -63,7 +63,7 @@ Int386_regsout:
 /*
  * int Int386(int ivec, REGS* in, REGS* out);
  */
-EXTERN(_Int386)
+EXTERN(Int386)
        .code64
 
        /* Get the function parameters */
index 9ca6f85..cad77bf 100644 (file)
@@ -39,33 +39,6 @@ EnableA20()
     /* Already done */
 }
 
-void
-DumpLoaderBlock()
-{
-       DbgPrint("LoaderBlock @ %p.\n", &LoaderBlock);
-       DbgPrint("Flags = 0x%x.\n", LoaderBlock.Flags);
-       DbgPrint("MemLower = 0x%p.\n", (PVOID)LoaderBlock.MemLower);
-       DbgPrint("MemHigher = 0x%p.\n", (PVOID)LoaderBlock.MemHigher);
-       DbgPrint("BootDevice = 0x%x.\n", LoaderBlock.BootDevice);
-       DbgPrint("CommandLine = %s.\n", LoaderBlock.CommandLine);
-       DbgPrint("ModsCount = 0x%x.\n", LoaderBlock.ModsCount);
-       DbgPrint("ModsAddr = 0x%p.\n", LoaderBlock.ModsAddr);
-       DbgPrint("Syms = 0x%s.\n", LoaderBlock.Syms);
-       DbgPrint("MmapLength = 0x%x.\n", LoaderBlock.MmapLength);
-       DbgPrint("MmapAddr = 0x%p.\n", (PVOID)LoaderBlock.MmapAddr);
-       DbgPrint("RdLength = 0x%x.\n", LoaderBlock.RdLength);
-       DbgPrint("RdAddr = 0x%p.\n", (PVOID)LoaderBlock.RdAddr);
-       DbgPrint("DrivesCount = 0x%x.\n", LoaderBlock.DrivesCount);
-       DbgPrint("DrivesAddr = 0x%p.\n", (PVOID)LoaderBlock.DrivesAddr);
-       DbgPrint("ConfigTable = 0x%x.\n", LoaderBlock.ConfigTable);
-       DbgPrint("BootLoaderName = 0x%x.\n", LoaderBlock.BootLoaderName);
-       DbgPrint("PageDirectoryStart = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryStart);
-       DbgPrint("PageDirectoryEnd = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryEnd);
-       DbgPrint("KernelBase = 0x%p.\n", (PVOID)LoaderBlock.KernelBase);
-       DbgPrint("ArchExtra = 0x%p.\n", (PVOID)LoaderBlock.ArchExtra);
-
-}
-
 /*++
  * FrLdrStartup
  * INTERNAL
@@ -86,222 +59,7 @@ VOID
 NTAPI
 FrLdrStartup(ULONG Magic)
 {
-       /* Disable Interrupts */
-       _disable();
-
-       /* Re-initalize EFLAGS */
-       __writeeflags(0);
-
-       /* Initialize the page directory */
-       FrLdrSetupPageDirectory();
-
-       /* Set the new PML4 */
-       __writecr3((ULONGLONG)pPML4);
-
-       FrLdrSetupGdtIdt();
-
-       LoaderBlock.FrLdrDbgPrint = DbgPrint;
-
-//     DumpLoaderBlock();
-
-       DbgPrint("Jumping to kernel @ %p.\n", KernelEntryPoint);
-
-       /* Jump to Kernel */
-       (*KernelEntryPoint)(Magic, &LoaderBlock);
-
-}
-
-PPAGE_DIRECTORY_AMD64
-FrLdrGetOrCreatePageDir(PPAGE_DIRECTORY_AMD64 pDir, ULONG Index)
-{
-       PPAGE_DIRECTORY_AMD64 pSubDir;
-
-       if (!pDir)
-               return NULL;
-
-       if (!pDir->Pde[Index].Valid)
-       {
-               pSubDir = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
-               if (!pSubDir)
-                       return NULL;
-               RtlZeroMemory(pSubDir, PAGE_SIZE);
-               pDir->Pde[Index].PageFrameNumber = PtrToPfn(pSubDir);
-               pDir->Pde[Index].Valid = 1;
-               pDir->Pde[Index].Write = 1;
-       }
-       else
-       {
-               pSubDir = (PPAGE_DIRECTORY_AMD64)((ULONGLONG)(pDir->Pde[Index].PageFrameNumber) * PAGE_SIZE);
-       }
-       return pSubDir;
-}
-
-BOOLEAN
-FrLdrMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress)
-{
-       PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1;
-       ULONG Index;
-
-       pDir3 = FrLdrGetOrCreatePageDir(pPML4, VAtoPXI(VirtualAddress));
-       pDir2 = FrLdrGetOrCreatePageDir(pDir3, VAtoPPI(VirtualAddress));
-       pDir1 = FrLdrGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress));
-
-       if (!pDir1)
-               return FALSE;
-
-       Index = VAtoPTI(VirtualAddress);
-       if (pDir1->Pde[Index].Valid)
-       {
-               return FALSE;
-       }
-
-       pDir1->Pde[Index].Valid = 1;
-       pDir1->Pde[Index].Write = 1;
-       pDir1->Pde[Index].PageFrameNumber = PhysicalAddress / PAGE_SIZE;
-
-       return TRUE;
-}
-
-ULONG
-FrLdrMapRangeOfPages(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress, ULONG cPages)
-{
-       ULONG i;
-
-       for (i = 0; i < cPages; i++)
-       {
-               if (!FrLdrMapSinglePage(VirtualAddress, PhysicalAddress))
-               {
-                       return i;
-               }
-               VirtualAddress += PAGE_SIZE;
-               PhysicalAddress += PAGE_SIZE;
-       }
-       return i;
+       DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint);
+    for(;;);
 }
 
-
-/*++
- * FrLdrSetupPageDirectory
- * INTERNAL
- *
- *     Sets up the ReactOS Startup Page Directory.
- *
- * Params:
- *     None.
- *
- * Returns:
- *     None.
- *--*/
-VOID
-FASTCALL
-FrLdrSetupPageDirectory(VOID)
-{
-       ULONG KernelPages;
-       PVOID UserSharedData;
-
-       /* Allocate a Page for the PML4 */
-       pPML4 = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
-
-       ASSERT(pPML4);
-
-       /* The page tables are located at 0xfffff68000000000 
-        * We create a recursive self mapping through all 4 levels at 
-        * virtual address 0xfffff6fb7dbedf68 */
-       pPML4->Pde[VAtoPXI(PXE_BASE)].Valid = 1;
-       pPML4->Pde[VAtoPXI(PXE_BASE)].Write = 1;
-       pPML4->Pde[VAtoPXI(PXE_BASE)].PageFrameNumber = PtrToPfn(pPML4);
-
-       /* Setup low memory pages */
-       if (FrLdrMapRangeOfPages(0, 0, 1024) < 1024)
-       {
-               DbgPrint("Could not map low memory pages.\n");
-       }
-
-       /* Setup kernel pages */
-       KernelPages = (ROUND_TO_PAGES(NextModuleBase - KERNEL_BASE_PHYS) / PAGE_SIZE);
-       if (FrLdrMapRangeOfPages(KernelBase, KERNEL_BASE_PHYS, KernelPages) != KernelPages)
-       {
-               DbgPrint("Could not map %d kernel pages.\n", KernelPages);
-       }
-
-       /* Setup a page for the idt */
-       pIdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
-       IdtBase = KernelBase + KernelPages * PAGE_SIZE;
-       if (!FrLdrMapSinglePage(IdtBase, (ULONGLONG)pIdt))
-       {
-               DbgPrint("Could not map idt page.\n", KernelPages);
-       }
-
-       /* Setup a page for the gdt & tss */
-       pGdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
-       GdtBase = IdtBase + PAGE_SIZE;
-       TssBase = GdtBase + 20 * sizeof(ULONG64); // FIXME: don't hardcode
-       if (!FrLdrMapSinglePage(GdtBase, (ULONGLONG)pGdt))
-       {
-               DbgPrint("Could not map gdt page.\n", KernelPages);
-       }
-
-       /* Setup KUSER_SHARED_DATA page */
-       UserSharedData = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory);
-       if (!FrLdrMapSinglePage(KI_USER_SHARED_DATA, (ULONG64)UserSharedData))
-       {
-               DbgPrint("Could not map KUSER_SHARED_DATA page.\n", KernelPages);
-       }
-
-       /* Map APIC page */
-       if (!FrLdrMapSinglePage(APIC_BASE, APIC_PHYS_BASE))
-       {
-               DbgPrint("Could not map APIC page.\n");
-       }
-
-}
-
-VOID
-FrLdrSetupGdtIdt()
-{
-       PKGDTENTRY64 Entry;
-       KDESCRIPTOR Desc;
-
-       RtlZeroMemory(pGdt, PAGE_SIZE);
-
-       /* Setup KGDT_64_R0_CODE */
-       Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_CODE);
-       *(PULONG64)Entry = 0x00209b0000000000ULL;
-
-       /* Setup KGDT_64_R0_SS */
-       Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_SS);
-       *(PULONG64)Entry = 0x00cf93000000ffffULL;
-
-       /* Setup KGDT_64_DATA */
-       Entry = KiGetGdtEntry(pGdt, KGDT_64_DATA);
-       *(PULONG64)Entry = 0x00cff3000000ffffULL;
-
-       /* Setup KGDT_64_R3_CODE */
-       Entry = KiGetGdtEntry(pGdt, KGDT_64_R3_CODE);
-       *(PULONG64)Entry = 0x0020fb0000000000ULL;
-
-       /* Setup KGDT_32_R3_TEB */
-       Entry = KiGetGdtEntry(pGdt, KGDT_32_R3_TEB);
-       *(PULONG64)Entry = 0xff40f3fd50003c00ULL;
-
-       /* Setup TSS entry */
-       Entry = KiGetGdtEntry(pGdt, KGDT_TSS);
-       KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
-
-       /* Setup the gdt descriptor */
-       Desc.Limit = 12 * sizeof(ULONG64) - 1;
-       Desc.Base = (PVOID)GdtBase;
-
-       /* Set the new Gdt */
-       __lgdt(&Desc.Limit);
-       DbgPrint("Gdtr.Base = %p\n", Desc.Base);
-
-       /* Setup the idt descriptor */
-       Desc.Limit = 12 * sizeof(ULONG64) - 1;
-       Desc.Base = (PVOID)IdtBase;
-
-       /* Set the new Idt */
-       __lidt(&Desc.Limit);
-       DbgPrint("Idtr.Base = %p\n", Desc.Base);
-
-}
index 368338e..2d515e9 100644 (file)
         * This boots the kernel
         */
        .code64
-    .globl _PageDirectoryStart
+    .globl PageDirectoryStart
     
-    .globl _pml4_startup
-    .globl _pdp_startup
-    .globl _pd_startup
+    .globl pml4_startup
+    .globl pdp_startup
+    .globl pd_startup
 
-    .globl _PageDirectoryEnd
+    .globl PageDirectoryEnd
 
        //
        // Boot information structure
        //
 
-EXTERN(_reactos_memory_map_descriptor_size)
+EXTERN(reactos_memory_map_descriptor_size)
        .long   0
 
-EXTERN(_reactos_memory_map)
+EXTERN(reactos_memory_map)
        .rept   (32 * /*sizeof(memory_map_t)*/24)
        .byte   0
        .endr
 
 .bss
-_PageDirectoryStart:
-_pml4_startup:
+PageDirectoryStart:
+pml4_startup:
        .fill 4096, 1, 0
 
-_pdp_startup:
+pdp_startup:
        .fill 4096, 1, 0
 
-_pd_startup:
+pd_startup:
        .fill 4096, 1, 0
 
-_PageDirectoryEnd:
+PageDirectoryEnd:
index af46178..9068e00 100644 (file)
@@ -45,7 +45,7 @@
 
 #define HYPERSPACE_BASE             0xfffff70000000000ULL
 #define HAL_BASE                    0xffffffff80000000ULL
-#define APIC_BASE                   0xfffffffffee00000ULL // FIXME
+#define APIC_BASE                   0xFFFFFFFFFFFE0000ULL
 
 #define APIC_PHYS_BASE              0xfee00000
 
index 3e3288a..5f979c4 100644 (file)
@@ -252,28 +252,36 @@ WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase)
        PKGDTENTRY64 Entry;
        KDESCRIPTOR GdtDesc;
 
-       /* Setup KGDT_64_R0_CODE */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE);
+       /* Setup KGDT64_NULL */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL);
+       *(PULONG64)Entry = 0x0000000000000000ULL;
+
+       /* Setup KGDT64_R0_CODE */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_CODE);
        *(PULONG64)Entry = 0x00209b0000000000ULL;
 
-       /* Setup KGDT_64_R0_SS */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS);
+       /* Setup KGDT64_R0_DATA */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_DATA);
        *(PULONG64)Entry = 0x00cf93000000ffffULL;
 
-       /* Setup KGDT_64_DATA */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA);
+       /* Setup KGDT64_R3_CMCODE */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMCODE);
+       *(PULONG64)Entry = 0x00cffb000000ffffULL;
+
+       /* Setup KGDT64_R3_DATA */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_DATA);
        *(PULONG64)Entry = 0x00cff3000000ffffULL;
 
-       /* Setup KGDT_64_R3_CODE */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE);
+       /* Setup KGDT64_R3_CODE */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CODE);
        *(PULONG64)Entry = 0x0020fb0000000000ULL;
 
-       /* Setup KGDT_32_R3_TEB */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB);
+       /* Setup KGDT64_R3_CMTEB */
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMTEB);
        *(PULONG64)Entry = 0xff40f3fd50003c00ULL;
 
        /* Setup TSS entry */
-       Entry = KiGetGdtEntry(GdtBase, KGDT_TSS);
+       Entry = KiGetGdtEntry(GdtBase, KGDT64_SYS_TSS);
        KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0);
 
     /* Setup GDT descriptor */
@@ -333,15 +341,8 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss)
     /* LDT is unused */
 //    __lldt(0);
 
-    /* Load selectors for DS/ES/FS/GS/SS */
-    Ke386SetDs(KGDT_64_DATA | RPL_MASK);   // 0x2b
-    Ke386SetEs(KGDT_64_DATA | RPL_MASK);   // 0x2b
-    Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK); // 0x53
-       Ke386SetGs(KGDT_64_DATA | RPL_MASK);   // 0x2b
-       Ke386SetSs(KGDT_64_R0_SS);             // 0x18
-
        /* Load TSR */
-       __ltr(KGDT_TSS);
+       __ltr(KGDT64_SYS_TSS);
 
     DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
 }