This library supports a PeiServicesTablePointerLib implementation that allows code dependent upon PeiServicesTable to operate in an isolated execution environment such as within the context of a host-based unit test framework. The unit test should initialize the PeiServicesTable database with any required elements (e.g. PPIs, Hob etc.) prior to the services being invoked by code under test. It is strongly recommended to clean any global databases by using EFI_PEI_SERVICES.ResetSystem2 after every unit test so the tests execute in a predictable manner from a clean state. Cc: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Michael Kubacki <mikuback@linux.microsoft.com> Cc: Sean Brogan <sean.brogan@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
		
			
				
	
	
		
			431 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			431 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   This file implements some PEI services.
 | |
| 
 | |
|   Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "UnitTestPeiServicesTablePointerLib.h"
 | |
| 
 | |
| /**
 | |
|   This service enables PEIMs to ascertain the present value of the boot mode.
 | |
| 
 | |
|   @param PeiServices            An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param BootMode               A pointer to contain the value of the boot mode.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The boot mode was returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER BootMode is NULL.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestGetBootMode (
 | |
|   IN  CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN  OUT   EFI_BOOT_MODE     *BootMode
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This service enables PEIMs to update the boot mode variable.
 | |
| 
 | |
| 
 | |
|   @param PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param BootMode         The value of the boot mode to set.
 | |
| 
 | |
|   @return EFI_SUCCESS     The value was successfully updated
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestSetBootMode (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN EFI_BOOT_MODE           BootMode
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Search the firmware volumes by index
 | |
| 
 | |
|   @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
 | |
|   @param Instance        This instance of the firmware volume to find. The value 0 is the Boot Firmware
 | |
|                          Volume (BFV).
 | |
|   @param VolumeHandle    On exit, points to the next volume handle or NULL if it does not exist.
 | |
| 
 | |
|   @retval EFI_INVALID_PARAMETER  VolumeHandle is NULL
 | |
|   @retval EFI_NOT_FOUND          The volume was not found.
 | |
|   @retval EFI_SUCCESS            The volume was found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsFindNextVolume (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN     UINTN               Instance,
 | |
|   IN OUT EFI_PEI_FV_HANDLE   *VolumeHandle
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Searches for the next matching file in the firmware volume.
 | |
| 
 | |
|   @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param SearchType      Filter to find only files of this type.
 | |
|                          Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
 | |
|   @param FvHandle        Handle of firmware volume in which to search.
 | |
|   @param FileHandle      On entry, points to the current handle from which to begin searching or NULL to start
 | |
|                          at the beginning of the firmware volume. On exit, points the file handle of the next file
 | |
|                          in the volume or NULL if there are no more files.
 | |
| 
 | |
|   @retval EFI_NOT_FOUND  The file was not found.
 | |
|   @retval EFI_NOT_FOUND  The header checksum was not zero.
 | |
|   @retval EFI_SUCCESS    The file was found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsFindNextFile (
 | |
|   IN CONST EFI_PEI_SERVICES   **PeiServices,
 | |
|   IN UINT8                    SearchType,
 | |
|   IN EFI_PEI_FV_HANDLE        FvHandle,
 | |
|   IN OUT EFI_PEI_FILE_HANDLE  *FileHandle
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Searches for the next matching section within the specified file.
 | |
| 
 | |
|   @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation
 | |
|   @param SectionType     Filter to find only sections of this type.
 | |
|   @param FileHandle      Pointer to the current file to search.
 | |
|   @param SectionData     A pointer to the discovered section, if successful.
 | |
|                          NULL if section not found
 | |
| 
 | |
|   @retval EFI_NOT_FOUND  The section was not found.
 | |
|   @retval EFI_SUCCESS    The section was found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsFindSectionData (
 | |
|   IN CONST EFI_PEI_SERVICES   **PeiServices,
 | |
|   IN     EFI_SECTION_TYPE     SectionType,
 | |
|   IN     EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   OUT VOID                    **SectionData
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   This function registers the found memory configuration with the PEI Foundation.
 | |
| 
 | |
|   The usage model is that the PEIM that discovers the permanent memory shall invoke this service.
 | |
|   This routine will hold discoveried memory information into PeiCore's private data,
 | |
|   and set SwitchStackSignal flag. After PEIM who discovery memory is dispatched,
 | |
|   PeiDispatcher will migrate temporary memory to permanent memory.
 | |
| 
 | |
|   @param PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param MemoryBegin        Start of memory address.
 | |
|   @param MemoryLength       Length of memory.
 | |
| 
 | |
|   @return EFI_SUCCESS Always success.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestInstallPeiMemory (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN EFI_PHYSICAL_ADDRESS    MemoryBegin,
 | |
|   IN UINT64                  MemoryLength
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   The purpose of the service is to publish an interface that allows
 | |
|   PEIMs to allocate memory ranges that are managed by the PEI Foundation.
 | |
| 
 | |
|   Prior to InstallPeiMemory() being called, PEI will allocate pages from the heap.
 | |
|   After InstallPeiMemory() is called, PEI will allocate pages within the region
 | |
|   of memory provided by InstallPeiMemory() service in a best-effort fashion.
 | |
|   Location-specific allocations are not managed by the PEI foundation code.
 | |
| 
 | |
|   @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param  MemoryType       The type of memory to allocate.
 | |
|   @param  Pages            The number of contiguous 4 KB pages to allocate.
 | |
|   @param  Memory           Pointer to a physical address. On output, the address is set to the base
 | |
|                            of the page range that was allocated.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The memory range was successfully allocated.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The pages could not be allocated.
 | |
|   @retval EFI_INVALID_PARAMETER Type is not equal to EfiLoaderCode, EfiLoaderData, EfiRuntimeServicesCode,
 | |
|                                 EfiRuntimeServicesData, EfiBootServicesCode, EfiBootServicesData,
 | |
|                                 EfiACPIReclaimMemory, EfiReservedMemoryType, or EfiACPIMemoryNVS.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestAllocatePages (
 | |
|   IN CONST EFI_PEI_SERVICES      **PeiServices,
 | |
|   IN       EFI_MEMORY_TYPE       MemoryType,
 | |
|   IN       UINTN                 Pages,
 | |
|   OUT      EFI_PHYSICAL_ADDRESS  *Memory
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   Pool allocation service. Before permanent memory is discovered, the pool will
 | |
|   be allocated in the heap in temporary memory. Generally, the size of the heap in temporary
 | |
|   memory does not exceed 64K, so the biggest pool size could be allocated is
 | |
|   64K.
 | |
| 
 | |
|   @param PeiServices               An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param Size                      Amount of memory required
 | |
|   @param Buffer                    Address of pointer to the buffer
 | |
| 
 | |
|   @retval EFI_SUCCESS              The allocation was successful
 | |
|   @retval EFI_OUT_OF_RESOURCES     There is not enough heap to satisfy the requirement
 | |
|                                    to allocate the requested size.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestAllocatePool (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN       UINTN             Size,
 | |
|   OUT      VOID              **Buffer
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   Core version of the Status Code reporter
 | |
| 
 | |
| 
 | |
|   @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param CodeType        Type of Status Code.
 | |
|   @param Value           Value to output for Status Code.
 | |
|   @param Instance        Instance Number of this status code.
 | |
|   @param CallerId        ID of the caller of this status code.
 | |
|   @param Data            Optional data associated with this status code.
 | |
| 
 | |
|   @retval EFI_SUCCESS             if status code is successfully reported
 | |
|   @retval EFI_NOT_AVAILABLE_YET   if StatusCodePpi has not been installed
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestReportStatusCode (
 | |
|   IN CONST EFI_PEI_SERVICES      **PeiServices,
 | |
|   IN EFI_STATUS_CODE_TYPE        CodeType,
 | |
|   IN EFI_STATUS_CODE_VALUE       Value,
 | |
|   IN UINT32                      Instance,
 | |
|   IN CONST EFI_GUID              *CallerId,
 | |
|   IN CONST EFI_STATUS_CODE_DATA  *Data OPTIONAL
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
| Core version of the Reset System
 | |
| 
 | |
| 
 | |
| @param PeiServices                An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
| 
 | |
| @retval EFI_NOT_AVAILABLE_YET     PPI not available yet.
 | |
| @retval EFI_DEVICE_ERROR          Did not reset system.
 | |
|                                   Otherwise, resets the system.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestResetSystem (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Find a file within a volume by its name.
 | |
| 
 | |
|   @param FileName        A pointer to the name of the file to find within the firmware volume.
 | |
|   @param VolumeHandle    The firmware volume to search
 | |
|   @param FileHandle      Upon exit, points to the found file's handle
 | |
|                          or NULL if it could not be found.
 | |
| 
 | |
|   @retval EFI_SUCCESS            File was found.
 | |
|   @retval EFI_NOT_FOUND          File was not found.
 | |
|   @retval EFI_INVALID_PARAMETER  VolumeHandle or FileHandle or FileName was NULL.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsFindFileByName (
 | |
|   IN  CONST EFI_GUID       *FileName,
 | |
|   IN  EFI_PEI_FV_HANDLE    VolumeHandle,
 | |
|   OUT EFI_PEI_FILE_HANDLE  *FileHandle
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Returns information about a specific file.
 | |
| 
 | |
|   @param FileHandle       Handle of the file.
 | |
|   @param FileInfo         Upon exit, points to the file's information.
 | |
| 
 | |
|   @retval EFI_INVALID_PARAMETER If FileInfo is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER If FileHandle does not represent a valid file.
 | |
|   @retval EFI_SUCCESS           File information returned.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsGetFileInfo (
 | |
|   IN EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   OUT EFI_FV_FILE_INFO    *FileInfo
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Returns information about the specified volume.
 | |
| 
 | |
|   This function returns information about a specific firmware
 | |
|   volume, including its name, type, attributes, starting address
 | |
|   and size.
 | |
| 
 | |
|   @param VolumeHandle   Handle of the volume.
 | |
|   @param VolumeInfo     Upon exit, points to the volume's information.
 | |
| 
 | |
|   @retval EFI_SUCCESS             Volume information returned.
 | |
|   @retval EFI_INVALID_PARAMETER   If VolumeHandle does not represent a valid volume.
 | |
|   @retval EFI_INVALID_PARAMETER   If VolumeHandle is NULL.
 | |
|   @retval EFI_SUCCESS             Information successfully returned.
 | |
|   @retval EFI_INVALID_PARAMETER   The volume designated by the VolumeHandle is not available.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsGetVolumeInfo (
 | |
|   IN EFI_PEI_FV_HANDLE  VolumeHandle,
 | |
|   OUT EFI_FV_INFO       *VolumeInfo
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| This routine enables a PEIM to register itself for shadow when the PEI Foundation
 | |
| discovers permanent memory.
 | |
| 
 | |
| @param FileHandle             File handle of a PEIM.
 | |
| 
 | |
| @retval EFI_NOT_FOUND         The file handle doesn't point to PEIM itself.
 | |
| @retval EFI_ALREADY_STARTED   Indicate that the PEIM has been registered itself.
 | |
| @retval EFI_SUCCESS           Successfully to register itself.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestRegisterForShadow (
 | |
|   IN EFI_PEI_FILE_HANDLE  FileHandle
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Searches for the next matching section within the specified file.
 | |
| 
 | |
| @param  PeiServices           An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
| @param  SectionType           The value of the section type to find.
 | |
| @param  SectionInstance       Section instance to find.
 | |
| @param  FileHandle            Handle of the firmware file to search.
 | |
| @param  SectionData           A pointer to the discovered section, if successful.
 | |
| @param  AuthenticationStatus  A pointer to the authentication status for this section.
 | |
| 
 | |
| @retval EFI_SUCCESS      The section was found.
 | |
| @retval EFI_NOT_FOUND    The section was not found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsFindSectionData3 (
 | |
|   IN CONST EFI_PEI_SERVICES   **PeiServices,
 | |
|   IN     EFI_SECTION_TYPE     SectionType,
 | |
|   IN     UINTN                SectionInstance,
 | |
|   IN     EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   OUT VOID                    **SectionData,
 | |
|   OUT UINT32                  *AuthenticationStatus
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Returns information about a specific file.
 | |
| 
 | |
| @param FileHandle       Handle of the file.
 | |
| @param FileInfo         Upon exit, points to the file's information.
 | |
| 
 | |
| @retval EFI_INVALID_PARAMETER If FileInfo is NULL.
 | |
| @retval EFI_INVALID_PARAMETER If FileHandle does not represent a valid file.
 | |
| @retval EFI_SUCCESS           File information returned.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFfsGetFileInfo2 (
 | |
|   IN EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   OUT EFI_FV_FILE_INFO2   *FileInfo
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Frees memory pages.
 | |
| 
 | |
| @param[in] PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
| @param[in] Memory             The base physical address of the pages to be freed.
 | |
| @param[in] Pages              The number of contiguous 4 KB pages to free.
 | |
| 
 | |
| @retval EFI_SUCCESS           The requested pages were freed.
 | |
| @retval EFI_INVALID_PARAMETER Memory is not a page-aligned address or Pages is invalid.
 | |
| @retval EFI_NOT_FOUND         The requested memory pages were not allocated with
 | |
|                               AllocatePages().
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnitTestFreePages (
 | |
|   IN CONST EFI_PEI_SERVICES  **PeiServices,
 | |
|   IN EFI_PHYSICAL_ADDRESS    Memory,
 | |
|   IN UINTN                   Pages
 | |
|   )
 | |
| {
 | |
|   return EFI_NOT_AVAILABLE_YET;
 | |
| }
 |