use crate::task::TaskContextApi;
core::arch::global_asm!(include_str!("switch.S"));
#[derive(Debug, Default, Clone, Copy)]
#[repr(C)]
pub(crate) struct TaskContext {
    pub regs: CalleeRegs,
    pub rip: usize,
}
impl TaskContext {
    pub const fn new() -> Self {
        Self {
            regs: CalleeRegs::new(),
            rip: 0,
        }
    }
}
#[derive(Debug, Default, Clone, Copy)]
#[repr(C)]
pub struct CalleeRegs {
    pub rsp: u64,
    pub rbx: u64,
    pub rbp: u64,
    pub r12: u64,
    pub r13: u64,
    pub r14: u64,
    pub r15: u64,
}
impl CalleeRegs {
    pub const fn new() -> Self {
        CalleeRegs {
            rsp: 0,
            rbx: 0,
            rbp: 0,
            r12: 0,
            r13: 0,
            r14: 0,
            r15: 0,
        }
    }
}
impl TaskContextApi for TaskContext {
    fn set_instruction_pointer(&mut self, ip: usize) {
        self.rip = ip;
    }
    fn instruction_pointer(&self) -> usize {
        self.rip
    }
    fn set_stack_pointer(&mut self, sp: usize) {
        self.regs.rsp = sp as u64;
    }
    fn stack_pointer(&self) -> usize {
        self.regs.rsp as usize
    }
}
extern "C" {
    pub(crate) fn context_switch(cur: *mut TaskContext, nxt: *const TaskContext);
}