summaryrefslogtreecommitdiff
path: root/EdkModulePkg
diff options
context:
space:
mode:
Diffstat (limited to 'EdkModulePkg')
-rw-r--r--EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c165
-rw-r--r--EdkModulePkg/Core/Dxe/Hand/locate.c12
-rw-r--r--EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c7
-rw-r--r--EdkModulePkg/EdkModulePkg.spd4
-rw-r--r--EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c56
-rw-r--r--EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c228
-rw-r--r--EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd29
-rw-r--r--EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa60
-rw-r--r--EdkModulePkg/Library/DxePerformanceLib/build.xml47
-rw-r--r--EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c330
-rw-r--r--EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd29
-rw-r--r--EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa59
-rw-r--r--EdkModulePkg/Library/PeiPerformanceLib/build.xml47
-rw-r--r--EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_bc_udp.c7
-rw-r--r--EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_loadfile.c137
-rw-r--r--EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Run.c11
16 files changed, 980 insertions, 248 deletions
diff --git a/EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c b/EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c
index 006cc73bcb..88c4c3aec8 100644
--- a/EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c
+++ b/EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c
@@ -874,43 +874,34 @@ Returns:
&InquiryDataLength,
FALSE
);
- switch (Status) {
- //
- // no need to check HostAdapterStatus and TargetStatus
- //
- case EFI_SUCCESS:
- case EFI_WARN_BUFFER_TOO_SMALL:
+ if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
ParseInquiryData (ScsiDiskDevice);
return EFI_SUCCESS;
-
- case EFI_NOT_READY:
+ } else if (Status == EFI_NOT_READY) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_INVALID_PARAMETER:
- case EFI_UNSUPPORTED:
+ } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
-
+ }
//
// go ahead to check HostAdapterStatus and TargetStatus
// (EFI_TIMEOUT, EFI_DEVICE_ERROR)
//
- default:
- break;
- }
-
Status = CheckHostAdapterStatus (HostAdapterStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_TIMEOUT:
- case EFI_NOT_READY:
+ if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
//
// reset the scsi channel
//
@@ -920,19 +911,14 @@ Returns:
}
Status = CheckTargetStatus (TargetStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_NOT_READY:
+ if (Status == EFI_NOT_READY) {
//
// reset the scsi device
//
ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
}
@@ -1022,37 +1008,27 @@ ScsiDiskTestUnitReady (
&HostAdapterStatus,
&TargetStatus
);
- switch (Status) {
- //
- // no need to check HostAdapterStatus and TargetStatus
- //
- case EFI_NOT_READY:
+ if (Status == EFI_NOT_READY) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_INVALID_PARAMETER:
- case EFI_UNSUPPORTED:
+ } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
-
+ }
//
// go ahead to check HostAdapterStatus and TargetStatus
//
- default:
- break;
- }
-
Status = CheckHostAdapterStatus (HostAdapterStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_TIMEOUT:
- case EFI_NOT_READY:
+ if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
//
// reset the scsi channel
//
@@ -1062,19 +1038,14 @@ ScsiDiskTestUnitReady (
}
Status = CheckTargetStatus (TargetStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_NOT_READY:
+ if (Status == EFI_NOT_READY) {
//
// reset the scsi device
//
ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
}
@@ -1258,42 +1229,35 @@ Returns:
&DataLength,
FALSE
);
- switch (CommandStatus) {
- //
- // no need to check HostAdapterStatus and TargetStatus
- //
- case EFI_SUCCESS:
+ if (CommandStatus == EFI_SUCCESS) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
GetMediaInfo (ScsiDiskDevice, &CapacityData);
return EFI_SUCCESS;
-
- case EFI_NOT_READY:
+ } else if (CommandStatus == EFI_NOT_READY) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_INVALID_PARAMETER:
- case EFI_UNSUPPORTED:
+ } else if ((CommandStatus == EFI_INVALID_PARAMETER) || (CommandStatus == EFI_UNSUPPORTED)) {
+ //
+ // no need to check HostAdapterStatus and TargetStatus
+ //
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
-
+ }
//
// go ahead to check HostAdapterStatus and TargetStatus
// (EFI_TIMEOUT, EFI_DEVICE_ERROR, EFI_WARN_BUFFER_TOO_SMALL)
//
- default:
- break;
- }
-
+
Status = CheckHostAdapterStatus (HostAdapterStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_TIMEOUT:
- case EFI_NOT_READY:
+ if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
//
// reset the scsi channel
//
@@ -1303,19 +1267,14 @@ Returns:
}
Status = CheckTargetStatus (TargetStatus);
- switch (Status) {
- case EFI_SUCCESS:
- break;
-
- case EFI_NOT_READY:
+ if (Status == EFI_NOT_READY) {
//
// reset the scsi device
//
ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
*NeedRetry = TRUE;
return EFI_DEVICE_ERROR;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
*NeedRetry = FALSE;
return EFI_DEVICE_ERROR;
}
@@ -1506,40 +1465,20 @@ ScsiDiskRequestSenseKeys (
&HostAdapterStatus,
&TargetStatus
);
- switch (Status) {
-
- case EFI_SUCCESS:
-
- //
- // fall through
- //
- case EFI_WARN_BUFFER_TOO_SMALL:
+ if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {
FallStatus = EFI_SUCCESS;
- break;
-
- case EFI_TIMEOUT:
-
- //
- // fall through
- //
- case EFI_NOT_READY:
+ } else if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {
*NeedRetry = TRUE;
FallStatus = EFI_DEVICE_ERROR;
- break;
-
- case EFI_INVALID_PARAMETER:
- case EFI_UNSUPPORTED:
+ } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {
*NeedRetry = FALSE;
FallStatus = EFI_DEVICE_ERROR;
- break;
-
- case EFI_DEVICE_ERROR:
+ } else if (Status == EFI_DEVICE_ERROR) {
if (AskResetIfError) {
ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
}
FallStatus = EFI_DEVICE_ERROR;
- break;
}
if (EFI_ERROR (FallStatus)) {
diff --git a/EdkModulePkg/Core/Dxe/Hand/locate.c b/EdkModulePkg/Core/Dxe/Hand/locate.c
index faa4255c7e..54d72c30a2 100644
--- a/EdkModulePkg/Core/Dxe/Hand/locate.c
+++ b/EdkModulePkg/Core/Dxe/Hand/locate.c
@@ -702,15 +702,11 @@ Returns:
//
// Add code to correctly handle expected errors from CoreLocateHandle().
//
- if (EFI_ERROR(Status)) {
- switch (Status) {
- case EFI_BUFFER_TOO_SMALL:
- break;
- case EFI_INVALID_PARAMETER:
- return Status;
- default:
- return EFI_NOT_FOUND;
+ if (EFI_ERROR(Status) && Status != EFI_BUFFER_TOO_SMALL) {
+ if (Status != EFI_INVALID_PARAMETER) {
+ Status = EFI_NOT_FOUND;
}
+ return Status;
}
*Buffer = CoreAllocateBootServicesPool (BufferSize);
diff --git a/EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c
index 0bec576e6d..1eb5a4a020 100644
--- a/EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c
+++ b/EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c
@@ -448,12 +448,7 @@ Returns:
// Check if the total number of PEIMs exceed the bitmap.
// CurrentPeim is 0-based
//
- DEBUG_CODE (
- if (CurrentPeim > (sizeof (*DispatchedPeimBitMap) * 8 - 1)) {
- ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
- }
- );
-
+ ASSERT (CurrentPeim < (sizeof (*DispatchedPeimBitMap) * 8));
*DispatchedPeimBitMap |= (1 << CurrentPeim);
return;
}
diff --git a/EdkModulePkg/EdkModulePkg.spd b/EdkModulePkg/EdkModulePkg.spd
index da00472ce2..e2b9542e65 100644
--- a/EdkModulePkg/EdkModulePkg.spd
+++ b/EdkModulePkg/EdkModulePkg.spd
@@ -172,7 +172,7 @@
<Filename>Library/EdkDxePeCoffLoaderFromHobLib/EdkDxePeCoffLoaderFromHobLib.msa</Filename>
</MsaFile>
<MsaFile>
- <Filename>Library/EdkDxePerformanceLib/EdkDxePerformanceLib.msa</Filename>
+ <Filename>Library/DxePerformanceLib/DxePerformanceLib.msa</Filename>
</MsaFile>
<MsaFile>
<Filename>Library/EdkDxePrintLib/EdkDxePrintLib.msa</Filename>
@@ -208,7 +208,7 @@
<Filename>Library/EdkPeCoffLoaderX64Lib/EdkPeCoffLoaderX64Lib.msa</Filename>
</MsaFile>
<MsaFile>
- <Filename>Library/EdkPeiPerformanceLib/EdkPeiPerformanceLib.msa</Filename>
+ <Filename>Library/PeiPerformanceLib/PeiPerformanceLib.msa</Filename>
</MsaFile>
<MsaFile>
<Filename>Library/EdkRuntimeStatusCodeLib/BsDataHubStatusCode/BsDataHubStatusCode.msa</Filename>
diff --git a/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c b/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c
index c75ab851f7..e4e7b3bb3b 100644
--- a/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c
+++ b/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c
@@ -532,34 +532,46 @@ EndPerformanceMeasurement (
}
/**
- Retrieves a previously logged performance measurement.
+ Attempts to retrieve a performance measurement log entry from the performance measurement log.
- Retrieves the performance log entry from the performance log
- that immediately follows the log entry specified by LogEntryKey.
- If LogEntryKey is zero, then the first entry from the performance log is returned.
- If the log entry specified by LogEntryKey is the last entry in the performance log,
- then 0 is returned. Otherwise, the performance log entry is returned in Handle,
- Token, Module, StartTimeStamp, and EndTimeStamp.
- The key for the current performance log entry is returned.
-
- @param LogEntryKey The key for the previous performance measurement log entry.
- If 0, then the first performance measurement log entry is retrieved.
- @param Handle Pointer to environment specific context used
- to identify the component being measured.
- @param Token Pointer to a Null-terminated ASCII string
- that identifies the component being measured.
- @param Module Pointer to a Null-terminated ASCII string
- that identifies the module being measured.
- @param StartTimeStamp The 64-bit time stamp that was recorded when the measurement was started.
- @param EndTimeStamp The 64-bit time stamp that was recorded when the measurement was ended.
-
- @return The key for the current performance log entry.
+ Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is
+ zero on entry, then an attempt is made to retrieve the first entry from the performance log,
+ and the key for the second entry in the log is returned. If the performance log is empty,
+ then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance
+ log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is
+ returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is
+ retrieved and an implementation specific non-zero key value that specifies the end of the performance
+ log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry
+ is retrieved and zero is returned. In the cases where a performance log entry can be returned,
+ the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp.
+ If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT().
+ If Handle is NULL, then ASSERT().
+ If Token is NULL, then ASSERT().
+ If Module is NULL, then ASSERT().
+ If StartTimeStamp is NULL, then ASSERT().
+ If EndTimeStamp is NULL, then ASSERT().
+
+ @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve.
+ 0, then the first performance measurement log entry is retrieved.
+ On exit, the key of the next performance lof entry entry.
+ @param Handle Pointer to environment specific context used to identify the component
+ being measured.
+ @param Token Pointer to a Null-terminated ASCII string that identifies the component
+ being measured.
+ @param Module Pointer to a Null-terminated ASCII string that identifies the module
+ being measured.
+ @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was started.
+ @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was ended.
+
+ @return The key for the next performance log entry (in general case).
**/
UINTN
EFIAPI
GetPerformanceMeasurement (
- UINTN LogEntryKey,
+ IN UINTN LogEntryKey,
OUT CONST VOID **Handle,
OUT CONST CHAR8 **Token,
OUT CONST CHAR8 **Module,
diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c
new file mode 100644
index 0000000000..8a3ac4053f
--- /dev/null
+++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c
@@ -0,0 +1,228 @@
+/*++
+
+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
+
+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:
+
+ DxePerformanceLib.c
+
+Abstract:
+
+ Performance Library
+
+--*/
+
+STATIC PERFORMANCE_PROTOCOL *mPerformance = NULL;
+
+/**
+ The constructor function caches the pointer to Performance protocol.
+
+ The constructor function locates Performance protocol from protocol database.
+ It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+PerformanceLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (&gPerformanceProtocolGuid, NULL, (VOID **) &mPerformance);
+ ASSERT_EFI_ERROR (Status);
+ ASSERT (mPerformance != NULL);
+
+ return Status;
+}
+
+/**
+ Creates a record for the beginning of a performance measurement.
+
+ Creates a record that contains the Handle, Token, and Module.
+ If TimeStamp is not zero, then TimeStamp is added to the record as the start time.
+ If TimeStamp is zero, then this function reads the current time stamp
+ and adds that time stamp value to the record as the start time.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+ @param TimeStamp 64-bit time stamp.
+
+ @retval RETURN_SUCCESS The start of the measurement was recorded.
+ @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record the measurement.
+
+**/
+RETURN_STATUS
+EFIAPI
+StartPerformanceMeasurement (
+ IN CONST VOID *Handle, OPTIONAL
+ IN CONST CHAR8 *Token, OPTIONAL
+ IN CONST CHAR8 *Module, OPTIONAL
+ IN UINT64 TimeStamp
+ )
+{
+ EFI_STATUS Status;
+
+ Status = mPerformance->StartGauge (Handle, Token, Module, TimeStamp);
+
+ return (RETURN_STATUS) Status;
+}
+
+/**
+ Fills in the end time of a performance measurement.
+
+ Looks up the record that matches Handle, Token, and Module.
+ If the record can not be found then return RETURN_NOT_FOUND.
+ If the record is found and TimeStamp is not zero,
+ then TimeStamp is added to the record as the end time.
+ If the record is found and TimeStamp is zero, then this function reads
+ the current time stamp and adds that time stamp value to the record as the end time.
+ If this function is called multiple times for the same record, then the end time is overwritten.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+ @param TimeStamp 64-bit time stamp.
+
+ @retval RETURN_SUCCESS The end of the measurement was recorded.
+ @retval RETURN_NOT_FOUND The specified measurement record could not be found.
+
+**/
+RETURN_STATUS
+EFIAPI
+EndPerformanceMeasurement (
+ IN CONST VOID *Handle, OPTIONAL
+ IN CONST CHAR8 *Token, OPTIONAL
+ IN CONST CHAR8 *Module, OPTIONAL
+ IN UINT64 TimeStamp
+ )
+{
+ EFI_STATUS Status;
+
+ Status = mPerformance->EndGauge (Handle, Token, Module, TimeStamp);
+
+ return (RETURN_STATUS) Status;
+}
+
+/**
+ Attempts to retrieve a performance measurement log entry from the performance measurement log.
+
+ Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is
+ zero on entry, then an attempt is made to retrieve the first entry from the performance log,
+ and the key for the second entry in the log is returned. If the performance log is empty,
+ then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance
+ log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is
+ returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is
+ retrieved and an implementation specific non-zero key value that specifies the end of the performance
+ log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry
+ is retrieved and zero is returned. In the cases where a performance log entry can be returned,
+ the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp.
+ If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT().
+ If Handle is NULL, then ASSERT().
+ If Token is NULL, then ASSERT().
+ If Module is NULL, then ASSERT().
+ If StartTimeStamp is NULL, then ASSERT().
+ If EndTimeStamp is NULL, then ASSERT().
+
+ @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve.
+ 0, then the first performance measurement log entry is retrieved.
+ On exit, the key of the next performance lof entry entry.
+ @param Handle Pointer to environment specific context used to identify the component
+ being measured.
+ @param Token Pointer to a Null-terminated ASCII string that identifies the component
+ being measured.
+ @param Module Pointer to a Null-terminated ASCII string that identifies the module
+ being measured.
+ @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was started.
+ @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was ended.
+
+ @return The key for the next performance log entry (in general case).
+
+**/
+UINTN
+EFIAPI
+GetPerformanceMeasurement (
+ IN UINTN LogEntryKey,
+ OUT CONST VOID **Handle,
+ OUT CONST CHAR8 **Token,
+ OUT CONST CHAR8 **Module,
+ OUT UINT64 *StartTimeStamp,
+ OUT UINT64 *EndTimeStamp
+ )
+{
+ EFI_STATUS Status;
+ GAUGE_DATA_ENTRY *GaugeData;
+
+ ASSERT (Handle != NULL);
+ ASSERT (Token != NULL);
+ ASSERT (Module != NULL);
+ ASSERT (StartTimeStamp != NULL);
+ ASSERT (EndTimeStamp != NULL);
+
+ Status = mPerformance->GetGauge (LogEntryKey++, &GaugeData);
+
+ //
+ // Make sure that LogEntryKey is a valid log entry key,
+ //
+ ASSERT (Status != EFI_INVALID_PARAMETER);
+
+ if (EFI_ERROR (Status)) {
+ //
+ // The LogEntryKey is the last entry (equals to the total entry number).
+ //
+ return 0;
+ }
+
+ ASSERT (GaugeData != NULL);
+
+ *Handle = (VOID *) (UINTN) GaugeData->Handle;
+ *Token = GaugeData->Token;
+ *Module = GaugeData->Module;
+ *StartTimeStamp = GaugeData->StartTimeStamp;
+ *EndTimeStamp = GaugeData->EndTimeStamp;
+
+ return LogEntryKey;
+}
+
+/**
+ Returns TRUE if the performance measurement macros are enabled.
+
+ This function returns TRUE if the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is set. Otherwise FALSE is returned.
+
+ @retval TRUE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is set.
+ @retval FALSE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+PerformanceMeasurementEnabled (
+ VOID
+ )
+{
+ return ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0);
+}
diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd
new file mode 100644
index 0000000000..1d8df5409b
--- /dev/null
+++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<LibraryModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MbdLibHeader>
+ <BaseName>DxePerformanceLib</BaseName>
+ <Guid>8B8B4CCC-65FC-41a5-8067-308B8E42CCF2</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
+ <License>
+ 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
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ </License>
+ <Created>2006-04-04 11:11</Created>
+ </MbdLibHeader>
+</LibraryModuleBuildDescription>
diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa
new file mode 100644
index 0000000000..d8696f24e7
--- /dev/null
+++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<LibraryModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MsaLibHeader>
+ <BaseName>DxePerformanceLib</BaseName>
+ <ModuleType>DXE_DRIVER</ModuleType>
+ <ComponentType>LIBRARY</ComponentType>
+ <Guid>8B8B4CCC-65FC-41a5-8067-308B8E42CCF2</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Abstract>Memory-only library functions with no library constructor/destructor</Abstract>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
+ <License>
+ 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
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ </License>
+ <Created>2006-04-04 11:11</Created>
+ <Specification>EFI_SPECIFICATION_VERSION 0x00000000</Specification>
+ </MsaLibHeader>
+ <LibraryClassDefinitions>
+ <LibraryClass Usage="ALWAYS_PRODUCED">PerformanceLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">DebugLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">UefiBootServicesTableLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">TimerLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PcdLib</LibraryClass>
+ </LibraryClassDefinitions>
+ <SourceFiles>
+ <Filename>DxePerformanceLib.c</Filename>
+ </SourceFiles>
+ <Includes>
+ <PackageName>MdePkg</PackageName>
+ <PackageName>EdkModulePkg</PackageName>
+ </Includes>
+ <Protocols>
+ <Protocol Usage="ALWAYS_CONSUMED">Performance</Protocol>
+ </Protocols>
+ <Externs>
+ <Extern>
+ <Constructor>PerformanceLibConstructor</Constructor>
+ </Extern>
+ </Externs>
+ <PcdCoded>
+ <PcdEntry PcdItemType="FIXED_AT_BUILD">
+ <C_Name>PcdPerformanceLibraryPropertyMask</C_Name>
+ </PcdEntry>
+ </PcdCoded>
+</LibraryModuleSurfaceArea>
diff --git a/EdkModulePkg/Library/DxePerformanceLib/build.xml b/EdkModulePkg/Library/DxePerformanceLib/build.xml
new file mode 100644
index 0000000000..a663483133
--- /dev/null
+++ b/EdkModulePkg/Library/DxePerformanceLib/build.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?><!-- 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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
+<project basedir="." default="DxePerformanceLib"><!--Apply external ANT tasks-->
+ <taskdef resource="GenBuild.tasks"/>
+ <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+ <property environment="env"/>
+ <property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
+ <import file="${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
+ <property name="MODULE_RELATIVE_PATH" value="Library/DxePerformanceLib"/>
+ <property name="MODULE_DIR" value="${PACKAGE_DIR}/${MODULE_RELATIVE_PATH}"/>
+ <property name="COMMON_FILE" value="${WORKSPACE_DIR}/Tools/Conf/Common.xml"/>
+ <target name="DxePerformanceLib">
+ <GenBuild baseName="DxePerformanceLib" mbdFilename="${MODULE_DIR}/DxePerformanceLib.mbd" msaFilename="${MODULE_DIR}/DxePerformanceLib.msa"/>
+ </target>
+ <target depends="DxePerformanceLib_clean" name="clean"/>
+ <target depends="DxePerformanceLib_cleanall" name="cleanall"/>
+ <target name="DxePerformanceLib_clean">
+ <OutputDirSetup baseName="DxePerformanceLib" mbdFilename="${MODULE_DIR}/DxePerformanceLib.mbd" msaFilename="${MODULE_DIR}/DxePerformanceLib.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxePerformanceLib_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxePerformanceLib_build.xml" target="clean"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
+ </target>
+ <target name="DxePerformanceLib_cleanall">
+ <OutputDirSetup baseName="DxePerformanceLib" mbdFilename="${MODULE_DIR}/DxePerformanceLib.mbd" msaFilename="${MODULE_DIR}/DxePerformanceLib.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxePerformanceLib_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxePerformanceLib_build.xml" target="cleanall"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}"/>
+ <delete dir="${DEST_DIR_DEBUG}"/>
+ <delete>
+ <fileset dir="${BIN_DIR}" includes="**DxePerformanceLib*"/>
+ </delete>
+ </target>
+</project> \ No newline at end of file
diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c
new file mode 100644
index 0000000000..b97849fa35
--- /dev/null
+++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c
@@ -0,0 +1,330 @@
+/*++
+
+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
+
+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:
+
+ PeiPerformanceLib.c
+
+Abstract:
+
+ Performance Library
+
+--*/
+
+/**
+ Gets PEI the GUID HOB for PEI performance.
+
+ This internal function searches for the GUID HOB for PEI performance.
+ If that GUID HOB is not found, it will build a new one.
+ It returns the data area of that GUID HOB to record performance log.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+
+ @retval The index of log entry in the array.
+
+**/
+PEI_PERFORMANCE_LOG_HEADER *
+InternalGetPerformanceHobLog (
+ VOID
+ )
+{
+ EFI_HOB_GUID_TYPE *GuidHob;
+ PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog;
+ UINTN PeiPerformanceLogSize;
+
+ GuidHob = GetFirstGuidHob (&gPeiPerformanceHobGuid);
+
+ if (GuidHob != NULL) {
+ //
+ // PEI Performance HOB was found, then return the existing one.
+ //
+ PeiPerformanceLog = GET_GUID_HOB_DATA (GuidHob);
+ } else {
+ //
+ // PEI Performance HOB was not found, then build one.
+ //
+ PeiPerformanceLogSize = sizeof (PEI_PERFORMANCE_LOG_HEADER) +
+ sizeof (PEI_PERFORMANCE_LOG_ENTRY) * MAX_PEI_PERFORMANCE_LOG_ENTRIES;
+ PeiPerformanceLog = BuildGuidHob (&gPeiPerformanceHobGuid, PeiPerformanceLogSize);
+ PeiPerformanceLog = ZeroMem (PeiPerformanceLog, PeiPerformanceLogSize);
+ }
+
+ return PeiPerformanceLog;
+}
+
+/**
+ Searches in the log array with keyword Handle, Token and Module.
+
+ This internal function searches for the log entry in the log array.
+ If there is an entry that exactly matches the given key word triple
+ and its end time stamp is zero, then the index of that log entry is returned;
+ otherwise, the the number of log entries in the array is returned.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+
+ @retval The index of log entry in the array.
+
+**/
+UINT32
+InternalSearchForLogEntry (
+ IN PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog,
+ IN CONST VOID *Handle, OPTIONAL
+ IN CONST CHAR8 *Token, OPTIONAL
+ IN CONST CHAR8 *Module OPTIONAL
+ )
+{
+ UINT32 Index;
+ UINT32 NumberOfEntries;
+ PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray;
+
+
+ if (Token == NULL) {
+ Token = "";
+ }
+ if (Module == NULL) {
+ Module = "";
+ }
+ NumberOfEntries = PeiPerformanceLog->NumberOfEntries;
+ LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1);
+
+ for (Index = 0; Index < NumberOfEntries; Index++) {
+ if ((LogEntryArray[Index].Handle == (EFI_PHYSICAL_ADDRESS) (UINTN) Handle) &&
+ AsciiStrnCmp (LogEntryArray[Index].Token, Token, PEI_PERFORMANCE_STRING_LENGTH) == 0 &&
+ AsciiStrnCmp (LogEntryArray[Index].Module, Module, PEI_PERFORMANCE_STRING_LENGTH) == 0 &&
+ LogEntryArray[Index].EndTimeStamp == 0
+ ) {
+ break;
+ }
+ }
+ return Index;
+}
+
+/**
+ Creates a record for the beginning of a performance measurement.
+
+ Creates a record that contains the Handle, Token, and Module.
+ If TimeStamp is not zero, then TimeStamp is added to the record as the start time.
+ If TimeStamp is zero, then this function reads the current time stamp
+ and adds that time stamp value to the record as the start time.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+ @param TimeStamp 64-bit time stamp.
+
+ @retval RETURN_SUCCESS The start of the measurement was recorded.
+ @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record the measurement.
+
+**/
+RETURN_STATUS
+EFIAPI
+StartPerformanceMeasurement (
+ IN CONST VOID *Handle, OPTIONAL
+ IN CONST CHAR8 *Token, OPTIONAL
+ IN CONST CHAR8 *Module, OPTIONAL
+ IN UINT64 TimeStamp
+ )
+{
+ PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog;
+ PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray;
+ UINT32 Index;
+
+ PeiPerformanceLog = InternalGetPerformanceHobLog ();
+
+ if (PeiPerformanceLog->NumberOfEntries >= MAX_PEI_PERFORMANCE_LOG_ENTRIES) {
+ return RETURN_OUT_OF_RESOURCES;
+ }
+ Index = PeiPerformanceLog->NumberOfEntries++;
+ LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1);
+ LogEntryArray[Index].Handle = (EFI_PHYSICAL_ADDRESS) (UINTN) Handle;
+
+ if (Token != NULL) {
+ AsciiStrnCpy (LogEntryArray[Index].Token, Token, PEI_PERFORMANCE_STRING_LENGTH);
+ }
+ if (Module != NULL) {
+ AsciiStrnCpy (LogEntryArray[Index].Module, Module, PEI_PERFORMANCE_STRING_LENGTH);
+ }
+
+ if (TimeStamp == 0) {
+ TimeStamp = GetPerformanceCounter ();
+ }
+ LogEntryArray[Index].StartTimeStamp = TimeStamp;
+
+ return RETURN_SUCCESS;
+}
+
+/**
+ Fills in the end time of a performance measurement.
+
+ Looks up the record that matches Handle, Token, and Module.
+ If the record can not be found then return RETURN_NOT_FOUND.
+ If the record is found and TimeStamp is not zero,
+ then TimeStamp is added to the record as the end time.
+ If the record is found and TimeStamp is zero, then this function reads
+ the current time stamp and adds that time stamp value to the record as the end time.
+ If this function is called multiple times for the same record, then the end time is overwritten.
+
+ @param Handle Pointer to environment specific context used
+ to identify the component being measured.
+ @param Token Pointer to a Null-terminated ASCII string
+ that identifies the component being measured.
+ @param Module Pointer to a Null-terminated ASCII string
+ that identifies the module being measured.
+ @param TimeStamp 64-bit time stamp.
+
+ @retval RETURN_SUCCESS The end of the measurement was recorded.
+ @retval RETURN_NOT_FOUND The specified measurement record could not be found.
+
+**/
+RETURN_STATUS
+EFIAPI
+EndPerformanceMeasurement (
+ IN CONST VOID *Handle, OPTIONAL
+ IN CONST CHAR8 *Token, OPTIONAL
+ IN CONST CHAR8 *Module, OPTIONAL
+ IN UINT64 TimeStamp
+ )
+{
+ PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog;
+ PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray;
+ UINT32 Index;
+
+ if (TimeStamp == 0) {
+ TimeStamp = GetPerformanceCounter ();
+ }
+
+ PeiPerformanceLog = InternalGetPerformanceHobLog ();
+ Index = InternalSearchForLogEntry (PeiPerformanceLog, Handle, Token, Module);
+ if (Index >= PeiPerformanceLog->NumberOfEntries) {
+ return RETURN_NOT_FOUND;
+ }
+ LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1);
+ LogEntryArray[Index].EndTimeStamp = TimeStamp;
+
+ return RETURN_SUCCESS;
+}
+
+/**
+ Attempts to retrieve a performance measurement log entry from the performance measurement log.
+
+ Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is
+ zero on entry, then an attempt is made to retrieve the first entry from the performance log,
+ and the key for the second entry in the log is returned. If the performance log is empty,
+ then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance
+ log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is
+ returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is
+ retrieved and an implementation specific non-zero key value that specifies the end of the performance
+ log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry
+ is retrieved and zero is returned. In the cases where a performance log entry can be returned,
+ the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp.
+ If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT().
+ If Handle is NULL, then ASSERT().
+ If Token is NULL, then ASSERT().
+ If Module is NULL, then ASSERT().
+ If StartTimeStamp is NULL, then ASSERT().
+ If EndTimeStamp is NULL, then ASSERT().
+
+ @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve.
+ 0, then the first performance measurement log entry is retrieved.
+ On exit, the key of the next performance lof entry entry.
+ @param Handle Pointer to environment specific context used to identify the component
+ being measured.
+ @param Token Pointer to a Null-terminated ASCII string that identifies the component
+ being measured.
+ @param Module Pointer to a Null-terminated ASCII string that identifies the module
+ being measured.
+ @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was started.
+ @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement
+ was ended.
+
+ @return The key for the next performance log entry (in general case).
+
+**/
+UINTN
+EFIAPI
+GetPerformanceMeasurement (
+ IN UINTN LogEntryKey,
+ OUT CONST VOID **Handle,
+ OUT CONST CHAR8 **Token,
+ OUT CONST CHAR8 **Module,
+ OUT UINT64 *StartTimeStamp,
+ OUT UINT64 *EndTimeStamp
+ )
+{
+ PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog;
+ PEI_PERFORMANCE_LOG_ENTRY *CurrentLogEntry;
+ PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray;
+ UINTN NumberOfEntries;
+
+ ASSERT (Handle != NULL);
+ ASSERT (Token != NULL);
+ ASSERT (Module != NULL);
+ ASSERT (StartTimeStamp != NULL);
+ ASSERT (EndTimeStamp != NULL);
+
+ PeiPerformanceLog = InternalGetPerformanceHobLog ();
+
+ NumberOfEntries = (UINTN) (PeiPerformanceLog->NumberOfEntries);
+ LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1);
+ //
+ // Make sure that LogEntryKey is a valid log entry key.
+ //
+ ASSERT (LogEntryKey <= NumberOfEntries);
+
+ if (LogEntryKey == NumberOfEntries) {
+ return 0;
+ }
+
+ CurrentLogEntry = &(LogEntryArray[LogEntryKey++]);
+
+ *Handle = (VOID *) (UINTN) (CurrentLogEntry->Handle);
+ *Token = CurrentLogEntry->Token;
+ *Module = CurrentLogEntry->Module;
+ *StartTimeStamp = CurrentLogEntry->StartTimeStamp;
+ *EndTimeStamp = CurrentLogEntry->EndTimeStamp;
+
+ return LogEntryKey;
+}
+
+/**
+ Returns TRUE if the performance measurement macros are enabled.
+
+ This function returns TRUE if the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is set. Otherwise FALSE is returned.
+
+ @retval TRUE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is set.
+ @retval FALSE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of
+ PcdPerformanceLibraryPropertyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+PerformanceMeasurementEnabled (
+ VOID
+ )
+{
+ return ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0);
+}
diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd
new file mode 100644
index 0000000000..8dba9c21c1
--- /dev/null
+++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<LibraryModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MbdLibHeader>
+ <BaseName>PeiPerformanceLib</BaseName>
+ <Guid>F72DE735-B24F-4ef6-897F-70A85D01A047</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
+ <License>
+ 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
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ </License>
+ <Created>2006-04-04 11:12</Created>
+ </MbdLibHeader>
+</LibraryModuleBuildDescription>
diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa
new file mode 100644
index 0000000000..a80adce978
--- /dev/null
+++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<LibraryModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MsaLibHeader>
+ <BaseName>PeiPerformanceLib</BaseName>
+ <ModuleType>PEIM</ModuleType>
+ <ComponentType>LIBRARY</ComponentType>
+ <Guid>F72DE735-B24F-4ef6-897F-70A85D01A047</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Abstract>Memory-only library functions with no library constructor/destructor</Abstract>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
+ <License>
+ 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
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ </License>
+ <Created>2006-04-04 11:12</Created>
+ <Specification>EFI_SPECIFICATION_VERSION 0x00000000</Specification>
+ </MsaLibHeader>
+ <LibraryClassDefinitions>
+ <LibraryClass Usage="ALWAYS_PRODUCED">PerformanceLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">DebugLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">HobLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">BaseLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">TimerLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PcdLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">BaseMemoryLib</LibraryClass>
+ </LibraryClassDefinitions>
+ <SourceFiles>
+ <Filename>PeiPerformanceLib.c</Filename>
+ </SourceFiles>
+ <Includes>
+ <PackageName>MdePkg</PackageName>
+ <PackageName>EdkModulePkg</PackageName>
+ </Includes>
+ <Guids>
+ <GuidEntry Usage="SOMETIMES_CONSUMED">
+ <C_Name>PeiPerformanceHob</C_Name>
+ </GuidEntry>
+ </Guids>
+ <PcdCoded>
+ <PcdEntry PcdItemType="FIXED_AT_BUILD">
+ <C_Name>PcdPerformanceLibraryPropertyMask</C_Name>
+ </PcdEntry>
+ </PcdCoded>
+</LibraryModuleSurfaceArea>
diff --git a/EdkModulePkg/Library/PeiPerformanceLib/build.xml b/EdkModulePkg/Library/PeiPerformanceLib/build.xml
new file mode 100644
index 0000000000..e0bd259b3a
--- /dev/null
+++ b/EdkModulePkg/Library/PeiPerformanceLib/build.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?><!-- 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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
+<project basedir="." default="PeiPerformanceLib"><!--Apply external ANT tasks-->
+ <taskdef resource="GenBuild.tasks"/>
+ <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+ <property environment="env"/>
+ <property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
+ <import file="${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
+ <property name="MODULE_RELATIVE_PATH" value="Library/PeiPerformanceLib"/>
+ <property name="MODULE_DIR" value="${PACKAGE_DIR}/${MODULE_RELATIVE_PATH}"/>
+ <property name="COMMON_FILE" value="${WORKSPACE_DIR}/Tools/Conf/Common.xml"/>
+ <target name="PeiPerformanceLib">
+ <GenBuild baseName="PeiPerformanceLib" mbdFilename="${MODULE_DIR}/PeiPerformanceLib.mbd" msaFilename="${MODULE_DIR}/PeiPerformanceLib.msa"/>
+ </target>
+ <target depends="PeiPerformanceLib_clean" name="clean"/>
+ <target depends="PeiPerformanceLib_cleanall" name="cleanall"/>
+ <target name="PeiPerformanceLib_clean">
+ <OutputDirSetup baseName="PeiPerformanceLib" mbdFilename="${MODULE_DIR}/PeiPerformanceLib.mbd" msaFilename="${MODULE_DIR}/PeiPerformanceLib.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/PeiPerformanceLib_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/PeiPerformanceLib_build.xml" target="clean"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
+ </target>
+ <target name="PeiPerformanceLib_cleanall">
+ <OutputDirSetup baseName="PeiPerformanceLib" mbdFilename="${MODULE_DIR}/PeiPerformanceLib.mbd" msaFilename="${MODULE_DIR}/PeiPerformanceLib.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/PeiPerformanceLib_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/PeiPerformanceLib_build.xml" target="cleanall"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}"/>
+ <delete dir="${DEST_DIR_DEBUG}"/>
+ <delete>
+ <fileset dir="${BIN_DIR}" includes="**PeiPerformanceLib*"/>
+ </delete>
+ </target>
+</project> \ No newline at end of file
diff --git a/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_bc_udp.c b/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_bc_udp.c
index 7d782955c8..32768c05c6 100644
--- a/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_bc_udp.c
+++ b/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_bc_udp.c
@@ -463,12 +463,7 @@ Returns:
}
}
- switch (StatCode) {
- case EFI_SUCCESS:
- case EFI_TIMEOUT:
- break;
-
- default:
+ if ((StatCode != EFI_SUCCESS) && (StatCode != EFI_TIMEOUT)) {
DEBUG (
(EFI_D_INFO,
"\nUdpRead() Exit #3 %Xh %r",
diff --git a/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_loadfile.c b/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_loadfile.c
index 315c95a9f5..182462c02f 100644
--- a/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_loadfile.c
+++ b/EdkModulePkg/Universal/Network/PxeBc/Dxe/pxe_loadfile.c
@@ -1456,15 +1456,12 @@ Returns:
(VOID *) &LoadfilePtr->Private->CallbackProtocolPtr
);
- switch (Status) {
- case EFI_SUCCESS:
+ if (Status == EFI_SUCCESS) {
//
// There is already a callback routine. Do nothing.
//
DEBUG ((EFI_D_WARN, "\nLoadFile() BC callback exists."));
- break;
-
- case EFI_UNSUPPORTED:
+ } else if (Status == EFI_UNSUPPORTED) {
//
// No BaseCode Callback protocol found. Add our own.
//
@@ -1490,10 +1487,7 @@ Returns:
&NewMakeCallback
);
}
-
- break;
-
- default:
+ } else {
DEBUG ((EFI_D_WARN, "\nLoadFile() Callback check status == %xh", Status));
}
//
@@ -1578,11 +1572,11 @@ Returns:
DEBUG ((EFI_D_WARN, "\nBC.Loadfile() Status == %xh\n", Status));
- switch (Status) {
- case EFI_SUCCESS: /* 0 */
+ if (Status == EFI_SUCCESS) {
+ /* 0 */
return EFI_SUCCESS;
-
- case EFI_BUFFER_TOO_SMALL: /* 5 */
+ } else if (Status == EFI_BUFFER_TOO_SMALL) {
+ /* 5 */
//
// Error is only displayed when we are actually trying to
// download the boot image.
@@ -1590,104 +1584,81 @@ Returns:
if (Buffer == NULL) {
return EFI_BUFFER_TOO_SMALL;
}
-
AsciiPrint ("\nPXE-E05: Download buffer is smaller than requested file.\n");
- break;
-
- case EFI_DEVICE_ERROR: /* 7 */
+ } else if (Status == EFI_DEVICE_ERROR) {
+ /* 7 */
AsciiPrint ("\nPXE-E07: Network device error. Check network connection.\n");
- break;
-
- case EFI_OUT_OF_RESOURCES: /* 9 */
+ } else if (Status == EFI_OUT_OF_RESOURCES) {
+ /* 9 */
AsciiPrint ("\nPXE-E09: Could not allocate I/O buffers.\n");
- break;
-
- case EFI_NO_MEDIA: /* 12 */
+ } else if (Status == EFI_NO_MEDIA) {
+ /* 12 */
AsciiPrint ("\nPXE-E12: Could not detect network connection. Check cable.\n");
- break;
-
- case EFI_NO_RESPONSE: /* 16 */
+ } else if (Status == EFI_NO_RESPONSE) {
+ /* 16 */
AsciiPrint ("\nPXE-E16: Valid PXE offer not received.\n");
- break;
-
- case EFI_TIMEOUT: /* 18 */
+ } else if (Status == EFI_TIMEOUT) {
+ /* 18 */
AsciiPrint ("\nPXE-E18: Timeout. Server did not respond.\n");
- break;
-
- case EFI_ABORTED: /* 21 */
+ } else if (Status == EFI_ABORTED) {
+ /* 21 */
AsciiPrint ("\nPXE-E21: Remote boot cancelled.\n");
- break;
-
- case EFI_ICMP_ERROR: /* 22 */
+ } else if (Status == EFI_ICMP_ERROR) {
+ /* 22 */
AsciiPrint ("\nPXE-E22: Client received ICMP error from server.\n");
- if (LoadfilePtr->Private->EfiBc.Mode == NULL) {
- break;
- }
-
- if (!LoadfilePtr->Private->EfiBc.Mode->IcmpErrorReceived) {
- break;
- }
+ if ((LoadfilePtr->Private->EfiBc.Mode != NULL) && LoadfilePtr->Private->EfiBc.Mode->IcmpErrorReceived) {
+ AsciiPrint (
+ "PXE-E98: Type: %xh Code: %xh ",
+ LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type,
+ LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code
+ );
- AsciiPrint (
- "PXE-E98: Type: %xh Code: %xh ",
- LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type,
- LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code
- );
+ switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type) {
+ case 0x03:
+ switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code) {
+ case 0x00: /* net unreachable */
+ AsciiPrint ("Net unreachable");
+ break;
- switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type) {
- case 0x03:
- switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code) {
- case 0x00: /* net unreachable */
- AsciiPrint ("Net unreachable");
- break;
+ case 0x01: /* host unreachable */
+ AsciiPrint ("Host unreachable");
+ break;
- case 0x01: /* host unreachable */
- AsciiPrint ("Host unreachable");
- break;
+ case 0x02: /* protocol unreachable */
+ AsciiPrint ("Protocol unreachable");
+ break;
- case 0x02: /* protocol unreachable */
- AsciiPrint ("Protocol unreachable");
- break;
+ case 0x03: /* port unreachable */
+ AsciiPrint ("Port unreachable");
+ break;
- case 0x03: /* port unreachable */
- AsciiPrint ("Port unreachable");
- break;
+ case 0x04: /* Fragmentation needed */
+ AsciiPrint ("Fragmentation needed");
+ break;
- case 0x04: /* Fragmentation needed */
- AsciiPrint ("Fragmentation needed");
- break;
+ case 0x05: /* Source route failed */
+ AsciiPrint ("Source route failed");
+ break;
+ }
- case 0x05: /* Source route failed */
- AsciiPrint ("Source route failed");
break;
}
- break;
+ AsciiPrint ("\n");
}
-
- AsciiPrint ("\n");
-
- break;
-
- case EFI_TFTP_ERROR: /* 23 */
+ } else if (Status == EFI_TFTP_ERROR) {
+ /* 23 */
AsciiPrint ("\nPXE-E23: Client received TFTP error from server.\n");
- if (LoadfilePtr->Private->EfiBc.Mode == NULL) {
- break;
- }
-
- if (LoadfilePtr->Private->EfiBc.Mode->TftpErrorReceived) {
+ if ((LoadfilePtr->Private->EfiBc.Mode != NULL) && (LoadfilePtr->Private->EfiBc.Mode->TftpErrorReceived)) {
AsciiPrint (
"PXE-E98: Code: %xh %a\n",
LoadfilePtr->Private->EfiBc.Mode->TftpError.ErrorCode,
LoadfilePtr->Private->EfiBc.Mode->TftpError.ErrorString
);
}
-
- break;
-
- default:
+ } else {
AsciiPrint ("\nPXE-E99: Unexpected network error: %xh\n", Status);
}
diff --git a/EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Run.c b/EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Run.c
index 50f97a8915..8e015b2a3d 100644
--- a/EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Run.c
+++ b/EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Run.c
@@ -126,14 +126,9 @@ PxeDhcp4Run (
//
efi_status = PxeDhcp4Init (This, timeout, &offers, &offer_list);
- switch (efi_status) {
- case EFI_NO_RESPONSE:
- case EFI_TIMEOUT:
- case EFI_SUCCESS:
- break;
-
- case EFI_ABORTED:
- default:
+ if ((efi_status != EFI_NO_RESPONSE) &&
+ (efi_status != EFI_TIMEOUT) &&
+ (efi_status != EFI_SUCCESS)) {
return efi_status;
}
//