diff options
author | 2019-08-09 12:13:48 +0300 | |
---|---|---|
committer | 2019-08-09 12:20:24 +0300 | |
commit | e81dec0bb0224490a83ffb0fbbb3b2f85808f60f (patch) | |
tree | ffea5cb3ec9f3d9aaa40028490677668ccafc0bc | |
parent | 12d30ca3792ae41a7b0b1a2bdaacb428b9688625 (diff) | |
download | rust-x86-e81dec0bb0224490a83ffb0fbbb3b2f85808f60f.tar.gz rust-x86-e81dec0bb0224490a83ffb0fbbb3b2f85808f60f.tar.zst rust-x86-e81dec0bb0224490a83ffb0fbbb3b2f85808f60f.zip |
Added functions to return ES, SS, DS, FS and GS segment register values
Currently only the CS register can be read, provide functions for the other
5 registers for completeness.
-rw-r--r-- | src/segmentation.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/segmentation.rs b/src/segmentation.rs index 8757add..1d61476 100644 --- a/src/segmentation.rs +++ b/src/segmentation.rs @@ -568,6 +568,41 @@ pub fn cs() -> SegmentSelector { SegmentSelector::from_raw(segment) } +/// Returns the current value of the extra segment register. +pub fn es() -> SegmentSelector { + let segment: u16; + unsafe { asm!("mov %es, $0" : "=r" (segment) ) }; + SegmentSelector::from_raw(segment) +} + +/// Returns the current value of the stack segment register. +pub fn ss() -> SegmentSelector { + let segment: u16; + unsafe { asm!("mov %ss, $0" : "=r" (segment) ) }; + SegmentSelector::from_raw(segment) +} + +/// Returns the current value of the data segment register. +pub fn ds() -> SegmentSelector { + let segment: u16; + unsafe { asm!("mov %ds, $0" : "=r" (segment) ) }; + SegmentSelector::from_raw(segment) +} + +/// Returns the current value of the FS segment register. +pub fn fs() -> SegmentSelector { + let segment: u16; + unsafe { asm!("mov %fs, $0" : "=r" (segment) ) }; + SegmentSelector::from_raw(segment) +} + +/// Returns the current value of the GS segment register. +pub fn gs() -> SegmentSelector { + let segment: u16; + unsafe { asm!("mov %gs, $0" : "=r" (segment) ) }; + SegmentSelector::from_raw(segment) +} + #[cfg(test)] mod test { use super::*; |