123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /** @file
- Page table management header file.
- Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #ifndef _PAGE_TABLE_LIB_H_
- #define _PAGE_TABLE_LIB_H_
- #include <IndustryStandard/PeImage.h>
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PSE BIT0
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE BIT1
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAGE_1G_SUPPORT BIT2
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_5_LEVEL BIT3
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_WP_ENABLE BIT30
- #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_XD_ACTIVATED BIT31
- // Other bits are reserved for future use
- typedef struct {
- UINT32 PageTableBase;
- UINT32 Reserved;
- UINT32 Attributes;
- } PAGE_TABLE_LIB_PAGING_CONTEXT_IA32;
- typedef struct {
- UINT64 PageTableBase;
- UINT32 Attributes;
- } PAGE_TABLE_LIB_PAGING_CONTEXT_X64;
- typedef union {
- PAGE_TABLE_LIB_PAGING_CONTEXT_IA32 Ia32;
- PAGE_TABLE_LIB_PAGING_CONTEXT_X64 X64;
- } PAGE_TABLE_LIB_PAGING_CONTEXT_DATA;
- typedef struct {
- //
- // PE32+ Machine type for EFI images
- //
- // #define IMAGE_FILE_MACHINE_I386 0x014c
- // #define IMAGE_FILE_MACHINE_X64 0x8664
- //
- UINT16 MachineType;
- PAGE_TABLE_LIB_PAGING_CONTEXT_DATA ContextData;
- } PAGE_TABLE_LIB_PAGING_CONTEXT;
- #define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB
- #define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB
- #define PAGE_TABLE_POOL_UNIT_PAGES EFI_SIZE_TO_PAGES (PAGE_TABLE_POOL_UNIT_SIZE)
- #define PAGE_TABLE_POOL_ALIGN_MASK \
- (~(EFI_PHYSICAL_ADDRESS)(PAGE_TABLE_POOL_ALIGNMENT - 1))
- typedef struct {
- VOID *NextPool;
- UINTN Offset;
- UINTN FreePages;
- } PAGE_TABLE_POOL;
- /**
- Allocates one or more 4KB pages for page table.
- @param Pages The number of 4 KB pages to allocate.
- @return A pointer to the allocated buffer or NULL if allocation fails.
- **/
- typedef
- VOID *
- (EFIAPI *PAGE_TABLE_LIB_ALLOCATE_PAGES)(
- IN UINTN Pages
- );
- /**
- This function assigns the page attributes for the memory region specified by BaseAddress and
- Length from their current attributes to the attributes specified by Attributes.
- Caller should make sure BaseAddress and Length is at page boundary.
- Caller need guarantee the TPL <= TPL_NOTIFY, if there is split page request.
- @param PagingContext The paging context. NULL means get page table from current CPU context.
- @param BaseAddress The physical address that is the start address of a memory region.
- @param Length The size in bytes of the memory region.
- @param Attributes The bit mask of attributes to set for the memory region.
- @param AllocatePagesFunc If page split is needed, this function is used to allocate more pages.
- NULL mean page split is unsupported.
- @retval RETURN_SUCCESS The attributes were cleared for the memory region.
- @retval RETURN_ACCESS_DENIED The attributes for the memory resource range specified by
- BaseAddress and Length cannot be modified.
- @retval RETURN_INVALID_PARAMETER Length is zero.
- Attributes specified an illegal combination of attributes that
- cannot be set together.
- @retval RETURN_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of
- the memory resource range.
- @retval RETURN_UNSUPPORTED The processor does not support one or more bytes of the memory
- resource range specified by BaseAddress and Length.
- The bit mask of attributes is not support for the memory resource
- range specified by BaseAddress and Length.
- **/
- 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
- );
- /**
- Initialize the Page Table lib.
- **/
- VOID
- InitializePageTableLib (
- VOID
- );
- /**
- This API provides a way to allocate memory for page table.
- This API can be called more once to allocate memory for page tables.
- Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the
- allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL
- is returned. If there is not enough memory remaining to satisfy the request, then NULL is
- returned.
- @param Pages The number of 4 KB pages to allocate.
- @return A pointer to the allocated buffer or NULL if allocation fails.
- **/
- VOID *
- EFIAPI
- AllocatePageTableMemory (
- IN UINTN Pages
- );
- /**
- Get paging details.
- @param PagingContextData The paging context.
- @param PageTableBase Return PageTableBase field.
- @param Attributes Return Attributes field.
- **/
- VOID
- GetPagingDetails (
- IN PAGE_TABLE_LIB_PAGING_CONTEXT_DATA *PagingContextData,
- OUT UINTN **PageTableBase OPTIONAL,
- OUT UINT32 **Attributes OPTIONAL
- );
- #endif
|