28#define IA32_PG_RW BIT1
30#define IA32_PG_WT BIT3
31#define IA32_PG_CD BIT4
34#define IA32_PG_PS BIT7
35#define IA32_PG_PAT_2M BIT12
36#define IA32_PG_PAT_4K IA32_PG_PS
37#define IA32_PG_PMNT BIT62
38#define IA32_PG_NX BIT63
40#define PAGE_ATTRIBUTE_BITS (IA32_PG_D | IA32_PG_A | IA32_PG_U | IA32_PG_RW | IA32_PG_P)
45#define IA32_PAE_PDPTE_ATTRIBUTE_BITS (IA32_PG_P)
47#define PAGE_PROGATE_BITS (IA32_PG_NX | PAGE_ATTRIBUTE_BITS)
49#define PAGING_4K_MASK 0xFFF
50#define PAGING_2M_MASK 0x1FFFFF
51#define PAGING_1G_MASK 0x3FFFFFFF
53#define PAGING_PAE_INDEX_MASK 0x1FF
55#define PAGING_4K_ADDRESS_MASK_64 0x000FFFFFFFFFF000ull
56#define PAGING_2M_ADDRESS_MASK_64 0x000FFFFFFFE00000ull
57#define PAGING_1G_ADDRESS_MASK_64 0x000FFFFFC0000000ull
59#define MAX_PF_ENTRY_COUNT 10
60#define MAX_DEBUG_MESSAGE_LENGTH 0x100
61#define IA32_PF_EC_ID BIT4
71 PAGE_ATTRIBUTE Attribute;
83 { Page4K, SIZE_4KB, PAGING_4K_ADDRESS_MASK_64 },
84 { Page2M, SIZE_2MB, PAGING_2M_ADDRESS_MASK_64 },
85 { Page1G, SIZE_1GB, PAGING_1G_ADDRESS_MASK_64 },
89BOOLEAN mPageTablePoolLock =
FALSE;
97UINT64 *(*mLastPFEntryPointer)[MAX_PF_ENTRY_COUNT];
125 if (mSmmBase2 ==
NULL) {
126 gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid,
NULL, (VOID **)&mSmmBase2);
129 if (mSmmBase2 !=
NULL) {
130 mSmmBase2->InSmm (mSmmBase2, &
InSmm);
140 mPagingContext.ContextData.X64.PageTableBase != (UINT64)
AsmReadCr3 ());
159 UINTN *PageTableBase;
165 ZeroMem (&mPagingContext,
sizeof (mPagingContext));
166 if (
sizeof (
UINTN) ==
sizeof (UINT64)) {
167 mPagingContext.MachineType = IMAGE_FILE_MACHINE_X64;
169 mPagingContext.MachineType = IMAGE_FILE_MACHINE_I386;
172 GetPagingDetails (&mPagingContext.ContextData, &PageTableBase, &Attributes);
177 if (Cr0.Bits.PG != 0) {
178 *PageTableBase = (
AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64);
183 if (Cr0.Bits.WP != 0) {
184 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_WP_ENABLE;
187 if (Cr4.Bits.PSE != 0) {
188 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PSE;
191 if (Cr4.Bits.PAE != 0) {
192 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE;
195 if (Cr4.Bits.LA57 != 0) {
196 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_5_LEVEL;
203 if (RegEdx.
Bits.
NX != 0) {
208 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_XD_ACTIVATED;
213 *Attributes |= PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAGE_1G_SUPPORT;
222 CopyMem (PagingContext, &mPagingContext,
sizeof (mPagingContext));
234 IN PAGE_ATTRIBUTE PageAttribute
239 for (Index = 0; Index <
sizeof (mPageAttributeTable)/
sizeof (mPageAttributeTable[0]); Index++) {
240 if (PageAttribute == mPageAttributeTable[Index].Attribute) {
241 return (
UINTN)mPageAttributeTable[Index].Length;
257 IN PAGE_ATTRIBUTE PageAttribute
262 for (Index = 0; Index <
sizeof (mPageAttributeTable)/
sizeof (mPageAttributeTable[0]); Index++) {
263 if (PageAttribute == mPageAttributeTable[Index].Attribute) {
264 return (
UINTN)mPageAttributeTable[Index].AddressMask;
283 IN PHYSICAL_ADDRESS Address,
284 OUT PAGE_ATTRIBUTE *PageAttribute
297 UINT64 AddressEncMask;
301 Index5 = ((
UINTN)
RShiftU64 (Address, 48)) & PAGING_PAE_INDEX_MASK;
302 Index4 = ((
UINTN)
RShiftU64 (Address, 39)) & PAGING_PAE_INDEX_MASK;
303 Index3 = ((
UINTN)Address >> 30) & PAGING_PAE_INDEX_MASK;
304 Index2 = ((
UINTN)Address >> 21) & PAGING_PAE_INDEX_MASK;
305 Index1 = ((
UINTN)Address >> 12) & PAGING_PAE_INDEX_MASK;
309 AddressEncMask =
PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64;
310 if (AddressEncMask == 0) {
311 AddressEncMask =
PcdGet64 (PcdTdxSharedBitMask) & PAGING_1G_ADDRESS_MASK_64;
314 if (PagingContext->MachineType == IMAGE_FILE_MACHINE_X64) {
315 if ((PagingContext->ContextData.X64.Attributes & PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_5_LEVEL) != 0) {
316 L5PageTable = (UINT64 *)(
UINTN)PagingContext->ContextData.X64.PageTableBase;
317 if (L5PageTable[Index5] == 0) {
318 *PageAttribute = PageNone;
322 L4PageTable = (UINT64 *)(
UINTN)(L5PageTable[Index5] & ~AddressEncMask & PAGING_4K_ADDRESS_MASK_64);
324 L4PageTable = (UINT64 *)(
UINTN)PagingContext->ContextData.X64.PageTableBase;
327 if (L4PageTable[Index4] == 0) {
328 *PageAttribute = PageNone;
332 L3PageTable = (UINT64 *)(
UINTN)(L4PageTable[Index4] & ~AddressEncMask & PAGING_4K_ADDRESS_MASK_64);
334 ASSERT ((PagingContext->ContextData.Ia32.Attributes & PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE) != 0);
335 L3PageTable = (UINT64 *)(
UINTN)PagingContext->ContextData.Ia32.PageTableBase;
338 if (L3PageTable[Index3] == 0) {
339 *PageAttribute = PageNone;
343 if ((L3PageTable[Index3] & IA32_PG_PS) != 0) {
345 *PageAttribute = Page1G;
346 return &L3PageTable[Index3];
349 L2PageTable = (UINT64 *)(
UINTN)(L3PageTable[Index3] & ~AddressEncMask & PAGING_4K_ADDRESS_MASK_64);
350 if (L2PageTable[Index2] == 0) {
351 *PageAttribute = PageNone;
355 if ((L2PageTable[Index2] & IA32_PG_PS) != 0) {
357 *PageAttribute = Page2M;
358 return &L2PageTable[Index2];
362 L1PageTable = (UINT64 *)(
UINTN)(L2PageTable[Index2] & ~AddressEncMask & PAGING_4K_ADDRESS_MASK_64);
363 if ((L1PageTable[Index1] == 0) && (Address != 0)) {
364 *PageAttribute = PageNone;
368 *PageAttribute = Page4K;
369 return &L1PageTable[Index1];
388 Attributes |= EFI_MEMORY_RP;
391 if ((*PageEntry & IA32_PG_RW) == 0) {
392 Attributes |= EFI_MEMORY_RO;
395 if ((*PageEntry & IA32_PG_NX) != 0) {
396 Attributes |= EFI_MEMORY_XP;
414 IN UINT64 *PageEntry,
415 IN UINT64 Attributes,
416 IN PAGE_ACTION PageAction,
417 OUT BOOLEAN *IsModified
420 UINT64 CurrentPageEntry;
422 UINT32 *PageAttributes;
424 CurrentPageEntry = *PageEntry;
425 NewPageEntry = CurrentPageEntry;
426 if ((Attributes & EFI_MEMORY_RP) != 0) {
427 switch (PageAction) {
428 case PageActionAssign:
432 case PageActionClear:
437 switch (PageAction) {
438 case PageActionAssign:
442 case PageActionClear:
447 if ((Attributes & EFI_MEMORY_RO) != 0) {
448 switch (PageAction) {
449 case PageActionAssign:
451 NewPageEntry &= ~(UINT64)IA32_PG_RW;
453 case PageActionClear:
454 NewPageEntry |= IA32_PG_RW;
458 switch (PageAction) {
459 case PageActionAssign:
460 NewPageEntry |= IA32_PG_RW;
463 case PageActionClear:
470 if ((*PageAttributes & PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_XD_ACTIVATED) != 0) {
471 if ((Attributes & EFI_MEMORY_XP) != 0) {
472 switch (PageAction) {
473 case PageActionAssign:
475 NewPageEntry |= IA32_PG_NX;
477 case PageActionClear:
478 NewPageEntry &= ~IA32_PG_NX;
482 switch (PageAction) {
483 case PageActionAssign:
484 NewPageEntry &= ~IA32_PG_NX;
487 case PageActionClear:
493 *PageEntry = NewPageEntry;
494 if (CurrentPageEntry != NewPageEntry) {
496 DEBUG ((DEBUG_VERBOSE,
"ConvertPageEntryAttribute 0x%lx", CurrentPageEntry));
497 DEBUG ((DEBUG_VERBOSE,
"->0x%lx\n", NewPageEntry));
515 IN PHYSICAL_ADDRESS BaseAddress,
517 IN UINT64 *PageEntry,
518 IN PAGE_ATTRIBUTE PageAttribute
521 UINT64 PageEntryLength;
525 if (((BaseAddress & (PageEntryLength - 1)) == 0) && (Length >= PageEntryLength)) {
529 if (((BaseAddress & PAGING_2M_MASK) != 0) || (Length < SIZE_2MB)) {
550 IN UINT64 *PageEntry,
551 IN PAGE_ATTRIBUTE PageAttribute,
552 IN PAGE_ATTRIBUTE SplitAttribute,
557 UINT64 *NewPageEntry;
559 UINT64 AddressEncMask;
561 ASSERT (PageAttribute == Page2M || PageAttribute == Page1G);
567 AddressEncMask =
PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64;
569 if (PageAttribute == Page2M) {
573 ASSERT (SplitAttribute == Page4K);
574 if (SplitAttribute == Page4K) {
575 NewPageEntry = AllocatePagesFunc (1);
576 DEBUG ((DEBUG_VERBOSE,
"Split - 0x%x\n", NewPageEntry));
577 if (NewPageEntry ==
NULL) {
581 BaseAddress = *PageEntry & ~AddressEncMask & PAGING_2M_ADDRESS_MASK_64;
582 for (Index = 0; Index < SIZE_4KB /
sizeof (UINT64); Index++) {
583 NewPageEntry[Index] = (BaseAddress + SIZE_4KB * Index) | AddressEncMask | ((*PageEntry) & PAGE_PROGATE_BITS);
586 (*PageEntry) = (UINT64)(
UINTN)NewPageEntry | AddressEncMask | ((*PageEntry) & PAGE_ATTRIBUTE_BITS);
591 }
else if (PageAttribute == Page1G) {
596 ASSERT (SplitAttribute == Page2M || SplitAttribute == Page4K);
597 if (((SplitAttribute == Page2M) || (SplitAttribute == Page4K))) {
598 NewPageEntry = AllocatePagesFunc (1);
599 DEBUG ((DEBUG_VERBOSE,
"Split - 0x%x\n", NewPageEntry));
600 if (NewPageEntry ==
NULL) {
604 BaseAddress = *PageEntry & ~AddressEncMask & PAGING_1G_ADDRESS_MASK_64;
605 for (Index = 0; Index < SIZE_4KB /
sizeof (UINT64); Index++) {
606 NewPageEntry[Index] = (BaseAddress + SIZE_2MB * Index) | AddressEncMask | IA32_PG_PS | ((*PageEntry) & PAGE_PROGATE_BITS);
609 (*PageEntry) = (UINT64)(
UINTN)NewPageEntry | AddressEncMask | ((*PageEntry) & PAGE_ATTRIBUTE_BITS);
639 return (BOOLEAN)(Cr0.Bits.WP != 0);
719 IN PHYSICAL_ADDRESS BaseAddress,
721 IN UINT64 Attributes,
722 IN PAGE_ACTION PageAction,
724 OUT BOOLEAN *IsSplitted OPTIONAL,
725 OUT BOOLEAN *IsModified OPTIONAL
730 PAGE_ATTRIBUTE PageAttribute;
731 UINTN PageEntryLength;
732 PAGE_ATTRIBUTE SplitAttribute;
733 RETURN_STATUS Status;
734 BOOLEAN IsEntryModified;
737 if ((BaseAddress & (SIZE_4KB - 1)) != 0) {
738 DEBUG ((DEBUG_ERROR,
"BaseAddress(0x%lx) is not aligned!\n", BaseAddress));
739 return EFI_UNSUPPORTED;
742 if ((Length & (SIZE_4KB - 1)) != 0) {
743 DEBUG ((DEBUG_ERROR,
"Length(0x%lx) is not aligned!\n", Length));
744 return EFI_UNSUPPORTED;
748 DEBUG ((DEBUG_ERROR,
"Length is 0!\n"));
752 if ((Attributes & ~EFI_MEMORY_ATTRIBUTE_MASK) != 0) {
753 DEBUG ((DEBUG_ERROR,
"Attributes(0x%lx) has unsupported bit\n", Attributes));
754 return EFI_UNSUPPORTED;
757 if (PagingContext ==
NULL) {
760 CopyMem (&CurrentPagingContext, PagingContext,
sizeof (CurrentPagingContext));
763 switch (CurrentPagingContext.MachineType) {
764 case IMAGE_FILE_MACHINE_I386:
765 if (CurrentPagingContext.ContextData.Ia32.PageTableBase == 0) {
766 if (Attributes == 0) {
769 DEBUG ((DEBUG_ERROR,
"PageTable is 0!\n"));
770 return EFI_UNSUPPORTED;
774 if ((CurrentPagingContext.ContextData.Ia32.Attributes & PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE) == 0) {
775 DEBUG ((DEBUG_ERROR,
"Non-PAE Paging!\n"));
776 return EFI_UNSUPPORTED;
779 if ((BaseAddress + Length) > BASE_4GB) {
780 DEBUG ((DEBUG_ERROR,
"Beyond 4GB memory in 32-bit mode!\n"));
781 return EFI_UNSUPPORTED;
785 case IMAGE_FILE_MACHINE_X64:
786 ASSERT (CurrentPagingContext.ContextData.X64.PageTableBase != 0);
790 return EFI_UNSUPPORTED;
796 if (IsSplitted !=
NULL) {
800 if (IsModified !=
NULL) {
804 if (AllocatePagesFunc ==
NULL) {
820 while (Length != 0) {
821 PageEntry =
GetPageTableEntry (&CurrentPagingContext, BaseAddress, &PageAttribute);
822 if (PageEntry ==
NULL) {
828 SplitAttribute =
NeedSplitPage (BaseAddress, Length, PageEntry, PageAttribute);
829 if (SplitAttribute == PageNone) {
831 if (IsEntryModified) {
832 if (IsModified !=
NULL) {
840 BaseAddress += PageEntryLength;
841 Length -= PageEntryLength;
843 if (AllocatePagesFunc ==
NULL) {
848 Status =
SplitPage (PageEntry, PageAttribute, SplitAttribute, AllocatePagesFunc);
854 if (IsSplitted !=
NULL) {
858 if (IsModified !=
NULL) {
912 IN PHYSICAL_ADDRESS BaseAddress,
914 IN UINT64 Attributes,
918 RETURN_STATUS Status;
923 Status =
ConvertMemoryPageAttributes (PagingContext, BaseAddress, Length, Attributes, PageActionAssign, AllocatePagesFunc, &IsSplitted, &IsModified);
924 if (!EFI_ERROR (Status)) {
925 if ((PagingContext ==
NULL) && IsModified) {
951 return (MsrEfer.
Bits.
NXE == 1);
963 UINTN NumberOfDescriptors;
966 PAGE_ATTRIBUTE PageAttribute;
969 UINT64 MemorySpaceLength;
972 UINT64 PageStartAddress;
975 UINT64 NewAttributes;
982 Status =
gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
993 Capabilities = EFI_MEMORY_RO | EFI_MEMORY_RP | EFI_MEMORY_XP;
995 Capabilities = EFI_MEMORY_RO | EFI_MEMORY_RP;
998 for (Index = 0; Index < NumberOfDescriptors; Index++) {
1010 Status =
gDS->SetMemorySpaceCapabilities (
1011 MemorySpaceMap[Index].BaseAddress,
1012 MemorySpaceMap[Index].Length,
1013 MemorySpaceMap[Index].Capabilities | Capabilities
1015 if (EFI_ERROR (Status)) {
1022 "Failed to update capability: [%lu] %016lx - %016lx (%016lx -> %016lx)\r\n",
1024 MemorySpaceMap[Index].BaseAddress,
1025 MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - 1,
1026 MemorySpaceMap[Index].Capabilities,
1027 MemorySpaceMap[Index].Capabilities | Capabilities
1032 if (MemorySpaceMap[Index].BaseAddress >= (BaseAddress + PageLength)) {
1042 PageLength -= (MemorySpaceMap[Index].
BaseAddress - BaseAddress);
1049 MemorySpaceLength = MemorySpaceMap[Index].
Length;
1050 while (MemorySpaceLength > 0) {
1051 if (PageLength == 0) {
1053 if (PageEntry ==
NULL) {
1065 Length =
MIN (PageLength, MemorySpaceLength);
1066 if (Attributes != (MemorySpaceMap[Index].Attributes &
1067 EFI_MEMORY_ATTRIBUTE_MASK))
1069 NewAttributes = (MemorySpaceMap[Index].
Attributes &
1070 ~EFI_MEMORY_ATTRIBUTE_MASK) | Attributes;
1071 Status =
gDS->SetMemorySpaceAttributes (
1079 "Updated memory space attribute: [%lu] %016lx - %016lx (%016lx -> %016lx)\r\n",
1082 BaseAddress + Length - 1,
1083 MemorySpaceMap[Index].Attributes,
1088 PageLength -= Length;
1089 MemorySpaceLength -= Length;
1090 BaseAddress += Length;
1125 if (mPageTablePoolLock) {
1129 mPageTablePoolLock =
TRUE;
1137 PoolPages = ((PoolPages - 1) / PAGE_TABLE_POOL_UNIT_PAGES + 1) *
1138 PAGE_TABLE_POOL_UNIT_PAGES;
1140 if (Buffer ==
NULL) {
1141 DEBUG ((DEBUG_ERROR,
"ERROR: Out of aligned pages\r\n"));
1147 "Paging: added %lu pages to page table pool\r\n",
1154 if (mPageTablePool ==
NULL) {
1155 mPageTablePool = Buffer;
1156 mPageTablePool->NextPool = mPageTablePool;
1159 mPageTablePool->NextPool = Buffer;
1160 mPageTablePool = Buffer;
1166 mPageTablePool->FreePages = PoolPages - 1;
1174 (PHYSICAL_ADDRESS)(
UINTN)Buffer,
1185 mPageTablePoolLock =
FALSE;
1221 if ((mPageTablePool ==
NULL) ||
1222 (Pages > mPageTablePool->FreePages))
1229 Buffer = (UINT8 *)mPageTablePool + mPageTablePool->Offset;
1232 mPageTablePool->FreePages -= Pages;
1255 BOOLEAN IsWpEnabled;
1267 for (PFEntry = 0; PFEntry < mPFEntryCount[CpuIndex]; PFEntry++) {
1268 if (mLastPFEntryPointer[CpuIndex][PFEntry] !=
NULL) {
1269 *mLastPFEntryPointer[CpuIndex][PFEntry] &= ~(UINT64)
IA32_PG_P;
1280 mPFEntryCount[CpuIndex] = 0;
1290 if (mPagingContext.MachineType == IMAGE_FILE_MACHINE_I386) {
1291 SystemContext.SystemContextIa32->Eflags &= (UINT32) ~BIT8;
1293 SystemContext.SystemContextX64->Rflags &= (UINT64) ~BIT8;
1316 PAGE_ATTRIBUTE PageAttribute;
1322 BOOLEAN NonStopMode;
1325 if (PFAddress < BASE_4KB) {
1326 NonStopMode = NULL_DETECTION_NONSTOP_MODE ?
TRUE :
FALSE;
1328 NonStopMode = HEAP_GUARD_NONSTOP_MODE ?
TRUE :
FALSE;
1340 while (PageNumber > 0) {
1344 if (PageEntry !=
NULL) {
1346 if ((Attributes & EFI_MEMORY_RP) != 0) {
1347 Attributes &= ~EFI_MEMORY_RP;
1355 if (!EFI_ERROR (Status)) {
1356 Index = mPFEntryCount[CpuIndex];
1362 mLastPFEntryPointer[CpuIndex][Index++] = PageEntry;
1363 mPFEntryCount[CpuIndex] = Index;
1368 PFAddress += EFI_PAGE_SIZE;
1385 if (mPagingContext.MachineType == IMAGE_FILE_MACHINE_I386) {
1386 SystemContext.SystemContextIa32->Eflags |= (UINT32)BIT8;
1388 SystemContext.SystemContextX64->Rflags |= (UINT64)BIT8;
1405 UINTN *PageTableBase;
1409 GetPagingDetails (&CurrentPagingContext.ContextData, &PageTableBase, &Attributes);
1414 if ((*PageTableBase != 0) &&
1415 ((*Attributes & PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE) != 0))
1422 if (HEAP_GUARD_NONSTOP_MODE || NULL_DETECTION_NONSTOP_MODE) {
1426 mLastPFEntryPointer = (UINT64 *(*)[MAX_PF_ENTRY_COUNT])
1431 DEBUG ((DEBUG_INFO,
"CurrentPagingContext:\n"));
1432 DEBUG ((DEBUG_INFO,
" MachineType - 0x%x\n", CurrentPagingContext.MachineType));
1433 DEBUG ((DEBUG_INFO,
" PageTableBase - 0x%Lx\n", (UINT64)*PageTableBase));
1434 DEBUG ((DEBUG_INFO,
" Attributes - 0x%x\n", *Attributes));
RETURN_STATUS EFIAPI SerialPortInitialize(VOID)
#define RETURN_ERROR(StatusCode)
#define RETURN_UNSUPPORTED
#define RETURN_OUT_OF_RESOURCES
#define RETURN_INVALID_PARAMETER
VOID EFIAPI CpuDeadLoop(VOID)
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
#define MSR_CORE_IA32_EFER
VOID EFIAPI DumpCpuContext(IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext)
VOID EFIAPI CpuFlushTlb(VOID)
VOID *EFIAPI AllocatePageTableMemory(IN UINTN Pages)
VOID GetCurrentPagingContext(IN OUT PAGE_TABLE_LIB_PAGING_CONTEXT *PagingContext)
PAGE_ATTRIBUTE NeedSplitPage(IN PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT64 *PageEntry, IN PAGE_ATTRIBUTE PageAttribute)
VOID EnableReadOnlyPageWriteProtect(VOID)
RETURN_STATUS ConvertMemoryPageAttributes(IN PAGE_TABLE_LIB_PAGING_CONTEXT *PagingContext OPTIONAL, IN PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT64 Attributes, IN PAGE_ACTION PageAction, IN PAGE_TABLE_LIB_ALLOCATE_PAGES AllocatePagesFunc OPTIONAL, OUT BOOLEAN *IsSplitted OPTIONAL, OUT BOOLEAN *IsModified OPTIONAL)
UINT64 GetAttributesFromPageEntry(IN UINT64 *PageEntry)
VOID EFIAPI PageFaultExceptionHandler(IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext)
BOOLEAN IsExecuteDisableEnabled(VOID)
RETURN_STATUS SplitPage(IN UINT64 *PageEntry, IN PAGE_ATTRIBUTE PageAttribute, IN PAGE_ATTRIBUTE SplitAttribute, IN PAGE_TABLE_LIB_ALLOCATE_PAGES AllocatePagesFunc)
VOID EFIAPI DebugExceptionHandler(IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext)
UINTN PageAttributeToLength(IN PAGE_ATTRIBUTE PageAttribute)
BOOLEAN InitializePageTablePool(IN UINTN PoolPages)
VOID RefreshGcdMemoryAttributesFromPaging(VOID)
VOID InitializePageTableLib(VOID)
RETURN_STATUS EFIAPI AssignMemoryPageAttributes(IN PAGE_TABLE_LIB_PAGING_CONTEXT *PagingContext OPTIONAL, IN PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT64 Attributes, IN PAGE_TABLE_LIB_ALLOCATE_PAGES AllocatePagesFunc OPTIONAL)
VOID DisableReadOnlyPageWriteProtect(VOID)
UINTN PageAttributeToMask(IN PAGE_ATTRIBUTE PageAttribute)
VOID ConvertPageEntryAttribute(IN PAGE_TABLE_LIB_PAGING_CONTEXT *PagingContext, IN UINT64 *PageEntry, IN UINT64 Attributes, IN PAGE_ACTION PageAction, OUT BOOLEAN *IsModified)
BOOLEAN IsReadOnlyPageWriteProtected(VOID)
VOID * GetPageTableEntry(IN PAGE_TABLE_LIB_PAGING_CONTEXT *PagingContext, IN PHYSICAL_ADDRESS Address, OUT PAGE_ATTRIBUTE *PageAttribute)
VOID GetPagingDetails(IN PAGE_TABLE_LIB_PAGING_CONTEXT_DATA *PagingContextData, OUT UINTN **PageTableBase OPTIONAL, OUT UINT32 **Attributes OPTIONAL)
VOID *(EFIAPI * PAGE_TABLE_LIB_ALLOCATE_PAGES)(IN UINTN Pages)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define ASSERT(Expression)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
UINTN EFIAPI AsmReadCr3(VOID)
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
UINTN EFIAPI AsmReadCr0(VOID)
UINTN EFIAPI AsmWriteCr0(UINTN Cr0)
UINTN EFIAPI AsmReadCr2(VOID)
UINTN EFIAPI AsmReadCr4(VOID)
#define CPUID_EXTENDED_FUNCTION
#define CPUID_EXTENDED_CPU_SIG
UINT32 EFIAPI AsmCpuid(IN UINT32 Index, OUT UINT32 *RegisterEax OPTIONAL, OUT UINT32 *RegisterEbx OPTIONAL, OUT UINT32 *RegisterEcx OPTIONAL, OUT UINT32 *RegisterEdx OPTIONAL)
EFI_STATUS EFIAPI MpInitLibWhoAmI(OUT UINTN *ProcessorNumber)
#define PcdGet64(TokenName)
@ EfiGcdMemoryTypeNonExistent
BOOLEAN EFIAPI InSmm(VOID)
VOID *EFIAPI AllocateAlignedPages(IN UINTN Pages, IN UINTN Alignment)
#define EFI_PAGES_TO_SIZE(Pages)
EFI_PHYSICAL_ADDRESS BaseAddress
struct CPUID_EXTENDED_CPU_SIG_EDX::@661 Bits
struct MSR_CORE_IA32_EFER_REGISTER::@704 Bits
struct MSR_IA32_EFER_REGISTER::@602 Bits