procfs_core/process/
syscall.rs1use crate::{from_iter, from_iter_radix, ProcResult};
2#[cfg(feature = "serde1")]
3use serde::{Deserialize, Serialize};
4
5use std::io::Read;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
12#[non_exhaustive]
13pub enum Syscall {
14 Running,
16 Blocked {
17 syscall_number: i64,
21 argument_registers: [u64; 6],
23 stack_pointer: u64,
25 program_counter: u64,
27 },
28}
29
30impl crate::FromRead for Syscall {
31 fn from_read<R: Read>(mut r: R) -> ProcResult<Self> {
32 let mut buf = Vec::with_capacity(512);
34 r.read_to_end(&mut buf)?;
35
36 let line = String::from_utf8_lossy(&buf);
37 let buf = line.trim();
38
39 if buf == "running" {
40 Ok(Self::Running)
41 } else {
42 let mut values = buf.split(' ');
43
44 let syscall_number: i64 = expect!(from_iter(&mut values), "failed to read syscall number");
45
46 let mut argument_registers: [u64; 6] = [0; 6];
47 for arg_reg in argument_registers.iter_mut() {
48 *arg_reg = expect!(from_iter_radix(&mut values, 16), "failed to read argument register");
49 }
50
51 let stack_pointer: u64 = expect!(from_iter_radix(&mut values, 16), "failed to read stack pointer");
52 let program_counter: u64 = expect!(from_iter_radix(&mut values, 16), "failed to read program counter");
53
54 Ok(Self::Blocked {
55 syscall_number,
56 argument_registers,
57 stack_pointer,
58 program_counter,
59 })
60 }
61 }
62}