use crate::Ring;
#[derive(Clone, Copy, Debug, Default)]
#[repr(C, packed)]
pub struct TaskStateSegment {
pub reserved: u32,
pub rsp: [u64; 3],
pub reserved2: u64,
pub ist: [u64; 7],
pub reserved3: u64,
pub reserved4: u16,
pub iomap_base: u16,
}
impl TaskStateSegment {
pub const fn new() -> TaskStateSegment {
TaskStateSegment {
reserved: 0,
rsp: [0; 3],
reserved2: 0,
ist: [0; 7],
reserved3: 0,
reserved4: 0,
iomap_base: 0,
}
}
pub fn set_rsp(&mut self, pl: Ring, stack_ptr: u64) {
match pl {
Ring::Ring0 => self.rsp[0] = stack_ptr,
Ring::Ring1 => self.rsp[1] = stack_ptr,
Ring::Ring2 => self.rsp[2] = stack_ptr,
Ring::Ring3 => unreachable!("Can't set stack for PL3"),
}
}
pub fn set_ist(&mut self, index: usize, stack_ptr: u64) {
match index {
0 => self.ist[0] = stack_ptr,
1 => self.ist[1] = stack_ptr,
2 => self.ist[2] = stack_ptr,
3 => self.ist[3] = stack_ptr,
4 => self.ist[4] = stack_ptr,
5 => self.ist[5] = stack_ptr,
6 => self.ist[6] = stack_ptr,
_ => unreachable!("Can't set IST for this index (out of bounds)."),
}
}
}