[FREELDR]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 19 Oct 2009 16:19:29 +0000 (16:19 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 19 Oct 2009 16:19:29 +0000 (16:19 +0000)
- include the intrinsics from the kernel
- set segement selectors

svn path=/branches/ros-amd64-bringup/; revision=43605

reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
reactos/boot/freeldr/freeldr/include/freeldr.h
reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c

index 12d9269..869a0db 100644 (file)
@@ -58,13 +58,6 @@ typedef struct _PAGE_DIRECTORY_AMD64
     HARDWARE_PTE Pde[512];
 } PAGE_DIRECTORY_AMD64, *PPAGE_DIRECTORY_AMD64;
 
-VOID
-FORCEINLINE
-__lgdt(void *gdt)
-{
-    asm volatile ("lgdt %0\n" : : "m"(*(short*)gdt));
-}
-
 PKGDTENTRY64
 FORCEINLINE
 KiGetGdtEntry(PVOID pGdt, USHORT Index)
index d04872d..1eab3ba 100644 (file)
@@ -86,6 +86,7 @@
 #elif defined(_M_AMD64)
 #include <arch/amd64/hardware.h>
 #include <arch/amd64/machpc.h>
+#include <internal/amd64/intrin_i.h>
 #endif
 /* misc files */
 #include <keycodes.h>
index cfb6d44..4546ffe 100644 (file)
@@ -341,8 +341,20 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss)
 
     WinLdrSetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK!
 
-    DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
+    /* 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
+       Ke386SetTr(KGDT_TSS);
+
+    DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n");
 }
 
 VOID