REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			322 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Report Status Code Router PEIM which produces Report Stataus Code Handler PPI and Status Code PPI.
 | |
| 
 | |
|   Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "ReportStatusCodeRouterPei.h"
 | |
| 
 | |
| EFI_PEI_RSC_HANDLER_PPI  mRscHandlerPpi = {
 | |
|   Register,
 | |
|   Unregister
 | |
| };
 | |
| 
 | |
| EFI_PEI_PROGRESS_CODE_PPI  mStatusCodePpi = {
 | |
|   ReportDispatcher
 | |
| };
 | |
| 
 | |
| EFI_PEI_PPI_DESCRIPTOR  mRscHandlerPpiList[] = {
 | |
|   {
 | |
|     EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
 | |
|     &gEfiPeiRscHandlerPpiGuid,
 | |
|     &mRscHandlerPpi
 | |
|   }
 | |
| };
 | |
| 
 | |
| EFI_PEI_PPI_DESCRIPTOR  mStatusCodePpiList[] = {
 | |
|   {
 | |
|     EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
 | |
|     &gEfiPeiStatusCodePpiGuid,
 | |
|     &mStatusCodePpi
 | |
|   }
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Worker function to create one memory status code GUID'ed HOB,
 | |
|   using PacketIndex to identify the packet.
 | |
| 
 | |
|   @param   PacketIndex    Index of records packet.
 | |
| 
 | |
|   @return  Pointer to the memory status code packet.
 | |
| 
 | |
| **/
 | |
| UINTN *
 | |
| CreateRscHandlerCallbackPacket (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   UINTN  *NumberOfEntries;
 | |
| 
 | |
|   //
 | |
|   // Build GUID'ed HOB with PCD defined size.
 | |
|   //
 | |
|   NumberOfEntries = BuildGuidHob (
 | |
|                       &gStatusCodeCallbackGuid,
 | |
|                       sizeof (EFI_PEI_RSC_HANDLER_CALLBACK) * 64 + sizeof (UINTN)
 | |
|                       );
 | |
|   ASSERT (NumberOfEntries != NULL);
 | |
| 
 | |
|   *NumberOfEntries = 0;
 | |
| 
 | |
|   return NumberOfEntries;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Register the callback function for ReportStatusCode() notification.
 | |
| 
 | |
|   When this function is called the function pointer is added to an internal list and any future calls to
 | |
|   ReportStatusCode() will be forwarded to the Callback function.
 | |
| 
 | |
|   @param[in] Callback           A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is called
 | |
|                                 when a call to ReportStatusCode() occurs.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Function was successfully registered.
 | |
|   @retval EFI_INVALID_PARAMETER The callback function was NULL.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The internal buffer ran out of space. No more functions can be
 | |
|                                 registered.
 | |
|   @retval EFI_ALREADY_STARTED   The function was already registered. It can't be registered again.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| Register (
 | |
|   IN EFI_PEI_RSC_HANDLER_CALLBACK  Callback
 | |
|   )
 | |
| {
 | |
|   EFI_PEI_HOB_POINTERS          Hob;
 | |
|   EFI_PEI_RSC_HANDLER_CALLBACK  *CallbackEntry;
 | |
|   UINTN                         *NumberOfEntries;
 | |
|   UINTN                         Index;
 | |
|   UINTN                         FreeEntryIndex;
 | |
|   UINTN                         *FreePacket;
 | |
| 
 | |
|   if (Callback == NULL) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Hob.Raw        = GetFirstGuidHob (&gStatusCodeCallbackGuid);
 | |
|   FreePacket     = NULL;
 | |
|   FreeEntryIndex = 0;
 | |
|   while (Hob.Raw != NULL) {
 | |
|     NumberOfEntries = GET_GUID_HOB_DATA (Hob);
 | |
|     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *)(NumberOfEntries + 1);
 | |
|     if ((FreePacket == NULL) && (*NumberOfEntries < 64)) {
 | |
|       //
 | |
|       // If current total number of handlers does not exceed 64, put new handler
 | |
|       // at the last of packet
 | |
|       //
 | |
|       FreePacket     = NumberOfEntries;
 | |
|       FreeEntryIndex = *NumberOfEntries;
 | |
|     }
 | |
| 
 | |
|     for (Index = 0; Index < *NumberOfEntries; Index++) {
 | |
|       if (CallbackEntry[Index] == Callback) {
 | |
|         //
 | |
|         // If the function was already registered. It can't be registered again.
 | |
|         //
 | |
|         return EFI_ALREADY_STARTED;
 | |
|       }
 | |
| 
 | |
|       if ((FreePacket == NULL) && (CallbackEntry[Index] == NULL)) {
 | |
|         //
 | |
|         // If the total number of handlers in current packet is max value 64,
 | |
|         // search an entry with NULL pointer and fill new handler into this entry.
 | |
|         //
 | |
|         FreePacket     = NumberOfEntries;
 | |
|         FreeEntryIndex = Index;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     Hob.Raw = GET_NEXT_HOB (Hob);
 | |
|     Hob.Raw = GetNextGuidHob (&gStatusCodeCallbackGuid, Hob.Raw);
 | |
|   }
 | |
| 
 | |
|   if (FreePacket == NULL) {
 | |
|     FreePacket = CreateRscHandlerCallbackPacket ();
 | |
|   }
 | |
| 
 | |
|   CallbackEntry                 = (EFI_PEI_RSC_HANDLER_CALLBACK *)(FreePacket + 1);
 | |
|   CallbackEntry[FreeEntryIndex] = Callback;
 | |
| 
 | |
|   if (*FreePacket == FreeEntryIndex) {
 | |
|     //
 | |
|     // If new registered callback is added as a new entry in the packet,
 | |
|     // increase the total number of handlers in the packet.
 | |
|     //
 | |
|     *FreePacket += 1;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Remove a previously registered callback function from the notification list.
 | |
| 
 | |
|   ReportStatusCode() messages will no longer be forwarded to the Callback function.
 | |
| 
 | |
|   @param[in] Callback           A pointer to a function of type EFI_PEI_RSC_HANDLER_CALLBACK that is to be
 | |
|                                 unregistered.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function was successfully unregistered.
 | |
|   @retval EFI_INVALID_PARAMETER The callback function was NULL.
 | |
|   @retval EFI_NOT_FOUND         The callback function was not found to be unregistered.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| Unregister (
 | |
|   IN EFI_PEI_RSC_HANDLER_CALLBACK  Callback
 | |
|   )
 | |
| {
 | |
|   EFI_PEI_HOB_POINTERS          Hob;
 | |
|   EFI_PEI_RSC_HANDLER_CALLBACK  *CallbackEntry;
 | |
|   UINTN                         *NumberOfEntries;
 | |
|   UINTN                         Index;
 | |
| 
 | |
|   if (Callback == NULL) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Hob.Raw = GetFirstGuidHob (&gStatusCodeCallbackGuid);
 | |
|   while (Hob.Raw != NULL) {
 | |
|     NumberOfEntries = GET_GUID_HOB_DATA (Hob);
 | |
|     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *)(NumberOfEntries + 1);
 | |
|     for (Index = 0; Index < *NumberOfEntries; Index++) {
 | |
|       if (CallbackEntry[Index] == Callback) {
 | |
|         //
 | |
|         // Set removed entry as NULL.
 | |
|         //
 | |
|         CallbackEntry[Index] = NULL;
 | |
|         return EFI_SUCCESS;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     Hob.Raw = GET_NEXT_HOB (Hob);
 | |
|     Hob.Raw = GetNextGuidHob (&gStatusCodeCallbackGuid, Hob.Raw);
 | |
|   }
 | |
| 
 | |
|   return EFI_NOT_FOUND;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Publishes an interface that allows PEIMs to report status codes.
 | |
| 
 | |
|   This function implements EFI_PEI_PROGRESS_CODE_PPI.ReportStatusCode().
 | |
|   It publishes an interface that allows PEIMs to report status codes.
 | |
| 
 | |
|   @param  PeiServices      An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
 | |
|   @param  CodeType         Indicates the type of status code being reported.
 | |
|   @param  Value            Describes the current status of a hardware or
 | |
|                            software entity. This includes information about the class and
 | |
|                            subclass that is used to classify the entity as well as an operation.
 | |
|                            For progress codes, the operation is the current activity.
 | |
|                            For error codes, it is the exception.For debug codes,it is not defined at this time.
 | |
|   @param  Instance         The enumeration of a hardware or software entity within
 | |
|                            the system. A system may contain multiple entities that match a class/subclass
 | |
|                            pairing. The instance differentiates between them. An instance of 0 indicates
 | |
|                            that instance information is unavailable, not meaningful, or not relevant.
 | |
|                            Valid instance numbers start with 1.
 | |
|   @param  CallerId         This optional parameter may be used to identify the caller.
 | |
|                            This parameter allows the status code driver to apply different rules to
 | |
|                            different callers.
 | |
|   @param  Data             This optional parameter may be used to pass additional data.
 | |
| 
 | |
|   @retval EFI_SUCCESS      The function completed successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| ReportDispatcher (
 | |
|   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 OPTIONAL,
 | |
|   IN CONST EFI_STATUS_CODE_DATA  *Data OPTIONAL
 | |
|   )
 | |
| {
 | |
|   EFI_PEI_HOB_POINTERS          Hob;
 | |
|   EFI_PEI_RSC_HANDLER_CALLBACK  *CallbackEntry;
 | |
|   UINTN                         *NumberOfEntries;
 | |
|   UINTN                         Index;
 | |
| 
 | |
|   Hob.Raw = GetFirstGuidHob (&gStatusCodeCallbackGuid);
 | |
|   while (Hob.Raw != NULL) {
 | |
|     NumberOfEntries = GET_GUID_HOB_DATA (Hob);
 | |
|     CallbackEntry   = (EFI_PEI_RSC_HANDLER_CALLBACK *)(NumberOfEntries + 1);
 | |
|     for (Index = 0; Index < *NumberOfEntries; Index++) {
 | |
|       if (CallbackEntry[Index] != NULL) {
 | |
|         CallbackEntry[Index](
 | |
|                              PeiServices,
 | |
|                              CodeType,
 | |
|                              Value,
 | |
|                              Instance,
 | |
|                              CallerId,
 | |
|                              Data
 | |
|                              );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     Hob.Raw = GET_NEXT_HOB (Hob);
 | |
|     Hob.Raw = GetNextGuidHob (&gStatusCodeCallbackGuid, Hob.Raw);
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Entry point of Status Code PEIM.
 | |
| 
 | |
|   This function is the entry point of this Status Code Router PEIM.
 | |
|   It produces Report Stataus Code Handler PPI and Status Code PPI.
 | |
| 
 | |
|   @param  FileHandle  Handle of the file being invoked.
 | |
|   @param  PeiServices Describes the list of possible PEI Services.
 | |
| 
 | |
|   @retval EFI_SUCESS  The entry point of DXE IPL PEIM executes successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| GenericStatusCodePeiEntry (
 | |
|   IN       EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   IN CONST EFI_PEI_SERVICES     **PeiServices
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                 Status;
 | |
|   EFI_PEI_PPI_DESCRIPTOR     *OldDescriptor;
 | |
|   EFI_PEI_PROGRESS_CODE_PPI  *OldStatusCodePpi;
 | |
| 
 | |
|   CreateRscHandlerCallbackPacket ();
 | |
| 
 | |
|   //
 | |
|   // Install Report Status Code Handler PPI
 | |
|   //
 | |
|   Status = PeiServicesInstallPpi (mRscHandlerPpiList);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // Install Status Code PPI. PI spec specifies that there can be only one instance
 | |
|   // of this PPI in system. So first check if other instance already exists.
 | |
|   // If no other instance exists, then just install the PPI.
 | |
|   // If other instance already exists, then reinstall it.
 | |
|   //
 | |
|   Status = PeiServicesLocatePpi (
 | |
|              &gEfiPeiStatusCodePpiGuid,
 | |
|              0,
 | |
|              &OldDescriptor,
 | |
|              (VOID **)&OldStatusCodePpi
 | |
|              );
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     Status = PeiServicesReInstallPpi (OldDescriptor, mStatusCodePpiList);
 | |
|   } else {
 | |
|     Status = PeiServicesInstallPpi (mStatusCodePpiList);
 | |
|   }
 | |
| 
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |