X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FPeiServicesTablePointerLib%2FPeiServicesTablePointer.c;h=04c283f4a652b89b938b983e89622465cf2f336b;hb=2f88bd3a1296c522317f1c21377876de63de5be7;hp=c923f601d87a695b6c615d69e0c032126ea490a6;hpb=c7d265a94a3ee2517430e4f19f5b24482e5e7132;p=mirror_edk2.git diff --git a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c index c923f601d8..04c283f4a6 100644 --- a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c +++ b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c @@ -1,46 +1,55 @@ /** @file PEI Services Table Pointer Library. - Copyright (c) 2006, Intel Corporation
- All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php + This library is used for PEIM which does executed from flash device directly but + executed in memory. - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - Module Name: PeiServicesTablePointer.c + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ - - -// -// The package level header files this module uses -// #include -// -// The protocols, PPI and GUID defintions for this module -// -// -// The Library classes this module consumes -// #include #include -static EFI_PEI_SERVICES **gPeiServices; +CONST EFI_PEI_SERVICES **gPeiServices; + +/** + Caches a pointer PEI Services Table. + + Caches the pointer to the PEI Services Table specified by PeiServicesTablePointer + in a CPU specific manner as specified in the CPU binding section of the Platform Initialization + Pre-EFI Initialization Core Interface Specification. + + If PeiServicesTablePointer is NULL, then ASSERT(). + + @param PeiServicesTablePointer The address of PeiServices pointer. +**/ +VOID +EFIAPI +SetPeiServicesTablePointer ( + IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer + ) +{ + ASSERT (PeiServicesTablePointer != NULL); + gPeiServices = PeiServicesTablePointer; +} /** - The function returns the pointer to PEI services. + Retrieves the cached value of the PEI Services Table pointer. - The function returns the pointer to PEI services. - It will ASSERT() if the pointer to PEI services is NULL. + Returns the cached value of the PEI Services Table pointer in a CPU specific manner + as specified in the CPU binding section of the Platform Initialization Pre-EFI + Initialization Core Interface Specification. - @retval The pointer to PeiServices. + If the cached PEI Services Table pointer is NULL, then ASSERT(). + + @return The pointer to PeiServices. **/ -EFI_PEI_SERVICES ** +CONST EFI_PEI_SERVICES ** +EFIAPI GetPeiServicesTablePointer ( VOID ) @@ -49,26 +58,52 @@ GetPeiServicesTablePointer ( return gPeiServices; } - /** The constructor function caches the pointer to PEI services. - + The constructor function caches the pointer to PEI services. It will always return EFI_SUCCESS. - @param FfsHeader Pointer to FFS header the loaded driver. - @param PeiServices Pointer to the PEI services. + @param FileHandle The handle of FFS header the loaded driver. + @param PeiServices The pointer to the PEI services. - @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. **/ EFI_STATUS EFIAPI PeiServicesTablePointerLibConstructor ( - IN EFI_FFS_FILE_HEADER *FfsHeader, - IN EFI_PEI_SERVICES **PeiServices + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices ) { gPeiServices = PeiServices; return EFI_SUCCESS; } + +/** + Perform CPU specific actions required to migrate the PEI Services Table + pointer from temporary RAM to permanent RAM. + + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes + immediately preceding the Interrupt Descriptor Table (IDT) in memory. + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes + immediately preceding the Interrupt Descriptor Table (IDT) in memory. + For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in + a dedicated CPU register. This means that there is no memory storage + associated with storing the PEI Services Table pointer, so no additional + migration actions are required for Itanium or ARM CPUs. + +**/ +VOID +EFIAPI +MigratePeiServicesTablePointer ( + VOID + ) +{ + // + // PEI Services Table pointer is cached in the global variable. No additional + // migration actions are required. + // + return; +}