+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Perf.c\r
-\r
-Abstract:\r
-\r
- Support for performance primitives. \r
-\r
---*/\r
-\r
-#include "Tiano.h"\r
-#include "Pei.h"\r
-#include "PeiLib.h"\r
-#include "PeiHob.h"\r
-\r
-#include EFI_GUID_DEFINITION (PeiPerformanceHob)\r
-\r
-//\r
-// Perfomance HOB data definitions\r
-//\r
-\r
-#define MAX_PEI_PERF_LOG_ENTRIES 28\r
-\r
-//\r
-// Prototype functions\r
-// \r
-EFI_STATUS\r
-GetTimerValue (\r
- OUT UINT64 *TimerValue\r
- );\r
-\r
-\r
-VOID\r
-PeiPerfMeasure (\r
- EFI_PEI_SERVICES **PeiServices,\r
- IN UINT16 *Token,\r
- IN EFI_FFS_FILE_HEADER *FileHeader,\r
- IN BOOLEAN EntryExit,\r
- IN UINT64 Value\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Log a timestamp count.\r
-\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Core Services table\r
- \r
- Token - Pointer to Token Name\r
- \r
- FileHeader - Pointer to the file header\r
-\r
- EntryExit - Indicates start or stop measurement\r
-\r
- Value - The start time or the stop time\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HOB_GUID_TYPE *Hob;\r
- EFI_HOB_GUID_DATA_PERFORMANCE_LOG *PerfHobData;\r
- PEI_PERFORMANCE_MEASURE_LOG_ENTRY *Log;\r
- EFI_PEI_PPI_DESCRIPTOR *PerfHobDescriptor;\r
- UINT64 TimeCount;\r
- INTN Index;\r
- UINTN Index2;\r
- EFI_GUID *Guid;\r
- EFI_GUID *CheckGuid;\r
-\r
- TimeCount = 0;\r
- //\r
- // Get the END time as early as possible to make it more accurate.\r
- //\r
- if (EntryExit) {\r
- GetTimerValue (&TimeCount);\r
- }\r
-\r
- //\r
- // Locate the Pei Performance Log Hob.\r
- //\r
- Status = (*PeiServices)->LocatePpi (\r
- PeiServices,\r
- &gEfiPeiPerformanceHobGuid,\r
- 0,\r
- &PerfHobDescriptor,\r
- NULL\r
- );\r
-\r
- //\r
- // If the Performance Hob was not found, build and install one.\r
- //\r
- if (EFI_ERROR(Status)) {\r
- Status = PeiBuildHobGuid (\r
- PeiServices,\r
- &gEfiPeiPerformanceHobGuid,\r
- (sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG) +\r
- ((MAX_PEI_PERF_LOG_ENTRIES-1) * \r
- sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY)) +\r
- sizeof(EFI_PEI_PPI_DESCRIPTOR)\r
- ),\r
- &Hob\r
- );\r
- ASSERT_PEI_ERROR(PeiServices, Status);\r
-\r
- PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(Hob+1);\r
- PerfHobData->NumberOfEntries = 0;\r
-\r
- PerfHobDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)((UINT8 *)(PerfHobData+1) +\r
- (sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
- (MAX_PEI_PERF_LOG_ENTRIES-1)\r
- )\r
- );\r
- PerfHobDescriptor->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);\r
- PerfHobDescriptor->Guid = &gEfiPeiPerformanceHobGuid;\r
- PerfHobDescriptor->Ppi = NULL;\r
-\r
- (*PeiServices)->InstallPpi (\r
- PeiServices,\r
- PerfHobDescriptor\r
- );\r
- }\r
-\r
- PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(((UINT8 *)(PerfHobDescriptor)) -\r
- ((sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
- (MAX_PEI_PERF_LOG_ENTRIES-1)\r
- )\r
- + sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG)\r
- )\r
- );\r
-\r
- if (PerfHobData->NumberOfEntries >= MAX_PEI_PERF_LOG_ENTRIES) {\r
- return;\r
- }\r
-\r
- if (!EntryExit) {\r
- Log = &(PerfHobData->Log[PerfHobData->NumberOfEntries]);\r
- (*PeiServices)->SetMem (Log, sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY), 0);\r
-\r
- //\r
- // If not NULL pointer, copy the file name\r
- //\r
- if (FileHeader != NULL) {\r
- Log->Name = FileHeader->Name;\r
- }\r
-\r
- //\r
- // Copy the description string\r
- //\r
- (*PeiServices)->CopyMem (\r
- &(Log->DescriptionString), \r
- Token,\r
- (PEI_PERF_MAX_DESC_STRING-1) * sizeof(UINT16)\r
- );\r
-\r
- //\r
- // Get the start time as late as possible to make it more accurate.\r
- //\r
- GetTimerValue (&TimeCount);\r
-\r
- //\r
- // Record the time stamp.\r
- //\r
- if (Value != 0) {\r
- Log->StartTimeCount = Value;\r
- } else {\r
- Log->StartTimeCount = TimeCount;\r
- }\r
- Log->StopTimeCount = 0;\r
-\r
- //\r
- // Increment the number of valid log entries.\r
- //\r
- PerfHobData->NumberOfEntries++;\r
-\r
- } else {\r
-\r
- for (Index = PerfHobData->NumberOfEntries-1; Index >= 0; Index--) {\r
- Log = NULL;\r
- for (Index2 = 0; Index2 < PEI_PERF_MAX_DESC_STRING; Index2++) {\r
- if (PerfHobData->Log[Index].DescriptionString[Index2] == 0) {\r
- Log = &(PerfHobData->Log[Index]);\r
- break;\r
- }\r
- if (PerfHobData->Log[Index].DescriptionString[Index2] !=\r
- Token[Index2]) {\r
- break;\r
- }\r
- }\r
- if (Log != NULL) {\r
- if (FileHeader != NULL) {\r
- Guid = &(Log->Name);\r
- CheckGuid = &(FileHeader->Name);\r
- if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
- (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
- (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
- (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {\r
- if (Value != 0) {\r
- Log->StopTimeCount = Value;\r
- } else {\r
- Log->StopTimeCount = TimeCount;\r
- }\r
- break;\r
- }\r
- } else {\r
- if (Value != 0) {\r
- Log->StopTimeCount = Value;\r
- } else {\r
- Log->StopTimeCount = TimeCount;\r
- }\r
- break;\r
- }\r
- }\r
- }\r
- \r
- }\r
-\r
- return;\r
-}\r