X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FPeiServicesTablePointerLib%2FPeiServicesTablePointer.c;h=04c283f4a652b89b938b983e89622465cf2f336b;hb=2f88bd3a1296c522317f1c21377876de63de5be7;hp=558f7cc19330ee824cba009680ebda40567e704a;hpb=a73480f6f2e211947ac19ef049adcba6f50bb655;p=mirror_edk2.git
diff --git a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
index 558f7cc193..04c283f4a6 100644
--- a/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
+++ b/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
@@ -1,16 +1,11 @@
/** @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
**/
@@ -18,20 +13,43 @@
#include
#include
-#include "PeiServicesTablePointerInternal.h"
+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().
-static EFI_PEI_SERVICES **gPeiServices;
+ @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.
+
+ 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.
**/
-EFI_PEI_SERVICES **
+CONST EFI_PEI_SERVICES **
+EFIAPI
GetPeiServicesTablePointer (
VOID
)
@@ -40,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;
+}