diff options
Diffstat (limited to 'include/arch/x86_64/msr.h')
-rw-r--r-- | include/arch/x86_64/msr.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/include/arch/x86_64/msr.h b/include/arch/x86_64/msr.h new file mode 100644 index 0000000..c20f8fc --- /dev/null +++ b/include/arch/x86_64/msr.h @@ -0,0 +1,56 @@ +#ifndef _JOVE_x86_64_MSR_H +#define _JOVE_x86_64_MSR_H 1 + +#include <stddef.h> +#include <stdint.h> + +#define MSR_EFER 0xC0000080 +#define MSR_STAR 0xC0000081 +#define MSR_LSTAR 0xC0000082 +#define MSR_SFMASK 0xC0000084 + +#define MSR_FSBASE 0xC0000100 +#define MSR_GSBASE 0xC0000101 +#define MSR_KERNELGSBASE 0xC0000102 + +typedef union msr_efer +{ + struct { + uint8_t sce : 1; + uint8_t resv : 7; + uint8_t lme : 1; + uint8_t unk0 : 1; + uint8_t lma : 1; + uint8_t nxe : 1; + uint8_t svme : 1; + uint8_t lmsle : 1; + uint8_t ffxsr : 1; + uint8_t tce : 1; + }; + uint32_t v[2]; +} msr_efer_t; + +typedef union msr_star +{ + struct { + uint32_t eip; + uint16_t kcs; + uint16_t ucs; + }; + uint32_t v[2]; +} msr_star_t; +typedef uintptr_t msr_lstar_t; + +void msr_efer_write(msr_efer_t v); +msr_efer_t msr_efer_read(void); + +void msr_star_write(msr_star_t v); +msr_star_t msr_star_read(void); + +void msr_lstar_write(msr_lstar_t v); +msr_lstar_t msr_lstar_read(void); + +void msr_gsbase_write(uintptr_t gsbase); +uintptr_t msr_gsbase_read(void); + +#endif |