x86/bits16/
segmentation.rs

1use crate::segmentation::{
2    DescriptorBuilder, DescriptorType, GateDescriptorBuilder, SegmentSelector,
3    SystemDescriptorTypes32,
4};
5
6impl GateDescriptorBuilder<u16> for DescriptorBuilder {
7    fn tss_descriptor(base: u64, limit: u64, available: bool) -> DescriptorBuilder {
8        let typ = match available {
9            true => DescriptorType::System32(SystemDescriptorTypes32::TSSAvailable16),
10            false => DescriptorType::System32(SystemDescriptorTypes32::TSSBusy16),
11        };
12
13        DescriptorBuilder::with_base_limit(base, limit).set_type(typ)
14    }
15
16    fn call_gate_descriptor(selector: SegmentSelector, offset: u16) -> DescriptorBuilder {
17        DescriptorBuilder::with_selector_offset(selector, offset.into()).set_type(
18            DescriptorType::System32(SystemDescriptorTypes32::CallGate16),
19        )
20    }
21
22    fn interrupt_descriptor(selector: SegmentSelector, offset: u16) -> DescriptorBuilder {
23        DescriptorBuilder::with_selector_offset(selector, offset.into()).set_type(
24            DescriptorType::System32(SystemDescriptorTypes32::InterruptGate16),
25        )
26    }
27
28    fn trap_gate_descriptor(selector: SegmentSelector, offset: u16) -> DescriptorBuilder {
29        DescriptorBuilder::with_selector_offset(selector, offset.into()).set_type(
30            DescriptorType::System32(SystemDescriptorTypes32::TrapGate16),
31        )
32    }
33}