use super::arch::*;
use crate::prelude::*;
use crate::regs::{get_reg, set_reg};
use crate::sys::get_cpu;
#[derive(Copy, Clone, Debug)]
pub struct SyscallRegs {
sys_num_reg: target_ulong,
arg_regs: [target_ulong; SYSCALL_ARGS_LEN],
}
impl SyscallRegs {
pub fn backup() -> Self {
let cpu = unsafe { &mut *get_cpu() };
let sys_num_reg = get_reg(cpu, SYSCALL_NUM_REG);
let arg_regs = SYSCALL_ARGS.map(|storage| storage.read(cpu));
Self {
sys_num_reg,
arg_regs,
}
}
pub fn restore(self) {
let Self {
sys_num_reg,
arg_regs,
} = self;
let cpu = unsafe { &mut *get_cpu() };
set_reg(cpu, SYSCALL_NUM_REG, sys_num_reg);
for (&storage, &val) in SYSCALL_ARGS.iter().zip(arg_regs.iter()) {
storage.write(cpu, val);
}
}
}