use kbpf_basic::linux_bpf::perf_event_attr;
pub use super::hw_event::ARMV8_PMUV3_PERF_TYPE;
use super::{access::AuthorizedPerfTarget, target::PerfTargetKind};
#[cfg(target_arch = "aarch64")]
pub(super) enum ValidatedHwCounter {
SystemPreferredCycle(u16),
SystemProgrammable(u16),
TaskPreferredCycle(u16),
TaskProgrammable(u16),
}
#[cfg(target_arch = "aarch64")]
pub(super) struct ValidatedHwOpen {
pub(super) num_counters: usize,
pub(super) counter: ValidatedHwCounter,
pub(super) is_sampling: bool,
pub(super) is_freq: bool,
pub(super) sample_period: u32,
pub(super) target_freq: u32,
}
#[cfg(not(target_arch = "aarch64"))]
pub(super) struct ValidatedHwOpen;
pub type HwPerfEvent = super::hw_event::HwPerfEvent;
pub(super) fn validate_perf_event_open_hw(
attr: &perf_event_attr,
target_kind: PerfTargetKind,
) -> crate::StarryResult<ValidatedHwOpen> {
#[cfg(target_arch = "aarch64")]
{
super::hw_open::validate_perf_event_open_hw(attr, target_kind)
}
#[cfg(not(target_arch = "aarch64"))]
{
let _ = (attr, target_kind);
Err(crate::StarryError::Unsupported)
}
}
pub(super) fn perf_event_open_hw(
attr: &perf_event_attr,
target: AuthorizedPerfTarget,
validated: ValidatedHwOpen,
) -> crate::StarryResult<HwPerfEvent> {
#[cfg(target_arch = "aarch64")]
{
super::hw_open::perf_event_open_hw(attr, target, validated)
}
#[cfg(not(target_arch = "aarch64"))]
{
super::hw_event::perf_event_open_hw(attr, target, validated)
}
}
#[cfg(target_arch = "aarch64")]
pub(crate) use super::hw_allocation::alloc_programmable_counter;
#[cfg(target_arch = "aarch64")]
pub(super) use super::hw_owner::{
SystemPmuConfigure, SystemPmuDisable, SystemPmuDisableResult, SystemPmuEnable,
SystemPmuEnableResult, SystemPmuRead, SystemPmuReadResult, SystemPmuReset,
configure_system_on_owner, disable_system_on_owner, enable_system_on_owner,
read_system_on_owner, reset_system_on_owner,
};