1use super::sdb_error::SdbError;
2use nix::libc::c_long;
3use std::collections::HashMap;
4use std::sync::LazyLock;
5use syscall_numbers::x86_64::sys_call_name;
6
7const MAX_SYSCALL_NUMBER: i64 = 0x1ff;
8
9static SYSCALL_NAME_TO_NUM: LazyLock<HashMap<&'static str, c_long>> = LazyLock::new(|| {
10 let mut map = HashMap::with_capacity(MAX_SYSCALL_NUMBER as usize);
11 for n in 0..=MAX_SYSCALL_NUMBER {
12 if let Some(name) = sys_call_name(n) {
13 if !name.is_empty() {
14 map.insert(name, n as c_long);
15 }
16 }
17 }
18 map
19});
20
21pub fn syscall_name_to_id(name: &str) -> Result<c_long, SdbError> {
22 SYSCALL_NAME_TO_NUM
23 .get(name)
24 .copied()
25 .ok_or(SdbError::new_err(&format!("No such syscall name: {name}")))
26}
27
28pub fn syscall_id_to_name(id: c_long) -> Result<&'static str, SdbError> {
29 sys_call_name(id).ok_or(SdbError::new_err(&format!("No such syscall id: {id}")))
30}