]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg X64 ResetVector: Move page tables from 512KB to 8MB
authorJordan Justen <jordan.l.justen@intel.com>
Tue, 21 Jan 2014 19:38:34 +0000 (19:38 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 21 Jan 2014 19:38:34 +0000 (19:38 +0000)
To help consolidate OVMF fixed memory uses, we declare this
range in MEMFD and thereby move it to 8MB.

We also now declare the table range in the FDF to set
PCDs. This allows us to ASSERT that CR3 is set as expected
in OVMF SEC.

OvmfPkgIa32.fdf and OvmfPkgIa32X64.fdf are updated simply
for consistency.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15146 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/OvmfPkg.dec
OvmfPkg/OvmfPkgIa32.fdf
OvmfPkg/OvmfPkgIa32X64.fdf
OvmfPkg/OvmfPkgX64.fdf
OvmfPkg/ResetVector/Bin/ResetVector.x64.raw
OvmfPkg/ResetVector/Ia32/PageTables64.asm
OvmfPkg/Sec/SecMain.c
OvmfPkg/Sec/SecMain.inf

index 9d7fedf4df48053988793c51bbbd3a23c21ee619..c362e5f1157cf4b6973a58c97e76754c5e40ce24 100644 (file)
@@ -78,6 +78,8 @@
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase|0x0|UINT32|0xd\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase|0x0|UINT32|0xe\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|0x0|UINT32|0x11\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize|0x0|UINT32|0x12\r
 \r
 [PcdsDynamic, PcdsDynamicEx]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2\r
index 1c5c74664dc67218549da8da5cbbfae3b16b0e7a..483ad85e64e07247e24430914421838392d5378f 100644 (file)
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000\r
 NumBlocks     = 0x80\r
 \r
+0x000000|0x006000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize\r
+\r
 0x020000|0x7E0000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 FV = MAINFV\r
index 25d36107c0dceff7d1d4b33d4b5e06988d885724..9a0008066f5807609985a3ee2e7b76d4f8663e49 100644 (file)
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000\r
 NumBlocks     = 0x80\r
 \r
+0x000000|0x006000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize\r
+\r
 0x020000|0x7E0000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 FV = MAINFV\r
index a97b2c26a799d1dfb3b315a6614ea813f0adf657..09a91c14766491d182631b9ffb26091b3d8a5814 100644 (file)
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000\r
 NumBlocks     = 0x80\r
 \r
+0x000000|0x006000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize\r
+\r
 0x020000|0x7E0000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 FV = MAINFV\r
index 237d08a293d01f2119fa0b6353605e9d470b14a9..a3fc97c93e4d8100f95812102eec682003cc54a9 100644 (file)
Binary files a/OvmfPkg/ResetVector/Bin/ResetVector.x64.raw and b/OvmfPkg/ResetVector/Bin/ResetVector.x64.raw differ
index 8280e8f140bf95d3dbe90e6febb05634b2604015..b5a4cf8d71871142bfb9e82a2551f25af62de4d0 100644 (file)
@@ -44,8 +44,10 @@ BITS    32
 SetCr3ForPageTables64:\r
 \r
     ;\r
-    ; For OVMF, build some initial page tables at 0x80000. This is just\r
-    ; after the early stack/temp RAM.\r
+    ; For OVMF, build some initial page tables at 0x800000-0x806000.\r
+    ;\r
+    ; This range should match with PcdOvmfSecPageTablesBase and\r
+    ; PcdOvmfSecPageTablesSize which are declared in the FDF files.\r
     ;\r
     ; At the end of PEI, the pages tables will be rebuilt into a\r
     ; more permanent location by DxeIpl.\r
@@ -54,21 +56,21 @@ SetCr3ForPageTables64:
     mov     ecx, 6 * 0x1000 / 4\r
     xor     eax, eax\r
 clearPageTablesMemoryLoop:\r
-    mov     dword[ecx * 4 + 0x80000 - 4], eax\r
+    mov     dword[ecx * 4 + 0x800000 - 4], eax\r
     loop    clearPageTablesMemoryLoop\r
 \r
     ;\r
     ; Top level Page Directory Pointers (1 * 512GB entry)\r
     ;\r
-    mov     dword[0x80000], 0x81000 + PAGE_PDP_ATTR\r
+    mov     dword[0x800000], 0x801000 + PAGE_PDP_ATTR\r
 \r
     ;\r
     ; Next level Page Directory Pointers (4 * 1GB entries => 4GB)\r
     ;\r
-    mov     dword[0x81000], 0x82000 + PAGE_PDP_ATTR\r
-    mov     dword[0x81008], 0x83000 + PAGE_PDP_ATTR\r
-    mov     dword[0x81010], 0x84000 + PAGE_PDP_ATTR\r
-    mov     dword[0x81018], 0x85000 + PAGE_PDP_ATTR\r
+    mov     dword[0x801000], 0x802000 + PAGE_PDP_ATTR\r
+    mov     dword[0x801008], 0x803000 + PAGE_PDP_ATTR\r
+    mov     dword[0x801010], 0x804000 + PAGE_PDP_ATTR\r
+    mov     dword[0x801018], 0x805000 + PAGE_PDP_ATTR\r
 \r
     ;\r
     ; Page Table Entries (2048 * 2MB entries => 4GB)\r
@@ -79,13 +81,13 @@ pageTableEntriesLoop:
     dec     eax\r
     shl     eax, 21\r
     add     eax, PAGE_2M_PDE_ATTR\r
-    mov     [ecx * 8 + 0x82000 - 8], eax\r
+    mov     [ecx * 8 + 0x802000 - 8], eax\r
     loop    pageTableEntriesLoop\r
 \r
     ;\r
     ; Set CR3 now that the paging structures are available\r
     ;\r
-    mov     eax, 0x80000\r
+    mov     eax, 0x800000\r
     mov     cr3, eax\r
 \r
     OneTimeCallRet SetCr3ForPageTables64\r
index e235b964a8009b40e827d197da489ea11145ad64..ece1c9b517e5bef07942bb3a74aba3de0b0b3336 100644 (file)
@@ -615,6 +615,14 @@ SecCoreStartupWithStack (
 \r
   AsmWriteIdtr (&IdtDescriptor);\r
 \r
+#if defined (MDE_CPU_X64)\r
+  //\r
+  // ASSERT that the Page Tables were set by the reset vector code to\r
+  // the address we expect.\r
+  //\r
+  ASSERT (AsmReadCr3 () == (UINTN) PcdGet32 (PcdOvmfSecPageTablesBase));\r
+#endif\r
+\r
   //\r
   // |-------------|       <-- TopOfCurrentStack\r
   // |   Stack     | 32k\r
index 91d0a4469ffe1c32f7139df36b60deb76bec9e43..68dfeaaa4b1c5cecc617c76f1e231799226fb944 100644 (file)
@@ -66,3 +66,4 @@
 [Pcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase\r