diff --git a/src/segmentation.rs b/src/segmentation.rs index d11a44d..e05227c 100644 --- a/src/segmentation.rs +++ b/src/segmentation.rs @@ -44,6 +44,16 @@ impl SegmentSelector { self.bits >> 3 } + /// Returns the requested privilege level of the selector. + pub fn rpl(&self) -> u16 { + self.bits & 0b11 + } + + /// Returns the table indicator (TI) bit. + pub fn ti(&self) -> u16 { + (self.bits >> 2) & 1 + } + /// Make a new segment selector from a untyped u16 value. pub const fn from_raw(bits: u16) -> SegmentSelector { SegmentSelector { bits } @@ -52,37 +62,12 @@ impl SegmentSelector { impl fmt::Display for SegmentSelector { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let r0 = match self.contains(SegmentSelector::RPL_0) { - false => "", - true => "Ring 0 segment selector.", - }; - let r1 = match self.contains(SegmentSelector::RPL_1) { - false => "", - true => "Ring 1 segment selector.", - }; - let r2 = match self.contains(SegmentSelector::RPL_2) { - false => "", - true => "Ring 2 segment selector.", - }; - let r3 = match self.contains(SegmentSelector::RPL_3) { - false => "", - true => "Ring 3 segment selector.", - }; let tbl = match self.contains(SegmentSelector::TI_LDT) { false => "GDT Table", true => "LDT Table", }; - write!( - f, - "Index {} in {}, {}{}{}{}", - self.bits >> 3, - tbl, - r0, - r1, - r2, - r3 - ) + write!(f, "Index {} in {}, RPL = {}", self.index(), tbl, self.rpl()) } }