]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
Make DxeIpl "assembly-free" to avoid the undesired LongMode.obj code in image even...
[mirror_edk2.git] / EdkModulePkg / Core / DxeIplPeim / Ia32 / DxeLoadFunc.c
index 6b61086cf2d86397152f039f1f2de593b8a45f21..1bbd839e19c1930e42b4ee9fc7648efa347fa5d9 100644 (file)
@@ -20,6 +20,31 @@ Abstract:
 --*/\r
 \r
 #include "DxeIpl.h"\r
 --*/\r
 \r
 #include "DxeIpl.h"\r
+#include "VirtualMemory.h"\r
+\r
+//
+// Global Descriptor Table (GDT)
+//
+GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT gGdtEntries [] = {\r
+/* selector { Global Segment Descriptor                              } */  \r
+/* 0x00 */  {0,      0,  0,  0,    0,  0,  0,  0,    0,  0, 0,  0,  0}, //null descriptor \r
+/* 0x08 */  {0xffff, 0,  0,  0x2,  1,  0,  1,  0xf,  0,  0, 1,  1,  0}, //linear data segment descriptor\r
+/* 0x10 */  {0xffff, 0,  0,  0xf,  1,  0,  1,  0xf,  0,  0, 1,  1,  0}, //linear code segment descriptor\r
+/* 0x18 */  {0xffff, 0,  0,  0x3,  1,  0,  1,  0xf,  0,  0, 1,  1,  0}, //system data segment descriptor\r
+/* 0x20 */  {0xffff, 0,  0,  0xa,  1,  0,  1,  0xf,  0,  0, 1,  1,  0}, //system code segment descriptor\r
+/* 0x28 */  {0,      0,  0,  0,    0,  0,  0,  0,    0,  0, 0,  0,  0}, //spare segment descriptor\r
+/* 0x30 */  {0xffff, 0,  0,  0x2,  1,  0,  1,  0xf,  0,  0, 1,  1,  0}, //system data segment descriptor\r
+/* 0x38 */  {0xffff, 0,  0,  0xa,  1,  0,  1,  0xf,  0,  1, 0,  1,  0}, //system code segment descriptor\r
+/* 0x40 */  {0,      0,  0,  0,    0,  0,  0,  0,    0,  0, 0,  0,  0}, //spare segment descriptor\r
+};\r
+\r
+//\r
+// IA32 Gdt register\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST IA32_DESCRIPTOR gGdt = {\r
+  sizeof (gGdtEntries) - 1,\r
+  (UINTN) gGdtEntries\r
+  };\r
 \r
 VOID\r
 HandOffToDxeCore (\r
 \r
 VOID\r
 HandOffToDxeCore (\r
@@ -30,7 +55,7 @@ HandOffToDxeCore (
   EFI_STATUS                Status;\r
   EFI_PHYSICAL_ADDRESS      BaseOfStack;\r
   EFI_PHYSICAL_ADDRESS      TopOfStack;\r
   EFI_STATUS                Status;\r
   EFI_PHYSICAL_ADDRESS      BaseOfStack;\r
   EFI_PHYSICAL_ADDRESS      TopOfStack;\r
-  EFI_PHYSICAL_ADDRESS      PageTables;\r
+  UINTN                     PageTables;\r
 \r
   Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);\r
   ASSERT_EFI_ERROR (Status);\r
@@ -51,25 +76,27 @@ HandOffToDxeCore (
     //  X64 Calling Conventions requires that the stack must be aligned to 16 bytes\r
     //\r
     TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);\r
     //  X64 Calling Conventions requires that the stack must be aligned to 16 bytes\r
     //\r
     TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);\r
+\r
     //\r
     // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA\r
     // memory, it may be corrupted when copying FV to high-end memory \r
     //\r
     //\r
     // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA\r
     // memory, it may be corrupted when copying FV to high-end memory \r
     //\r
-    LoadGo64Gdt();\r
+    AsmWriteGdtr (&gGdt);\r
     //\r
     //\r
-    // Limit to 36 bits of addressing for debug. Should get it from CPU\r
-    //\r
-    PageTables = CreateIdentityMappingPageTables (36);\r
+    // Create page table and save PageMapLevel4 to CR3\r
     //\r
     //\r
+    PageTables = CreateIdentityMappingPageTables ();\r
+    AsmWriteCr3 (PageTables);\r
+     //\r
     // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.\r
     // Call x64 drivers passing in single argument, a pointer to the HOBs.\r
     // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.\r
     // Call x64 drivers passing in single argument, a pointer to the HOBs.\r
-    //\r
-    ActivateLongMode (\r
-      PageTables, \r
-      (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw), \r
-      TopOfStack,\r
-      0x00000000,\r
-      DxeCoreEntryPoint\r
+    // \r
+    AsmEnablePaging64 (\r
+      SYS_CODE64_SEL,\r
+      DxeCoreEntryPoint,\r
+      (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw),\r
+      0,\r
+      TopOfStack\r
       );\r
   } else {\r
     //\r
       );\r
   } else {\r
     //\r
@@ -87,3 +114,4 @@ HandOffToDxeCore (
       );\r
   } \r
 }\r
       );\r
   } \r
 }\r
+\r