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 <[email protected]>
---
 OvmfPkg/OvmfPkg.dec                         |   2 ++
 OvmfPkg/OvmfPkgIa32.fdf                     |   3 +++
 OvmfPkg/OvmfPkgIa32X64.fdf                  |   3 +++
 OvmfPkg/OvmfPkgX64.fdf                      |   3 +++
 OvmfPkg/ResetVector/Bin/ResetVector.x64.raw | Bin 628 -> 628 bytes
 OvmfPkg/ResetVector/Ia32/PageTables64.asm   |  22 ++++++++++++----------
 OvmfPkg/Sec/SecMain.c                       |   8 ++++++++
 OvmfPkg/Sec/SecMain.inf                     |   1 +
 8 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index 9d7fedf..c362e5f 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -78,6 +78,8 @@
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase|0x0|UINT32|0xd
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase|0x0|UINT32|0xe
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|0x0|UINT32|0x11
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize|0x0|UINT32|0x12
 
 [PcdsDynamic, PcdsDynamicEx]
   gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2
diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf
index 1c5c746..483ad85 100644
--- a/OvmfPkg/OvmfPkgIa32.fdf
+++ b/OvmfPkg/OvmfPkgIa32.fdf
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000
 NumBlocks     = 0x80
 
+0x000000|0x006000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
+
 0x020000|0x7E0000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
 FV = MAINFV
diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
index 25d3610..9a00080 100644
--- a/OvmfPkg/OvmfPkgIa32X64.fdf
+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000
 NumBlocks     = 0x80
 
+0x000000|0x006000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
+
 0x020000|0x7E0000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
 FV = MAINFV
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
index a97b2c2..09a91c1 100644
--- a/OvmfPkg/OvmfPkgX64.fdf
+++ b/OvmfPkg/OvmfPkgX64.fdf
@@ -135,6 +135,9 @@ ErasePolarity = 1
 BlockSize     = 0x10000
 NumBlocks     = 0x80
 
+0x000000|0x006000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
+
 0x020000|0x7E0000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
 FV = MAINFV
diff --git a/OvmfPkg/ResetVector/Bin/ResetVector.x64.raw 
b/OvmfPkg/ResetVector/Bin/ResetVector.x64.raw
index 
237d08a293d01f2119fa0b6353605e9d470b14a9..a3fc97c93e4d8100f95812102eec682003cc54a9
 100644
GIT binary patch
delta 95
zcmeyu@`YtXC}VIv!=vxVSs54_7?cGX7=SDwsjL8Eae!C`AeI1#<p5$yfLH+y3_BS(
i7#KQFcpQ8n%KDfA$YeSDL%xCG(VHDWlP0fVJOcnl6&<7i

delta 95
zcmeyu@`YtXC}S`?!=vxVSs55O7?cG#7=SDwsjL8Eae!C`AeI1#<p5$yfLH+>3_F49
h89GmR9DE?k`j`R8WI6joo`d1hn;k%tCa+*T0{{sY7mNS^

diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm 
b/OvmfPkg/ResetVector/Ia32/PageTables64.asm
index 8280e8f..b5a4cf8 100644
--- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm
+++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm
@@ -44,8 +44,10 @@ BITS    32
 SetCr3ForPageTables64:
 
     ;
-    ; For OVMF, build some initial page tables at 0x80000. This is just
-    ; after the early stack/temp RAM.
+    ; For OVMF, build some initial page tables at 0x800000-0x806000.
+    ;
+    ; This range should match with PcdOvmfSecPageTablesBase and
+    ; PcdOvmfSecPageTablesSize which are declared in the FDF files.
     ;
     ; At the end of PEI, the pages tables will be rebuilt into a
     ; more permanent location by DxeIpl.
@@ -54,21 +56,21 @@ SetCr3ForPageTables64:
     mov     ecx, 6 * 0x1000 / 4
     xor     eax, eax
 clearPageTablesMemoryLoop:
-    mov     dword[ecx * 4 + 0x80000 - 4], eax
+    mov     dword[ecx * 4 + 0x800000 - 4], eax
     loop    clearPageTablesMemoryLoop
 
     ;
     ; Top level Page Directory Pointers (1 * 512GB entry)
     ;
-    mov     dword[0x80000], 0x81000 + PAGE_PDP_ATTR
+    mov     dword[0x800000], 0x801000 + PAGE_PDP_ATTR
 
     ;
     ; Next level Page Directory Pointers (4 * 1GB entries => 4GB)
     ;
-    mov     dword[0x81000], 0x82000 + PAGE_PDP_ATTR
-    mov     dword[0x81008], 0x83000 + PAGE_PDP_ATTR
-    mov     dword[0x81010], 0x84000 + PAGE_PDP_ATTR
-    mov     dword[0x81018], 0x85000 + PAGE_PDP_ATTR
+    mov     dword[0x801000], 0x802000 + PAGE_PDP_ATTR
+    mov     dword[0x801008], 0x803000 + PAGE_PDP_ATTR
+    mov     dword[0x801010], 0x804000 + PAGE_PDP_ATTR
+    mov     dword[0x801018], 0x805000 + PAGE_PDP_ATTR
 
     ;
     ; Page Table Entries (2048 * 2MB entries => 4GB)
@@ -79,13 +81,13 @@ pageTableEntriesLoop:
     dec     eax
     shl     eax, 21
     add     eax, PAGE_2M_PDE_ATTR
-    mov     [ecx * 8 + 0x82000 - 8], eax
+    mov     [ecx * 8 + 0x802000 - 8], eax
     loop    pageTableEntriesLoop
 
     ;
     ; Set CR3 now that the paging structures are available
     ;
-    mov     eax, 0x80000
+    mov     eax, 0x800000
     mov     cr3, eax
 
     OneTimeCallRet SetCr3ForPageTables64
diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c
index e235b96..ece1c9b 100644
--- a/OvmfPkg/Sec/SecMain.c
+++ b/OvmfPkg/Sec/SecMain.c
@@ -615,6 +615,14 @@ SecCoreStartupWithStack (
 
   AsmWriteIdtr (&IdtDescriptor);
 
+#if defined (MDE_CPU_X64)
+  //
+  // ASSERT that the Page Tables were set by the reset vector code to
+  // the address we expect.
+  //
+  ASSERT (AsmReadCr3 () == (UINTN) PcdGet32 (PcdOvmfSecPageTablesBase));
+#endif
+
   //
   // |-------------|       <-- TopOfCurrentStack
   // |   Stack     | 32k
diff --git a/OvmfPkg/Sec/SecMain.inf b/OvmfPkg/Sec/SecMain.inf
index 91d0a44..68dfeaa 100644
--- a/OvmfPkg/Sec/SecMain.inf
+++ b/OvmfPkg/Sec/SecMain.inf
@@ -66,3 +66,4 @@
 [Pcd]
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
-- 
1.8.5.2


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to