OvmfPkg X64 ResetVector: Move page tables from 512KB to 8MB

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
This commit is contained in:
Jordan Justen 2014-01-21 19:38:34 +00:00 committed by jljusten
parent bb4aa855f3
commit b382ede386
8 changed files with 32 additions and 10 deletions

View File

@ -78,6 +78,8 @@
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase|0x0|UINT32|0xd gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase|0x0|UINT32|0xd
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase|0x0|UINT32|0xe gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase|0x0|UINT32|0xe
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress|0x0|UINT32|0xf
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|0x0|UINT32|0x11
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize|0x0|UINT32|0x12
[PcdsDynamic, PcdsDynamicEx] [PcdsDynamic, PcdsDynamicEx]
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2 gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2

View File

@ -135,6 +135,9 @@ ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x10000
NumBlocks = 0x80 NumBlocks = 0x80
0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -135,6 +135,9 @@ ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x10000
NumBlocks = 0x80 NumBlocks = 0x80
0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -135,6 +135,9 @@ ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x10000
NumBlocks = 0x80 NumBlocks = 0x80
0x000000|0x006000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
0x020000|0x7E0000 0x020000|0x7E0000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
FV = MAINFV FV = MAINFV

View File

@ -44,8 +44,10 @@ BITS 32
SetCr3ForPageTables64: SetCr3ForPageTables64:
; ;
; For OVMF, build some initial page tables at 0x80000. This is just ; For OVMF, build some initial page tables at 0x800000-0x806000.
; after the early stack/temp RAM. ;
; 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 ; At the end of PEI, the pages tables will be rebuilt into a
; more permanent location by DxeIpl. ; more permanent location by DxeIpl.
@ -54,21 +56,21 @@ SetCr3ForPageTables64:
mov ecx, 6 * 0x1000 / 4 mov ecx, 6 * 0x1000 / 4
xor eax, eax xor eax, eax
clearPageTablesMemoryLoop: clearPageTablesMemoryLoop:
mov dword[ecx * 4 + 0x80000 - 4], eax mov dword[ecx * 4 + 0x800000 - 4], eax
loop clearPageTablesMemoryLoop loop clearPageTablesMemoryLoop
; ;
; Top level Page Directory Pointers (1 * 512GB entry) ; 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) ; Next level Page Directory Pointers (4 * 1GB entries => 4GB)
; ;
mov dword[0x81000], 0x82000 + PAGE_PDP_ATTR mov dword[0x801000], 0x802000 + PAGE_PDP_ATTR
mov dword[0x81008], 0x83000 + PAGE_PDP_ATTR mov dword[0x801008], 0x803000 + PAGE_PDP_ATTR
mov dword[0x81010], 0x84000 + PAGE_PDP_ATTR mov dword[0x801010], 0x804000 + PAGE_PDP_ATTR
mov dword[0x81018], 0x85000 + PAGE_PDP_ATTR mov dword[0x801018], 0x805000 + PAGE_PDP_ATTR
; ;
; Page Table Entries (2048 * 2MB entries => 4GB) ; Page Table Entries (2048 * 2MB entries => 4GB)
@ -79,13 +81,13 @@ pageTableEntriesLoop:
dec eax dec eax
shl eax, 21 shl eax, 21
add eax, PAGE_2M_PDE_ATTR add eax, PAGE_2M_PDE_ATTR
mov [ecx * 8 + 0x82000 - 8], eax mov [ecx * 8 + 0x802000 - 8], eax
loop pageTableEntriesLoop loop pageTableEntriesLoop
; ;
; Set CR3 now that the paging structures are available ; Set CR3 now that the paging structures are available
; ;
mov eax, 0x80000 mov eax, 0x800000
mov cr3, eax mov cr3, eax
OneTimeCallRet SetCr3ForPageTables64 OneTimeCallRet SetCr3ForPageTables64

View File

@ -615,6 +615,14 @@ SecCoreStartupWithStack (
AsmWriteIdtr (&IdtDescriptor); 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 // |-------------| <-- TopOfCurrentStack
// | Stack | 32k // | Stack | 32k

View File

@ -66,3 +66,4 @@
[Pcd] [Pcd]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase