use crate::{from_iter, from_iter_radix, ProcResult};
#[cfg(feature = "serde1")]
use serde::{Deserialize, Serialize};
use std::io::Read;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum Syscall {
Running,
Blocked {
syscall_number: i64,
argument_registers: [u64; 6],
stack_pointer: u64,
program_counter: u64,
},
}
impl crate::FromRead for Syscall {
fn from_read<R: Read>(mut r: R) -> ProcResult<Self> {
let mut buf = Vec::with_capacity(512);
r.read_to_end(&mut buf)?;
let line = String::from_utf8_lossy(&buf);
let buf = line.trim();
if buf == "running" {
Ok(Self::Running)
} else {
let mut values = buf.split(' ');
let syscall_number: i64 = expect!(from_iter(&mut values), "failed to read syscall number");
let mut argument_registers: [u64; 6] = [0; 6];
for arg_reg in argument_registers.iter_mut() {
*arg_reg = expect!(from_iter_radix(&mut values, 16), "failed to read argument register");
}
let stack_pointer: u64 = expect!(from_iter_radix(&mut values, 16), "failed to read stack pointer");
let program_counter: u64 = expect!(from_iter_radix(&mut values, 16), "failed to read program counter");
Ok(Self::Blocked {
syscall_number,
argument_registers,
stack_pointer,
program_counter,
})
}
}
}