Patina Performance Component
The Patina performance component maintains the infrastructure to report firmware performance information.
Responsibilities
- Initialize the FBPT and seed it with any measurements passed in performance data HOBs from prior boot phases.
- Track the current performance measurement mask and load-image count so event producers can filter their output.
- Publish performance properties through a configuration table and expose the measurement protocol
(
EdkiiPerformanceMeasurement) for C drivers that need to log performance data. - Optionally merge Management Mode (MM) performance records when an MM communication region is available.
- Publish the FBPT so the operating system can consume it later.
Configuration
PerfConfig.enable_componentmust be set to enable the component.PerfConfig.enabled_measurementscarries the bitmask ofpatina::performance::Measurementvalues that should be recorded.- Platforms that need runtime configuration can include the
PerformanceConfigurationProvidercomponent, which reads aPerformanceConfigHoband locks thePerfConfigvalues for the session.
Enabling Performance Measurements
Enabling performance in Patina is done by adding the Performance component to the
Patina DXE Core build.
// ...
default
// ...
.with_component
.start
.unwrap;
// ...
Note: Performance measurements for a given platform may need to be enabled. For example, if building in
patina-qemu, this build variable should be set to true:BLD_*_PERF_TRACE_ENABLE=TRUE.
The Patina performance component uses a feature mask in its configuration to control how performance is measured.
// ...
default
// ...
.with_config
.with_component)
.start
.unwrap;
// ...
Enabling Performance Measurements During Boot
A component called PerformanceConfigurationProvider is used to enable performance measurements during the boot
process. This component depends on a PerformanceConfigHob HOB to be produced during boot to determine whether the
performance component should be enabled and which measurements should be active.
If a platform needs to use a single Patina DXE Core and support firmware builds where performance measurements can
be enabled or disabled, it should produce a PerformanceConfigHob HOB during the boot process and include the
PerformanceConfigurationProvider component in the DXE Core build. The HOB can be populated by any platform-specific
logic, such as a PCD value or a build variable.
Note:
PerformanceConfigurationProviderwill override the enabled measurements based on the HOB value.
API
| Macro name in EDK II | Function name in Patina component | Description |
|---|---|---|
PERF_START_IMAGE_BEGIN PERF_START_IMAGE_END |
perf_image_start_beginperf_image_start_end |
Measure the performance of start image in core. |
PERF_LOAD_IMAGE_BEGINPERF_LOAD_IMAGE_END |
perf_load_image_beginperf_load_image_end |
Measure the performance of load image in core. |
PERF_DRIVER_BINDING_SUPPORT_BEGIN PERF_DRIVER_BINDING_SUPPORT_END |
perf_driver_binding_support_beginperf_driver_binding_support_end |
Measure the performance of driver binding support in core. |
PERF_DRIVER_BINDING_START_BEGINPERF_DRIVER_BINDING_START_END |
perf_driver_binding_start_beginperf_driver_binding_start_end |
Measure the performance of driver binding start in core. |
PERF_DRIVER_BINDING_STOP_BEGINPERF_DRIVER_BINDING_STOP_END |
perf_driver_binding_stop_beginperf_driver_binding_stop_end |
Measure the performance of driver binding stop in core. |
PERF_EVENT |
perf_event |
Measure the time from power-on to this function execution. |
PERF_EVENT_SIGNAL_BEGINPERF_EVENT_SIGNAL_END |
perf_event_signal_beginperf_event_signal_end |
Measure the performance of event signal behavior in any module. |
PERF_CALLBACK_BEGINPERF_CALLBACK_END |
perf_callback_beginperf_callback_end |
Measure the performance of a callback function in any module. |
PERF_FUNCTION_BEGINPERF_FUNCTION_END |
perf_function_beginperf_function_end |
Measure the performance of a general function in any module. |
PERF_INMODULE_BEGINPERF_INMODULE_END |
perf_in_module_beginperf_in_module_end |
Measure the performance of a behavior within one module. |
PERF_CROSSMODULE_BEGINPERF_CROSSMODULE_END |
perf_cross_module_beginperf_cross_module_end |
Measure the performance of a behavior in different modules. |
PERF_STARTPERF_START_EXPERF_ENDPERF_END_EX |
perf_startperf_start_experf_endperf_end_ex |
Make a performance measurement. |
Logging Performance Measurements
The method to record performance measurements varies according to whether it is performed from within the core or an external component.
Example of measurement from within the core:
use CALLER_ID;
perf_function_begin;
Example of measurement from outside the core:
use CALLER_ID;
let create_performance_measurement = unsafe
.map_or;
create_performance_measurement.inspect;
Performance Component Overview
The Performance Component provides an API for logging performance measurements during firmware execution. This API includes:
- Utility functions to log specific events.
- A function to create performance measurements.
If the measurement is initiated from the core, use the create_performance_measurement function within the utility
function. Otherwise, use the function returned by the EdkiiPerformanceMeasurement protocol.
Initialization and Setup
Upon initialization, the component performs the following steps:
-
Initialize the Firmware Performance Data Table (FBPT)
- Sets up the FBPT data structure to store performance records.
-
Populate FBPT with Pre-DXE Data
- Retrieves performance data from Hand-Off Blocks (HOBs) generated during the pre-DXE phase and adds them to the FBPT.
-
Install the
EdkiiPerformanceMeasurementProtocol- Enables external modules to log performance data using the component API.
-
Register Events
- One event collects performance records logged in Management Mode (MM).
- Another event publishes the FBPT to allocate the table in reserved memory at the end of the DXE phase.
-
Install Performance Properties
- Exposes performance-related properties through a configuration table for use by other components.
Scope and Limitations
This component only publishes the FBPT, as it specifically manages the additional record fields within it. Other tables, such as the Firmware Performance Data Table (FPDT), are published by separate components.