aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Gerd Zellweger <mail@gerdzellweger.com> 2019-02-07 15:36:16 -0800
committerGravatar Gerd Zellweger <mail@gerdzellweger.com> 2019-02-07 15:36:16 -0800
commitf70c546f98a8c4d183c50814820dd7d5458e927d (patch)
treeac2c59a5b29a580ecefcf5e2499466e592758966 /src
parent33366dcdf4ea4127f4b24a774e70fc7b0c7daee0 (diff)
downloadrust-x86-f70c546f98a8c4d183c50814820dd7d5458e927d.tar.gz
rust-x86-f70c546f98a8c4d183c50814820dd7d5458e927d.tar.zst
rust-x86-f70c546f98a8c4d183c50814820dd7d5458e927d.zip
Add fs/gs read/write functions.
Diffstat (limited to 'src')
-rw-r--r--src/bits64/segmentation.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/bits64/segmentation.rs b/src/bits64/segmentation.rs
index 11b49e7..20022b8 100644
--- a/src/bits64/segmentation.rs
+++ b/src/bits64/segmentation.rs
@@ -137,3 +137,31 @@ pub unsafe fn load_cs(sel: SegmentSelector) {
lretq; \
1:" :: "ri" (sel.bits() as usize) : "rax" "memory");
}
+
+/// Write GS Segment Base
+/// Needs FSGSBASE-Enable Bit (bit 16 of CR4) set.
+pub unsafe fn wrgsbase(base: u64) {
+ asm!("wrgsbase $0" :: "r" (base) : "memory");
+}
+
+/// Write FS Segment Base
+/// Needs FSGSBASE-Enable Bit (bit 16 of CR4) set.
+pub unsafe fn wrfsbase(base: u64) {
+ asm!("wrfsbase $0" :: "r" (base) : "memory");
+}
+
+/// Read GS Segment Base
+/// Needs FSGSBASE-Enable Bit (bit 16 of CR4) set.
+pub unsafe fn rdgsbase() -> u64 {
+ let gs_base: u64;
+ asm!("rdgsbase $0" : "=r" (gs_base) );
+ gs_base
+}
+
+/// Read FS Segment Base
+/// Needs FSGSBASE-Enable Bit (bit 16 of CR4) set.
+pub unsafe fn rdfsbase() -> u64 {
+ let fs_base: u64;
+ asm!("rdfsbase $0" : "=r" (fs_base) );
+ fs_base
+}