diff options
Diffstat (limited to 'src/descriptor.rs')
-rw-r--r-- | src/descriptor.rs | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/src/descriptor.rs b/src/descriptor.rs deleted file mode 100644 index aff4f0e..0000000 --- a/src/descriptor.rs +++ /dev/null @@ -1,194 +0,0 @@ -//! Fields which are common to all segment-section and gate descriptors - -use ::PrivilegeLevel; -use ::segmentation; - -/// System-Segment and Gate-Descriptor Types for IA32e mode. When the `S` -/// (descriptor type) flag in a segment descriptor is clear, the descriptor type -/// is a system descriptor. -/// -/// See Intel manual 3a, 3.5 "System Descriptor Types", and Table 3-2, -/// System-Segment and Gate-Descriptor Types". -#[repr(u8)] -pub enum SystemType { - // Reserved = 0 - TssAvailable = 1, - /// Only for 16-bit - LocalDescriptorTable = 2, - TssBusy = 3, - CallGate = 4, - /// Only for 16-bit - TaskGate = 5, - InterruptGate = 6, - TrapGate = 7, -} - -/// A high-level representation of a descriptor type. One can convert to and -/// from the `Flags` bitfield to encode/decode an actual descriptor. -#[repr(u8)] -pub enum Type { - SystemDescriptor { - /// false/0: 16-bit - /// true/1: native (32- or 64-bit) - size: bool, - ty: SystemType - }, - SegmentDescriptor { - ty: segmentation::Type, - accessed: bool - } -} - -impl Type { - pub fn pack(self) -> u8 { - match self { - Type::SystemDescriptor { size, ty } => - (size as u8) << 3 | (ty as u8) | FLAGS_TYPE_SYS.bits, - Type::SegmentDescriptor { ty, accessed } => - (accessed as u8) | ty.pack() | FLAGS_TYPE_SEG.bits, - } - } -} - - -bitflags!{ - /// Actual encoding of the flags in byte 6 common to all descriptors. - /// - /// See Intel manual 3a, figures 3-8, 6-2, and 6-7. - pub flags Flags: u8 { - /// Descriptor is Present. - const FLAGS_PRESENT = 1 << 7, - - // Descriptor privilege level - const FLAGS_DPL_RING_0 = 0b00 << 5, - const FLAGS_DPL_RING_1 = 0b01 << 5, - const FLAGS_DPL_RING_2 = 0b10 << 5, - const FLAGS_DPL_RING_3 = 0b11 << 5, - - // Is system descriptor - const FLAGS_TYPE_SYS = 0 << 4, - const FLAGS_TYPE_SEG = 1 << 4, - - // System-Segment and Gate-Descriptor Types. - // When the S (descriptor type) flag in a segment descriptor is clear, - // the descriptor type is a system descriptor - - // All modes (supporting segments) - const TYPE_SYS_LDT = 0b0_0010, - - // Protected Mode and older - const FLAGS_TYPE_SYS_16BIT_TSS_AVAILABLE = 0b0_0001, - const FLAGS_TYPE_SYS_16BIT_TSS_BUSY = 0b0_0011, - const FLAGS_TYPE_SYS_16BIT_CALL_GATE = 0b0_0100, - const FLAGS_TYPE_SYS_16BIT_TASK_GATE = 0b0_0101, - const FLAGS_TYPE_SYS_16BIT_INTERRUPT_GATE = 0b0_0110, - const FLAGS_TYPE_SYS_16BIT_TRAP_GATE = 0b0_0111, - - // 64-bit in IA-32e Mode (either submode), 32-bit in Protected Mode - const FLAGS_TYPE_SYS_NATIVE_TSS_AVAILABLE = 0b0_1001, - const FLAGS_TYPE_SYS_NATIVE_TSS_BUSY = 0b0_1011, - const FLAGS_TYPE_SYS_NATIVE_CALL_GATE = 0b0_1100, - const FLAGS_TYPE_SYS_NATIVE_INTERRUPT_GATE = 0b0_1110, - const FLAGS_TYPE_SYS_NATIVE_TRAP_GATE = 0b0_1111, - - // Code- and Data-Segment Descriptor Types. - // When the S (descriptor type) flag in a segment descriptor is set, - // the descriptor is for either a code or a data segment. - - /// Data or code, accessed - const FLAGS_TYPE_SEG_ACCESSED = 0b1_0001, - - const FLAGS_TYPE_DATA = 0b1_0000, - const FLAGS_TYPE_CODE = 0b1_1000, - - // Data => permissions - const FLAGS_TYPE_SEG_D_WRITE = 0b1_0010, - const FLAGS_TYPE_SEG_D_EXPAND_DOWN = 0b1_0100, - - // Code => permissions - const FLAGS_TYPE_SEG_C_READ = 0b1_0010, - const FLAGS_TYPE_SEG_C_CONFORMING = 0b1_0100, - - /// Data Read-Only - const FLAGS_TYPE_SEG_D_RO = FLAGS_TYPE_DATA.bits, - /// Data Read-Only, accessed - const FLAGS_TYPE_SEG_D_ROA = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Data Read/Write - const FLAGS_TYPE_SEG_D_RW = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_WRITE.bits, - /// Data Read/Write, accessed - const FLAGS_TYPE_SEG_D_RWA = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_WRITE.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Data Read-Only, expand-down - const FLAGS_TYPE_SEG_D_ROEXD = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_EXPAND_DOWN.bits, - /// Data Read-Only, expand-down, accessed - const FLAGS_TYPE_SEG_D_ROEXDA = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_EXPAND_DOWN.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Data Read/Write, expand-down - const FLAGS_TYPE_SEG_D_RWEXD = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_WRITE.bits - | FLAGS_TYPE_SEG_D_EXPAND_DOWN.bits, - /// Data Read/Write, expand-down, accessed - const FLAGS_TYPE_SEG_D_RWEXDA = FLAGS_TYPE_DATA.bits - | FLAGS_TYPE_SEG_D_WRITE.bits - | FLAGS_TYPE_SEG_D_EXPAND_DOWN.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - - /// Code Execute-Only - const FLAGS_TYPE_SEG_C_EO = FLAGS_TYPE_CODE.bits, - /// Code Execute-Only, accessed - const FLAGS_TYPE_SEG_C_EOA = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Code Execute/Read - const FLAGS_TYPE_SEG_C_ER = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_READ.bits, - /// Code Execute/Read, accessed - const FLAGS_TYPE_SEG_C_ERA = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_READ.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Code Execute-Only, conforming - const FLAGS_TYPE_SEG_C_EOC = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_CONFORMING.bits, - /// Code Execute-Only, conforming, accessed - const FLAGS_TYPE_SEG_C_EOCA = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_CONFORMING.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - /// Code Execute/Read, conforming - const FLAGS_TYPE_SEG_C_ERC = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_READ.bits - | FLAGS_TYPE_SEG_C_CONFORMING.bits, - /// Code Execute/Read, conforming, accessed - const FLAGS_TYPE_SEG_C_ERCA = FLAGS_TYPE_CODE.bits - | FLAGS_TYPE_SEG_C_READ.bits - | FLAGS_TYPE_SEG_C_CONFORMING.bits - | FLAGS_TYPE_SEG_ACCESSED.bits, - } -} - -impl Flags { - pub const BLANK: Flags = Flags { bits: 0 }; - - pub const fn from_priv(dpl: PrivilegeLevel) -> Flags { - Flags { bits: (dpl as u8) << 5 } - } - - pub fn from_type(ty: Type) -> Flags { - Flags { bits: ty.pack() } - } - - pub const fn const_or(self, other: Self) -> Flags { - Flags { bits: self.bits | other.bits } - } - - pub const fn cond(self, cond: bool) -> Flags { - Flags { bits: (-(cond as i8) as u8) & self.bits } - } - - pub const fn const_mux(self, other: Self, cond: bool) -> Flags { - self.cond(cond).const_or(other.cond(!cond)) - } -} |