diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/UefiCpuPkg/CpuDxe/CpuPageTable.h')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/UefiCpuPkg/CpuDxe/CpuPageTable.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/CpuDxe/CpuPageTable.h b/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/CpuDxe/CpuPageTable.h new file mode 100644 index 00000000..2822b1f9 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/CpuDxe/CpuPageTable.h @@ -0,0 +1,157 @@ +/** @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 |