diff options
author | 2019-02-07 15:36:16 -0800 | |
---|---|---|
committer | 2019-02-07 15:36:16 -0800 | |
commit | f70c546f98a8c4d183c50814820dd7d5458e927d (patch) | |
tree | ac2c59a5b29a580ecefcf5e2499466e592758966 /src | |
parent | 33366dcdf4ea4127f4b24a774e70fc7b0c7daee0 (diff) | |
download | rust-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.rs | 28 |
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 +} |