use std::ffi::CString;
use super::RecordId;
#[derive(Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Ksymbol {
pub record_id: Option<RecordId>,
pub ty: Type,
pub name: CString,
pub state: State,
pub addr: u64,
pub len: u32,
}
impl Ksymbol {
#[cfg(feature = "linux-5.1")]
pub(crate) unsafe fn from_ptr(
mut ptr: *const u8,
sample_id_all: Option<super::SampleType>,
) -> Self {
use std::ffi::CStr;
use super::SampleType;
use crate::ffi::{bindings as b, deref_offset};
let addr = deref_offset(&mut ptr);
let len = deref_offset(&mut ptr);
let ty = match deref_offset::<u16>(&mut ptr) as _ {
b::PERF_RECORD_KSYMBOL_TYPE_BPF => Type::Bpf,
#[cfg(feature = "linux-5.9")]
b::PERF_RECORD_KSYMBOL_TYPE_OOL => Type::OutOfLine,
b::PERF_RECORD_KSYMBOL_TYPE_UNKNOWN => Type::Unknown,
_ => Type::Unknown, };
let flags: u16 = deref_offset(&mut ptr);
let name = CStr::from_ptr(ptr as _).to_owned();
let record_id = sample_id_all.map(|SampleType(ty)| {
ptr = ptr.add(name.as_bytes_with_nul().len());
ptr = ptr.add(ptr.align_offset(align_of::<u64>()));
RecordId::from_ptr(ptr, ty)
});
let state = if flags as u32 & b::PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER > 0 {
State::Unreg
} else {
State::Reg
};
Ksymbol {
record_id,
ty,
name,
state,
addr,
len,
}
}
}
super::from!(Ksymbol);
super::debug!(Ksymbol {
{record_id?},
{ty},
{name},
{state},
{addr},
{len},
});
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum State {
Reg,
Unreg,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Type {
Bpf,
OutOfLine,
Unknown,
}