| Crates.io | patina_performance |
| lib.rs | patina_performance |
| version | 19.0.5 |
| created_at | 2025-10-12 04:23:43.412723+00 |
| updated_at | 2026-01-21 17:50:33.614852+00 |
| description | Performance measurement infrastructure. |
| homepage | |
| repository | https://github.com/OpenDevicePartnership/patina |
| max_upload_size | |
| id | 1878872 |
| size | 80,339 |
The Patina performance component maintains the infrastructure to report firmware performance information.
EdkiiPerformanceMeasurement) for C drivers that need to log performance data.PerfConfig.enable_component must be set to enable the component.PerfConfig.enabled_measurements carries the bitmask of patina::performance::Measurement values that should be
recorded.PerformanceConfigurationProvider component, which reads a
PerformanceConfigHob and locks the PerfConfig values for the session.To enable performance measurements in Patina, add the Performance component and provide a PerfConfig using
configs(mut add: Add<Config>) in your platform's ComponentInfo implementation. For example:
use patina_performance::component::Performance;
use patina_performance::component::performance_config_provider::PerformanceConfigurationProvider;
use patina_dxe_core::*;
impl ComponentInfo for ExamplePlatform {
fn configs(mut add: Add<Config>) {
add.config(patina_performance::config::PerfConfig {
enable_component: true,
enabled_measurements: {
patina::performance::Measurement::DriverBindingStart
| patina::performance::Measurement::DriverBindingStop
| patina::performance::Measurement::DriverBindingSupport
| patina::performance::Measurement::LoadImage
| patina::performance::Measurement::StartImage
}
});
}
fn components(mut add: Add<Component>) {
// Add your other components as needed, e.g.:
// add.component(AdvancedLoggerComponent::<YourUartType>::new(&LOGGER));
add.component(PerformanceConfigurationProvider);
add.component(Performance);
}
}
Note: The
PerformanceConfigurationProvidercomponent is optional. Include it if you want to allow runtime configuration of performance measurements via a HOB. If you only want static configuration, you can omit it.
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.
| 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. |
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:
# extern crate mu_rust_helpers;
# extern crate patina;
use patina::performance::{
logging::perf_function_begin,
measurement::create_performance_measurement,
};
use mu_rust_helpers::guid::CALLER_ID;
perf_function_begin("foo", &CALLER_ID, create_performance_measurement);
Example of measurement from outside the core:
# extern crate mu_rust_helpers;
# extern crate patina;
# let bs = patina::boot_services::StandardBootServices::new_uninit();
use mu_rust_helpers::guid::CALLER_ID;
use patina::{
boot_services::BootServices,
performance::logging::perf_function_begin,
uefi_protocol::performance_measurement::EdkiiPerformanceMeasurement,
};
let create_performance_measurement = unsafe { bs.locate_protocol::<EdkiiPerformanceMeasurement>(None) }
.map_or(None, |p| Some(p.create_performance_measurement));
create_performance_measurement.inspect(|f| perf_function_begin("foo", &CALLER_ID, *f));
The Performance Component provides an API for logging performance measurements during firmware execution. This API includes:
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.
Upon initialization, the component performs the following steps:
Initialize the Firmware Performance Data Table (FBPT)
Populate FBPT with Pre-DXE Data
Install the EdkiiPerformanceMeasurement Protocol
Register Events
Install Performance Properties
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.