18#include <Library/UefiLib.h>
19#include <Library/BaseMemoryLib.h>
20#include <Library/BaseOverflowLib.h>
21#include <Library/MtrrLib.h>
25#include <Register/Intel/Cpuid.h>
86 CPUID_VERSION_INFO_EDX Edx;
91 AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &Edx.Uint32);
93 return (Edx.Bits.PAT != 0);
98 OUT UINTN *Flags OPTIONAL
125 if ((Cr0 &
CR0_WP) != 0) {
126 AsmWriteCr0 (Cr0 & ~
CR0_WP);
142 AsmWriteCr0 (Cr0 |
CR0_WP);
148 IN EFI_VIRTUAL_ADDRESS VirtualAddr,
149 OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr
166 IN EFI_VIRTUAL_ADDRESS VirtualAddr,
172 EFI_VIRTUAL_ADDRESS EndAddr;
173 EFI_PHYSICAL_ADDRESS PhysicalAddr;
176 if (BaseOverflowAddU64 (VirtualAddr,
Length, &EndAddr)) {
177 return EFI_INVALID_PARAMETER;
191 if (EFI_ERROR (Status)) {
195 if (VirtualAddr != PhysicalAddr) {
196 return EFI_UNSUPPORTED;
201 VirtualAddr += SIZE_1GB;
205 VirtualAddr += SIZE_2MB;
209 VirtualAddr += SIZE_4KB;
213 return EFI_UNSUPPORTED;
215 }
while (VirtualAddr < EndAddr);
223 IN EFI_VIRTUAL_ADDRESS VirtualAddr,
224 OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr OPTIONAL,
225 OUT UINT8 *Level OPTIONAL,
226 OUT UINT64 *Bits OPTIONAL,
231 EFI_PHYSICAL_ADDRESS
Start;
245 if (!SetPat && (PatIndex != NULL)) {
249 if (PageTable == NULL) {
253 VA.
Uint64 = (UINT64)VirtualAddr;
263 VAEnd.
Uint64 = ~(UINT64)0;
268 return EFI_NO_MAPPING;
280 return EFI_NO_MAPPING;
290 if (PhysicalAddr != NULL) {
298 if (PatIndex != NULL) {
302 PTE1G->
Bits.
PAT = PatIndex->Bits.PAT;
306 PatIndex->Bits.PAT = (UINT8)PTE1G->
Bits.
PAT;
326 return EFI_NO_MAPPING;
336 if (PhysicalAddr != NULL) {
344 if (PatIndex != NULL) {
348 PTE2M->
Bits.
PAT = PatIndex->Bits.PAT;
352 PatIndex->Bits.PAT = (UINT8)PTE2M->
Bits.
PAT;
372 return EFI_NO_MAPPING;
377 if (PhysicalAddr != NULL) {
385 if (PatIndex != NULL) {
389 PTE4K->
Bits.
PAT = PatIndex->Bits.PAT;
393 PatIndex->Bits.PAT = (UINT8)PTE4K->
Bits.
PAT;
411 IN EFI_PHYSICAL_ADDRESS Address,
413 OUT UINT64 *
Length OPTIONAL
416 EFI_PHYSICAL_ADDRESS Walker;
417 UINT8 OriginalMtrrType;
423 if (!IsMtrrSupported ()) {
424 return EFI_UNSUPPORTED;
428 OriginalMtrrType = MtrrGetMemoryAttribute (Walker);
431 }
while (OriginalMtrrType == MtrrGetMemoryAttribute (Walker));
434 *
Length = Walker - Address;
437 return MtrrSetMemoryAttribute (Address, Walker - Address, MtrrType);
444 IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL
448 EFI_PHYSICAL_ADDRESS Addr;
460 if (!EFI_ERROR (Status)) {
461 Context->MemoryPool = (UINT8 *)(UINTN)Addr;
462 Context->FreePages = NumPages;
474 VOID *AllocatedPages;
476 AllocatedPages = NULL;
478 if (Context->FreePages >= NumPages) {
479 AllocatedPages = Context->MemoryPool;
480 Context->MemoryPool += EFI_PAGES_TO_SIZE (NumPages);
481 Context->FreePages -= NumPages;
484 return AllocatedPages;
491 IN EFI_VIRTUAL_ADDRESS VirtualAddr,
492 IN EFI_PHYSICAL_ADDRESS PhysicalAddr
495 EFI_PHYSICAL_ADDRESS
Start;
507 BOOLEAN WriteProtected;
509 if (PageTable == NULL) {
515 VA.
Uint64 = (UINT64)VirtualAddr;
537 VAEnd.
Uint64 = ~(UINT64)0;
545 if (WriteProtected) {
549 return EFI_NO_MAPPING;
560 for (Index = 0; Index < 512; ++Index) {
589 if (WriteProtected) {
593 return EFI_NO_MAPPING;
606 for (Index = 0; Index < 512; ++Index) {
636 if (WriteProtected) {
640 return EFI_NO_MAPPING;
643 ZeroMem (PTE4K, EFI_PAGE_SIZE);
653 for (Index = 0; Index < 512; ++Index) {
685 if (WriteProtected) {
696 IN EFI_VIRTUAL_ADDRESS VirtualAddr,
698 IN EFI_PHYSICAL_ADDRESS PhysicalAddr
703 if (PageTable == NULL) {
707 Status = EFI_SUCCESS;
709 while (NumPages > 0 && !EFI_ERROR (Status)) {
717 VirtualAddr += EFI_PAGE_SIZE;
718 PhysicalAddr += EFI_PAGE_SIZE;
733 AsmWriteCr3 (AsmReadCr3 ());
#define ARRAY_SIZE(Array)
#define PAGING_2M_ADDRESS_MASK_64
#define VA_FIX_SIGN_EXTEND(VA)
#define PAGING_4K_ADDRESS_MASK_64
#define PAGING_1G_ADDRESS_MASK_64
EFI_STATUS OcAllocatePagesFromTop(IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT EFI_PHYSICAL_ADDRESS *Memory, IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL, IN EFI_ALLOCATE_PAGES AllocatePages OPTIONAL, IN CHECK_ALLOCATION_RANGE CheckRange OPTIONAL)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT32 AsmCpuid(IN UINT32 Index, OUT UINT32 *Eax, OPTIONAL OUT UINT32 *Ebx, OPTIONAL OUT UINT32 *Ecx, OPTIONAL OUT UINT32 *Edx OPTIONAL)
EFI_STATUS VmMapVirtualPage(IN OUT OC_VMEM_CONTEXT *Context, IN OUT PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, IN EFI_PHYSICAL_ADDRESS PhysicalAddr)
PAGE_MAP_AND_DIRECTORY_POINTER * OcGetCurrentPageTable(OUT UINTN *Flags OPTIONAL)
EFI_STATUS OcGetPhysicalAddress(IN PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr)
STATIC CHAR8 * PatTypeStrings[]
STATIC VOID EnablePageTableWriteProtection(VOID)
EFI_STATUS OcSetPatIndexForAddressRange(IN PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, IN UINT64 Length, IN PAT_INDEX *PatIndex)
STATIC CHAR8 * MtrrTypeStrings[]
BOOLEAN OcIsPatSupported(VOID)
EFI_STATUS VmMapVirtualPages(IN OUT OC_VMEM_CONTEXT *Context, IN OUT PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, IN UINT64 NumPages, IN EFI_PHYSICAL_ADDRESS PhysicalAddr)
EFI_STATUS OcModifyMtrrRange(IN EFI_PHYSICAL_ADDRESS Address, IN UINT8 MtrrType, OUT UINT64 *Length OPTIONAL)
EFI_STATUS VmAllocateMemoryPool(OUT OC_VMEM_CONTEXT *Context, IN UINTN NumPages, IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL)
CHAR8 * OcGetPatTypeString(UINT8 PatType)
EFI_STATUS OcGetSetPageTableInfoForAddress(IN PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr OPTIONAL, OUT UINT8 *Level OPTIONAL, OUT UINT64 *Bits OPTIONAL, IN OUT PAT_INDEX *PatIndex OPTIONAL, IN BOOLEAN SetPat)
STATIC BOOLEAN DisablePageTableWriteProtection(VOID)
CHAR8 * OcGetMtrrTypeString(UINT8 MtrrType)
VOID * VmAllocatePages(IN OUT OC_VMEM_CONTEXT *Context, IN UINTN NumPages)
struct PAGE_MAP_AND_DIRECTORY_POINTER::@69 Bits
UINT64 PageTableBaseAddress
struct PAGE_TABLE_1G_ENTRY::@72 Bits
struct PAGE_TABLE_2M_ENTRY::@71 Bits
struct PAGE_TABLE_4K_ENTRY::@70 Bits
struct VIRTUAL_ADDR::@76 Pg1G
struct VIRTUAL_ADDR::@74 Pg4K
struct VIRTUAL_ADDR::@75 Pg2M