REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the UefiCpuPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			157 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @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
 |