aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nikolay Edigaryev <edigaryev@gmail.com> 2019-08-09 12:13:48 +0300
committerGravatar Nikolay Edigaryev <edigaryev@gmail.com> 2019-08-09 12:20:24 +0300
commite81dec0bb0224490a83ffb0fbbb3b2f85808f60f (patch)
treeffea5cb3ec9f3d9aaa40028490677668ccafc0bc
parent12d30ca3792ae41a7b0b1a2bdaacb428b9688625 (diff)
downloadrust-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.rs35
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::*;