use crate::uarch::ctx::CoreCtx;
use crate::uarch::pipeline::backend::shared::commit::{CommitEvent, ReExecuteCause};
use crate::uarch::pipeline::squash::SquashCause;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FlushCause {
Branch,
System,
MemoryOrder,
Coherence,
Trap,
}
impl From<SquashCause> for FlushCause {
fn from(cause: SquashCause) -> Self {
match cause {
SquashCause::Branch => Self::Branch,
SquashCause::System => Self::System,
SquashCause::MemoryOrder => Self::MemoryOrder,
SquashCause::Coherence => Self::Coherence,
}
}
}
impl From<&CommitEvent> for FlushCause {
fn from(event: &CommitEvent) -> Self {
match event {
CommitEvent::Trap(..) => Self::Trap,
CommitEvent::ReExecute(_, ReExecuteCause::StaleLine) => Self::Coherence,
CommitEvent::ReExecute(_, ReExecuteCause::ChangedPte) | CommitEvent::SquashAfter(_) => {
Self::System
}
}
}
}
pub fn count_flush(state: &mut CoreCtx<'_>, cause: FlushCause, squashed: usize) {
let paths = &state.core.stat_paths.pipeline;
let by_cause = match cause {
FlushCause::Branch => paths.flushes_branch,
FlushCause::System => paths.flushes_system,
FlushCause::MemoryOrder => paths.flushes_mem_violations,
FlushCause::Coherence => paths.flushes_coherence,
FlushCause::Trap => paths.flushes_trap,
};
let (total, squashed_insns) = (paths.flushes_total, paths.flushes_squashed_insns);
let stats = &mut state.uncore.stats;
stats.counter(total).inc();
stats.counter(by_cause).inc();
stats.counter(squashed_insns).add(squashed as u64);
}