mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 07:10:07 +00:00 
			
		
		
		
	REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3893 1.Added EFIAPI to FspNotifyPhasePeimEntryPoint, SwapStack and PEI_CORE_ENTRY. 2.Treat both MAX_ADDRESS and MAX_UINT32 as invalid address for FSP global data in FspApiCallingCheck(). 3.Changed AsmReadEsp to AsmReadStackPointer. 4.Changed the type of the return value of AsmReadStackPointer from UINT32 to UINTN. 5.Changed the type of TemporaryMemoryBase, PermenentMemoryBase and BootLoaderStack from UINT32 to UINTN. 6.Some type casting to pointers are UINT32. Changed them to UINTN to accommodate both IA32 and X64. 7.Corrected some typos. Cc: Chasel Chiu <chasel.chiu@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Ashraf Ali S <ashraf.ali.s@intel.com> Signed-off-by: Ted Kuo <ted.kuo@intel.com> Reviewed-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Source file for FSP notify phase PEI module
 | 
						|
 | 
						|
  Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#include "FspNotifyPhasePeim.h"
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
   This function waits for FSP notify.
 | 
						|
 | 
						|
   @param This          Entry point for DXE IPL PPI.
 | 
						|
   @param PeiServices   General purpose services available to every PEIM.
 | 
						|
   @param HobList       Address to the Pei HOB list.
 | 
						|
 | 
						|
   @return EFI_SUCCESS              This function never returns.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
WaitForNotify (
 | 
						|
  IN CONST EFI_DXE_IPL_PPI  *This,
 | 
						|
  IN EFI_PEI_SERVICES       **PeiServices,
 | 
						|
  IN EFI_PEI_HOB_POINTERS   HobList
 | 
						|
  );
 | 
						|
 | 
						|
CONST EFI_DXE_IPL_PPI  mDxeIplPpi = {
 | 
						|
  WaitForNotify
 | 
						|
};
 | 
						|
 | 
						|
CONST EFI_PEI_PPI_DESCRIPTOR  mInstallDxeIplPpi = {
 | 
						|
  EFI_PEI_PPI_DESCRIPTOR_PPI,
 | 
						|
  &gEfiDxeIplPpiGuid,
 | 
						|
  (VOID *)&mDxeIplPpi
 | 
						|
};
 | 
						|
 | 
						|
CONST EFI_PEI_PPI_DESCRIPTOR  gEndOfPeiSignalPpi = {
 | 
						|
  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
 | 
						|
  &gEfiEndOfPeiSignalPpiGuid,
 | 
						|
  NULL
 | 
						|
};
 | 
						|
 | 
						|
CONST EFI_PEI_PPI_DESCRIPTOR  gFspReadyForNotifyPhasePpi = {
 | 
						|
  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
 | 
						|
  &gFspReadyForNotifyPhasePpiGuid,
 | 
						|
  NULL
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
   This function waits for FSP notify.
 | 
						|
 | 
						|
   @param This          Entry point for DXE IPL PPI.
 | 
						|
   @param PeiServices   General purpose services available to every PEIM.
 | 
						|
   @param HobList       Address to the Pei HOB list.
 | 
						|
 | 
						|
   @return EFI_SUCCESS              This function never returns.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
WaitForNotify (
 | 
						|
  IN CONST EFI_DXE_IPL_PPI  *This,
 | 
						|
  IN EFI_PEI_SERVICES       **PeiServices,
 | 
						|
  IN EFI_PEI_HOB_POINTERS   HobList
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP HOB is located at 0x%08X\n", HobList));
 | 
						|
 | 
						|
  //
 | 
						|
  // End of PEI phase signal
 | 
						|
  //
 | 
						|
  Status = PeiServicesInstallPpi (&gEndOfPeiSignalPpi);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  //
 | 
						|
  // Give control back to BootLoader after FspSiliconInit
 | 
						|
  //
 | 
						|
  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP is waiting for NOTIFY\n"));
 | 
						|
  FspSiliconInitDone2 (EFI_SUCCESS);
 | 
						|
 | 
						|
  //
 | 
						|
  // BootLoader called FSP again through NotifyPhase
 | 
						|
  //
 | 
						|
  FspWaitForNotify ();
 | 
						|
 | 
						|
  if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {
 | 
						|
    //
 | 
						|
    // Should not come here
 | 
						|
    //
 | 
						|
    while (TRUE) {
 | 
						|
      DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n"));
 | 
						|
      SetFspApiReturnStatus (EFI_UNSUPPORTED);
 | 
						|
      Pei2LoaderSwitchStack ();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  FSP notify phase PEI module entry point
 | 
						|
 | 
						|
  @param[in]  FileHandle           Not used.
 | 
						|
  @param[in]  PeiServices          General purpose services available to every PEIM.
 | 
						|
 | 
						|
  @retval     EFI_SUCCESS          The function completes successfully
 | 
						|
  @retval     EFI_OUT_OF_RESOURCES Insufficient resources to create database
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FspNotifyPhasePeimEntryPoint (
 | 
						|
  IN       EFI_PEI_FILE_HANDLE  FileHandle,
 | 
						|
  IN CONST EFI_PEI_SERVICES     **PeiServices
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  VOID                    *OldDxeIplPpi;
 | 
						|
  EFI_PEI_PPI_DESCRIPTOR  *OldDescriptor;
 | 
						|
 | 
						|
  DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n"));
 | 
						|
 | 
						|
  if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) {
 | 
						|
    //
 | 
						|
    // Locate old DXE IPL PPI
 | 
						|
    //
 | 
						|
    Status = PeiServicesLocatePpi (
 | 
						|
               &gEfiDxeIplPpiGuid,
 | 
						|
               0,
 | 
						|
               &OldDescriptor,
 | 
						|
               &OldDxeIplPpi
 | 
						|
               );
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
    //
 | 
						|
    // Re-install the DXE IPL PPI to wait for notify
 | 
						|
    //
 | 
						|
    Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi);
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
  } else {
 | 
						|
    Status = PeiServicesInstallPpi (&gFspReadyForNotifyPhasePpi);
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |