X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FPeiServicesTablePointerLib%2FPeiServicesTablePointer.c;h=04c283f4a652b89b938b983e89622465cf2f336b;hb=2f88bd3a1296c522317f1c21377876de63de5be7;hp=fd5bbe7192e2f9c81cb57cc627e5b25e7aa90974;hpb=5240b97c9c9e76994e86db11ff7cf140a74f2bd0;p=mirror_edk2.git diff --git a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c index fd5bbe7192..04c283f4a6 100644 --- a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c +++ b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c @@ -1,17 +1,11 @@ /** @file PEI Services Table Pointer Library. - + This library is used for PEIM which does executed from flash device directly but executed in memory. - Copyright (c) 2006 - 2008, 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 - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -19,62 +13,97 @@ #include #include -STATIC EFI_PEI_SERVICES **gPeiServices; +CONST EFI_PEI_SERVICES **gPeiServices; /** - The function cache the pointer of PEI services to global variable. - - @param PeiServices The address of PeiServices pointer. + 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 EFI_PEI_SERVICES **PeiServices + IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer ) { - gPeiServices = PeiServices; + ASSERT (PeiServicesTablePointer != NULL); + gPeiServices = PeiServicesTablePointer; } /** - The function returns the pointer to PEI services. + Retrieves the cached value of the PEI Services Table pointer. + + 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. - The function returns the pointer to PEI services. - It will ASSERT() if the pointer to PEI services is NULL. + If the cached PEI Services Table pointer is NULL, then ASSERT(). - @retval The pointer to PeiServices. + @return The pointer to PeiServices. **/ CONST EFI_PEI_SERVICES ** +EFIAPI GetPeiServicesTablePointer ( VOID ) { ASSERT (gPeiServices != NULL); - return (CONST EFI_PEI_SERVICES **) gPeiServices; + 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 FileHandle Handle of 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_PEI_FILE_HANDLE FileHandle, - 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; +}