use std::sync::atomic::{AtomicU64, Ordering};
use serde::Serialize;
#[repr(C, align(64))]
#[derive(Debug, Default)]
pub struct VcpuStats {
pub mmio_reads: AtomicU64,
pub mmio_writes: AtomicU64,
pub wfi: AtomicU64,
pub hvc: AtomicU64,
pub smc: AtomicU64,
pub vtimer: AtomicU64,
pub kicks_received: AtomicU64,
pub sysreg: AtomicU64,
pub other: AtomicU64,
}
#[derive(Debug, Clone, Serialize)]
pub struct VcpuStatsSnapshot {
pub vcpu: u32,
pub mmio_reads: u64,
pub mmio_writes: u64,
pub wfi: u64,
pub hvc: u64,
pub smc: u64,
pub vtimer: u64,
pub kicks_received: u64,
pub sysreg: u64,
pub other: u64,
}
impl VcpuStats {
#[inline]
pub fn bump(counter: &AtomicU64) {
counter.fetch_add(1, Ordering::Relaxed);
}
#[must_use]
pub fn snapshot(&self, vcpu: u32) -> VcpuStatsSnapshot {
VcpuStatsSnapshot {
vcpu,
mmio_reads: self.mmio_reads.load(Ordering::Relaxed),
mmio_writes: self.mmio_writes.load(Ordering::Relaxed),
wfi: self.wfi.load(Ordering::Relaxed),
hvc: self.hvc.load(Ordering::Relaxed),
smc: self.smc.load(Ordering::Relaxed),
vtimer: self.vtimer.load(Ordering::Relaxed),
kicks_received: self.kicks_received.load(Ordering::Relaxed),
sysreg: self.sysreg.load(Ordering::Relaxed),
other: self.other.load(Ordering::Relaxed),
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct VmDebugSnapshot {
pub devices: Vec<crate::device::DeviceDebug>,
pub vcpus: Vec<VcpuStatsSnapshot>,
pub kick_broadcasts: u64,
pub unpark_broadcasts: u64,
}