stackpulse 0.10.0

Linux perf_event stack sampling with native unwinding, symbolization, and compact spooling
Documentation
use perf_event_open::sample::record::Priv;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum StackMode {
    User,
    Kernel,
}

impl From<Priv> for StackMode {
    fn from(privilege: Priv) -> Self {
        match privilege {
            Priv::Kernel | Priv::Hv | Priv::GuestKernel => Self::Kernel,
            _ => Self::User,
        }
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum StackFrame {
    InstructionPointer(u64, StackMode),
    ReturnAddress(u64, StackMode),
    TruncatedStackMarker,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn stack_mode_classifies_privilege_levels() {
        assert_eq!(StackMode::from(Priv::User), StackMode::User);
        assert_eq!(StackMode::from(Priv::GuestUser), StackMode::User);
        assert_eq!(StackMode::from(Priv::Unknown), StackMode::User);
        assert_eq!(StackMode::from(Priv::Kernel), StackMode::Kernel);
        assert_eq!(StackMode::from(Priv::Hv), StackMode::Kernel);
        assert_eq!(StackMode::from(Priv::GuestKernel), StackMode::Kernel);
    }
}