use core::{
ffi::{c_char, c_void},
fmt::Debug,
option::Option,
};
use r_efi::efi;
use crate::{performance::measurement::CallerIdentifier, uefi_protocol::ProtocolInterface};
pub const EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL_GUID: crate::BinaryGuid =
crate::BinaryGuid::from_string("C85D06BE-5F75-48CE-A80F-1236BA3B87B1");
pub const EDKII_SMM_PERFORMANCE_MEASUREMENT_PROTOCOL_GUID: crate::BinaryGuid =
crate::BinaryGuid::from_string("D56B6D73-1A7B-4015-9BB4-7B071729ED24");
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(C)]
pub enum PerfAttribute {
PerfStartEntry,
PerfEndEntry,
PerfEntry,
}
pub type CreateMeasurementUefi = unsafe extern "efiapi" fn(
caller_identifier: *const c_void,
guid: Option<&efi::Guid>,
string: *const c_char,
ticker: u64,
address: usize,
identifier: u32,
attribute: PerfAttribute,
) -> efi::Status;
pub type CreateMeasurement = fn(
caller_identifier: CallerIdentifier,
guid: Option<&efi::Guid>,
string: Option<&str>,
ticker: u64,
address: usize,
identifier: u16,
attribute: PerfAttribute,
) -> Result<(), crate::performance::error::Error>;
pub struct EdkiiPerformanceMeasurement {
pub create_performance_measurement: CreateMeasurementUefi,
}
unsafe impl ProtocolInterface for EdkiiPerformanceMeasurement {
const PROTOCOL_GUID: crate::BinaryGuid = EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL_GUID;
}