1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
//! Provides a type for the task state segment structure. use VirtAddr; /// In 64-bit mode the TSS holds information that is not /// directly related to the task-switch mechanism, /// but is used for finding kernel level stack /// if interrupts arrive while in kernel mode. #[repr(C, packed)] pub struct TaskStateSegment { reserved_1: u32, /// The full 64-bit canonical forms of the stack pointers (RSP) for privilege levels 0-2. pub privilege_stack_table: [VirtAddr; 3], reserved_2: u64, /// The full 64-bit canonical forms of the interrupt stack table (IST) pointers. pub interrupt_stack_table: [VirtAddr; 7], reserved_3: u64, reserved_4: u16, /// The 16-bit offset to the I/O permission bit map from the 64-bit TSS base. pub iomap_base: u16, } impl TaskStateSegment { /// Creates a new TSS with zeroed privilege and interrupt stack table and a zero /// `iomap_base`. pub const fn new() -> TaskStateSegment { TaskStateSegment { privilege_stack_table: [VirtAddr::zero(); 3], interrupt_stack_table: [VirtAddr::zero(); 7], iomap_base: 0, reserved_1: 0, reserved_2: 0, reserved_3: 0, reserved_4: 0, } } }