@@ -481,14 +481,14 @@ Split1GPageTo2M (
481
481
482
482
@param[in] PageTableBase Base address of page table (CR3).
483
483
@param[in] Address Start address of a page to be set as read-only.
484
- @param[in] Level4Paging Level 4 paging flag .
484
+ @param[in] LevelOfPaging Level of paging.
485
485
486
486
**/
487
487
VOID
488
488
SetPageTablePoolReadOnly (
489
489
IN UINTN PageTableBase ,
490
490
IN EFI_PHYSICAL_ADDRESS Address ,
491
- IN BOOLEAN Level4Paging
491
+ IN UINT8 LevelOfPaging
492
492
)
493
493
{
494
494
UINTN Index ;
@@ -498,9 +498,9 @@ SetPageTablePoolReadOnly (
498
498
UINT64 * PageTable ;
499
499
UINT64 * NewPageTable ;
500
500
UINT64 PageAttr ;
501
- UINT64 LevelSize [5 ];
502
- UINT64 LevelMask [5 ];
503
- UINTN LevelShift [5 ];
501
+ UINT64 LevelSize [6 ];
502
+ UINT64 LevelMask [6 ];
503
+ UINTN LevelShift [6 ];
504
504
UINTN Level ;
505
505
UINT64 PoolUnitSize ;
506
506
@@ -517,23 +517,26 @@ SetPageTablePoolReadOnly (
517
517
LevelShift [2 ] = PAGING_L2_ADDRESS_SHIFT ;
518
518
LevelShift [3 ] = PAGING_L3_ADDRESS_SHIFT ;
519
519
LevelShift [4 ] = PAGING_L4_ADDRESS_SHIFT ;
520
+ LevelShift [5 ] = PAGING_L5_ADDRESS_SHIFT ;
520
521
521
522
LevelMask [1 ] = PAGING_4K_ADDRESS_MASK_64 ;
522
523
LevelMask [2 ] = PAGING_2M_ADDRESS_MASK_64 ;
523
524
LevelMask [3 ] = PAGING_1G_ADDRESS_MASK_64 ;
524
- LevelMask [4 ] = PAGING_1G_ADDRESS_MASK_64 ;
525
+ LevelMask [4 ] = PAGING_512G_ADDRESS_MASK_64 ;
526
+ LevelMask [5 ] = PAGING_256T_ADDRESS_MASK_64 ;
525
527
526
528
LevelSize [1 ] = SIZE_4KB ;
527
529
LevelSize [2 ] = SIZE_2MB ;
528
530
LevelSize [3 ] = SIZE_1GB ;
529
531
LevelSize [4 ] = SIZE_512GB ;
532
+ LevelSize [5 ] = SIZE_256TB ;
530
533
531
534
AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask ) &
532
535
PAGING_1G_ADDRESS_MASK_64 ;
533
536
PageTable = (UINT64 * )(UINTN )PageTableBase ;
534
537
PoolUnitSize = PAGE_TABLE_POOL_UNIT_SIZE ;
535
538
536
- for (Level = ( Level4Paging ) ? 4 : 3 ; Level > 0 ; -- Level ) {
539
+ for (Level = LevelOfPaging ; Level > 0 ; -- Level ) {
537
540
Index = ((UINTN )RShiftU64 (Address , LevelShift [Level ]));
538
541
Index &= PAGING_PAE_INDEX_MASK ;
539
542
@@ -603,13 +606,13 @@ SetPageTablePoolReadOnly (
603
606
Prevent the memory pages used for page table from been overwritten.
604
607
605
608
@param[in] PageTableBase Base address of page table (CR3).
606
- @param[in] Level4Paging Level 4 paging flag .
609
+ @param[in] LevelOfPaging Level of paging.
607
610
608
611
**/
609
612
VOID
610
613
EnablePageTableProtection (
611
- IN UINTN PageTableBase ,
612
- IN BOOLEAN Level4Paging
614
+ IN UINTN PageTableBase ,
615
+ IN UINT8 LevelOfPaging
613
616
)
614
617
{
615
618
PAGE_TABLE_POOL * HeadPool ;
@@ -638,7 +641,7 @@ EnablePageTableProtection (
638
641
// protection to them one by one.
639
642
//
640
643
while (PoolSize > 0 ) {
641
- SetPageTablePoolReadOnly (PageTableBase , Address , Level4Paging );
644
+ SetPageTablePoolReadOnly (PageTableBase , Address , LevelOfPaging );
642
645
Address += PAGE_TABLE_POOL_UNIT_SIZE ;
643
646
PoolSize -= PAGE_TABLE_POOL_UNIT_SIZE ;
644
647
}
@@ -691,7 +694,7 @@ CreateIdentityMappingPageTables (
691
694
UINTN TotalPagesNum ;
692
695
UINTN BigPageAddress ;
693
696
VOID * Hob ;
694
- BOOLEAN Enable5LevelPaging ;
697
+ UINT8 LevelOfPaging ;
695
698
BOOLEAN Page1GSupport ;
696
699
PAGE_TABLE_1G_ENTRY * PageDirectory1GEntry ;
697
700
UINT64 AddressEncMask ;
@@ -740,18 +743,18 @@ CreateIdentityMappingPageTables (
740
743
// below logic inherits the 5-level paging setting from bootloader in IA-32e mode
741
744
// and uses 4-level paging in legacy protected mode.
742
745
//
743
- Cr4 .UintN = AsmReadCr4 ();
744
- Enable5LevelPaging = (BOOLEAN )( Cr4 .Bits .LA57 == 1 );
746
+ Cr4 .UintN = AsmReadCr4 ();
747
+ LevelOfPaging = (Cr4 .Bits .LA57 == 1 ) ? 5 : 4 ;
745
748
746
- DEBUG ((DEBUG_INFO , "PayloadEntry: AddressBits=%u 5LevelPaging =%u 1GPage=%u\n" , PhysicalAddressBits , Enable5LevelPaging , Page1GSupport ));
749
+ DEBUG ((DEBUG_INFO , "PayloadEntry: AddressBits=%u LevelOfPaging =%u 1GPage=%u\n" , PhysicalAddressBits , LevelOfPaging , Page1GSupport ));
747
750
748
751
//
749
752
// IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses
750
753
// when 5-Level Paging is disabled,
751
754
// due to either unsupported by HW, or disabled by PCD.
752
755
//
753
756
ASSERT (PhysicalAddressBits <= 52 );
754
- if (! Enable5LevelPaging && (PhysicalAddressBits > 48 )) {
757
+ if (( LevelOfPaging != 5 ) && (PhysicalAddressBits > 48 )) {
755
758
PhysicalAddressBits = 48 ;
756
759
}
757
760
@@ -786,7 +789,7 @@ CreateIdentityMappingPageTables (
786
789
//
787
790
// Substract the one page occupied by PML5 entries if 5-Level Paging is disabled.
788
791
//
789
- if (! Enable5LevelPaging ) {
792
+ if (LevelOfPaging != 5 ) {
790
793
TotalPagesNum -- ;
791
794
}
792
795
@@ -806,7 +809,7 @@ CreateIdentityMappingPageTables (
806
809
// By architecture only one PageMapLevel4 exists - so lets allocate storage for it.
807
810
//
808
811
PageMap = (VOID * )BigPageAddress ;
809
- if (Enable5LevelPaging ) {
812
+ if (LevelOfPaging == 5 ) {
810
813
//
811
814
// By architecture only one PageMapLevel5 exists - so lets allocate storage for it.
812
815
//
@@ -828,7 +831,7 @@ CreateIdentityMappingPageTables (
828
831
PageMapLevel4Entry = (VOID * )BigPageAddress ;
829
832
BigPageAddress += SIZE_4KB ;
830
833
831
- if (Enable5LevelPaging ) {
834
+ if (LevelOfPaging == 5 ) {
832
835
//
833
836
// Make a PML5 Entry
834
837
//
@@ -922,7 +925,7 @@ CreateIdentityMappingPageTables (
922
925
ZeroMem (PageMapLevel4Entry , (512 - IndexOfPml4Entries ) * sizeof (PAGE_MAP_AND_DIRECTORY_POINTER ));
923
926
}
924
927
925
- if (Enable5LevelPaging ) {
928
+ if (LevelOfPaging == 5 ) {
926
929
//
927
930
// For the PML5 entries we are not using fill in a null entry.
928
931
//
@@ -933,7 +936,7 @@ CreateIdentityMappingPageTables (
933
936
// Protect the page table by marking the memory used for page table to be
934
937
// read-only.
935
938
//
936
- EnablePageTableProtection ((UINTN )PageMap , TRUE );
939
+ EnablePageTableProtection ((UINTN )PageMap , LevelOfPaging );
937
940
938
941
//
939
942
// Set IA32_EFER.NXE if necessary.
0 commit comments