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>
		
			
				
	
	
		
			165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   This module collects performance data for MM driver boot records and S3 Suspend Performance Record.
 | |
| 
 | |
|   This module registers report status code listener to collect performance data
 | |
|   for MM driver boot records and S3 Suspend Performance Record.
 | |
| 
 | |
|   Caution: This module requires additional review when modified.
 | |
|   This driver will have external input - communicate buffer in MM mode.
 | |
|   This external input must be validated carefully to avoid security issue like
 | |
|   buffer overflow, integer overflow.
 | |
| 
 | |
|   FpdtSmiHandler() will receive untrusted input and do basic validation.
 | |
| 
 | |
|   Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <PiMm.h>
 | |
| 
 | |
| #include <Protocol/MmReportStatusCodeHandler.h>
 | |
| 
 | |
| #include <Guid/FirmwarePerformance.h>
 | |
| 
 | |
| #include <Library/MmServicesTableLib.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/TimerLib.h>
 | |
| #include <Library/LockBoxLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include "FirmwarePerformanceCommon.h"
 | |
| 
 | |
| EFI_MM_RSC_HANDLER_PROTOCOL  *mRscHandlerProtocol   = NULL;
 | |
| UINT64                       mSuspendStartTime      = 0;
 | |
| BOOLEAN                      mS3SuspendLockBoxSaved = FALSE;
 | |
| 
 | |
| /**
 | |
|   Report status code listener for MM. This is used to record the performance
 | |
|   data for S3 Suspend Start and S3 Suspend End in FPDT.
 | |
| 
 | |
|   @param[in]  CodeType            Indicates the type of status code being reported.
 | |
|   @param[in]  Value               Describes the current status of a hardware or software entity.
 | |
|                                   This included information about the class and subclass that is used to
 | |
|                                   classify the entity as well as an operation.
 | |
|   @param[in]  Instance            The enumeration of a hardware or software entity within
 | |
|                                   the system. Valid instance numbers start with 1.
 | |
|   @param[in]  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[in]  Data                This optional parameter may be used to pass additional data.
 | |
| 
 | |
|   @retval EFI_SUCCESS             Status code is what we expected.
 | |
|   @retval EFI_UNSUPPORTED         Status code not supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FpdtStatusCodeListenerMm (
 | |
|   IN EFI_STATUS_CODE_TYPE   CodeType,
 | |
|   IN EFI_STATUS_CODE_VALUE  Value,
 | |
|   IN UINT32                 Instance,
 | |
|   IN EFI_GUID               *CallerId,
 | |
|   IN EFI_STATUS_CODE_DATA   *Data
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                           Status;
 | |
|   UINT64                               CurrentTime;
 | |
|   EFI_ACPI_5_0_FPDT_S3_SUSPEND_RECORD  S3SuspendRecord;
 | |
| 
 | |
|   //
 | |
|   // Check whether status code is what we are interested in.
 | |
|   //
 | |
|   if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) != EFI_PROGRESS_CODE) {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   if ((Data != NULL) && CompareGuid (&Data->Type, &gEfiFirmwarePerformanceGuid)) {
 | |
|     DEBUG ((DEBUG_ERROR, "FpdtStatusCodeListenerMm: Performance data reported through gEfiFirmwarePerformanceGuid will not be collected by FirmwarePerformanceDataTableMm\n"));
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   if ((Value != PcdGet32 (PcdProgressCodeS3SuspendStart)) &&
 | |
|       (Value != PcdGet32 (PcdProgressCodeS3SuspendEnd)))
 | |
|   {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Retrieve current time.
 | |
|   //
 | |
|   CurrentTime = GetTimeInNanoSecond (GetPerformanceCounter ());
 | |
| 
 | |
|   if (Value == PcdGet32 (PcdProgressCodeS3SuspendStart)) {
 | |
|     //
 | |
|     // S3 Suspend started, record the performance data and return.
 | |
|     //
 | |
|     mSuspendStartTime = CurrentTime;
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // We are going to S3 sleep, record S3 Suspend End performance data.
 | |
|   //
 | |
|   S3SuspendRecord.SuspendStart = mSuspendStartTime;
 | |
|   S3SuspendRecord.SuspendEnd   = CurrentTime;
 | |
| 
 | |
|   //
 | |
|   // Save S3 suspend performance data to lock box, it will be used by Firmware Performance PEIM.
 | |
|   //
 | |
|   if (!mS3SuspendLockBoxSaved) {
 | |
|     Status = SaveLockBox (
 | |
|                &gEfiFirmwarePerformanceGuid,
 | |
|                &S3SuspendRecord,
 | |
|                sizeof (EFI_ACPI_5_0_FPDT_S3_SUSPEND_RECORD)
 | |
|                );
 | |
|     ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|     mS3SuspendLockBoxSaved = TRUE;
 | |
|   } else {
 | |
|     Status = UpdateLockBox (
 | |
|                &gEfiFirmwarePerformanceGuid,
 | |
|                0,
 | |
|                &S3SuspendRecord,
 | |
|                sizeof (EFI_ACPI_5_0_FPDT_S3_SUSPEND_RECORD)
 | |
|                );
 | |
|     ASSERT_EFI_ERROR (Status);
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   The module Entry Point of the Firmware Performance Data Table MM driver.
 | |
| 
 | |
|   @retval EFI_SUCCESS    The entry point is executed successfully.
 | |
|   @retval Other          Some error occurs when executing this entry point.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| FirmwarePerformanceCommonEntryPoint (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   //
 | |
|   // Get MM Report Status Code Handler Protocol.
 | |
|   //
 | |
|   Status = gMmst->MmLocateProtocol (
 | |
|                     &gEfiMmRscHandlerProtocolGuid,
 | |
|                     NULL,
 | |
|                     (VOID **)&mRscHandlerProtocol
 | |
|                     );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // Register report status code listener for BootRecords and S3 Suspend Start and End.
 | |
|   //
 | |
|   Status = mRscHandlerProtocol->Register (FpdtStatusCodeListenerMm);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   return Status;
 | |
| }
 |