use c_enum::c_enum;
use perf_event_open_sys::bindings;
use crate::events::Event;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Cache {
pub which: CacheId,
pub operation: CacheOp,
pub result: CacheResult,
}
impl Cache {
fn as_config(&self) -> u64 {
self.which.0 as u64 | ((self.operation.0 as u64) << 8) | ((self.result.0 as u64) << 16)
}
}
impl Event for Cache {
fn update_attrs(self, attr: &mut bindings::perf_event_attr) {
attr.type_ = bindings::PERF_TYPE_HW_CACHE;
attr.config = self.as_config()
}
}
#[doc(hidden)]
#[deprecated = "WhichCache has been renamed to CacheId"]
pub type WhichCache = CacheId;
c_enum! {
#[repr(transparent)]
#[derive(Clone, Copy, Eq, PartialEq, Hash)]
pub enum CacheId : u8 {
L1D = bindings::PERF_COUNT_HW_CACHE_L1D as _,
L1I = bindings::PERF_COUNT_HW_CACHE_L1I as _,
LL = bindings::PERF_COUNT_HW_CACHE_LL as _,
DTLB = bindings::PERF_COUNT_HW_CACHE_DTLB as _,
ITLB = bindings::PERF_COUNT_HW_CACHE_ITLB as _,
BPU = bindings::PERF_COUNT_HW_CACHE_BPU as _,
NODE = bindings::PERF_COUNT_HW_CACHE_NODE as _,
}
}
c_enum! {
#[repr(transparent)]
#[derive(Clone, Copy, Eq, PartialEq, Hash)]
pub enum CacheOp : u8 {
READ = bindings::PERF_COUNT_HW_CACHE_OP_READ as _,
WRITE = bindings::PERF_COUNT_HW_CACHE_OP_WRITE as _,
PREFETCH = bindings::PERF_COUNT_HW_CACHE_OP_PREFETCH as _,
}
}
c_enum! {
#[repr(transparent)]
#[derive(Clone, Copy, Eq, PartialEq, Hash)]
pub enum CacheResult : u8 {
ACCESS = bindings::PERF_COUNT_HW_CACHE_RESULT_ACCESS as _,
MISS = bindings::PERF_COUNT_HW_CACHE_RESULT_MISS as _,
}
}