linux_perf_data/
dso_key.rs1use linux_perf_event_reader::CpuMode;
2
3#[derive(Debug, Clone, PartialEq, Eq, Hash)]
13pub enum DsoKey {
14 Kernel,
15 GuestKernel,
16 Vdso32,
17 VdsoX32,
18 Vdso64,
19 Vsyscall,
20 KernelModule {
21 name: String,
26 },
27 User {
28 file_name: String,
30 full_path: Vec<u8>,
33 },
34}
35
36impl DsoKey {
37 pub fn detect(path: &[u8], cpu_mode: CpuMode) -> Option<Self> {
41 if path == b"//anon" || path == b"[stack]" || path == b"[heap]" || path == b"[vvar]" {
42 return None;
43 }
44
45 if path.starts_with(b"[kernel.kallsyms]") {
46 let dso_key = if cpu_mode == CpuMode::GuestKernel {
47 DsoKey::GuestKernel
48 } else {
49 DsoKey::Kernel
50 };
51 return Some(dso_key);
52 }
53 if path.starts_with(b"[guest.kernel.kallsyms") {
54 return Some(DsoKey::GuestKernel);
55 }
56 if path == b"[vdso32]" {
57 return Some(DsoKey::Vdso32);
58 }
59 if path == b"[vdsox32]" {
60 return Some(DsoKey::VdsoX32);
61 }
62 if path == b"[vdso]" {
63 return Some(DsoKey::Vdso64);
65 }
66 if path == b"[vsyscall]" {
67 return Some(DsoKey::Vsyscall);
68 }
69 if (cpu_mode == CpuMode::Kernel || cpu_mode == CpuMode::GuestKernel)
70 && path.starts_with(b"[")
71 {
72 return Some(DsoKey::KernelModule {
73 name: String::from_utf8_lossy(path).into(),
74 });
75 }
76
77 let filename = if let Some(final_slash_pos) = path.iter().rposition(|b| *b == b'/') {
78 &path[final_slash_pos + 1..]
79 } else {
80 path
81 };
82
83 let dso_key = match (cpu_mode, filename.strip_suffix(b".ko")) {
84 (CpuMode::Kernel | CpuMode::GuestKernel, Some(kmod_name)) => {
85 let kmod_name = String::from_utf8_lossy(kmod_name);
87 DsoKey::KernelModule {
88 name: format!("[{}]", kmod_name),
89 }
90 }
91 (CpuMode::Kernel, _) => DsoKey::Kernel,
92 (CpuMode::GuestKernel, _) => DsoKey::GuestKernel,
93 (CpuMode::User | CpuMode::GuestUser, _) => DsoKey::User {
94 file_name: String::from_utf8_lossy(filename).into(),
95 full_path: path.to_owned(),
96 },
97 _ => return None,
98 };
99 Some(dso_key)
100 }
101
102 pub fn name(&self) -> &str {
105 match self {
106 DsoKey::Kernel => "[kernel.kallsyms]", DsoKey::GuestKernel => "[guest.kernel.kallsyms]",
108 DsoKey::Vdso32 => "[vdso32]",
109 DsoKey::VdsoX32 => "[vdsox32]",
110 DsoKey::Vdso64 => "[vdso]",
111 DsoKey::Vsyscall => "[vsyscall]",
112 DsoKey::KernelModule { name } => name,
113 DsoKey::User { file_name, .. } => file_name,
114 }
115 }
116}