51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
#ifndef _VISOR_CR_H_
|
|
#define _VISOR_CR_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#define CR4_VMXE (1 << 13)
|
|
|
|
#define DECLARE_REGISTER_ACCESSORS(regname)\
|
|
static inline uint64_t read##regname(void) {\
|
|
uint64_t v;\
|
|
__asm__ ("mov %%" #regname ", %0\n\t" : "=a"(v));\
|
|
return v;\
|
|
}\
|
|
static inline void write##regname(uint64_t v) {\
|
|
__asm__ ("mov %0, %%" #regname "\n\t" :: "a"(v));\
|
|
}
|
|
|
|
/* Segment Selectors */
|
|
DECLARE_REGISTER_ACCESSORS(es)
|
|
DECLARE_REGISTER_ACCESSORS(cs)
|
|
DECLARE_REGISTER_ACCESSORS(ss)
|
|
DECLARE_REGISTER_ACCESSORS(ds)
|
|
DECLARE_REGISTER_ACCESSORS(fs)
|
|
DECLARE_REGISTER_ACCESSORS(gs)
|
|
|
|
/* Control Registers */
|
|
DECLARE_REGISTER_ACCESSORS(cr0)
|
|
DECLARE_REGISTER_ACCESSORS(cr1)
|
|
DECLARE_REGISTER_ACCESSORS(cr2)
|
|
DECLARE_REGISTER_ACCESSORS(cr3)
|
|
DECLARE_REGISTER_ACCESSORS(cr4)
|
|
|
|
/* Debug Registers */
|
|
DECLARE_REGISTER_ACCESSORS(dr0)
|
|
DECLARE_REGISTER_ACCESSORS(dr1)
|
|
DECLARE_REGISTER_ACCESSORS(dr2)
|
|
DECLARE_REGISTER_ACCESSORS(dr3)
|
|
DECLARE_REGISTER_ACCESSORS(dr4)
|
|
DECLARE_REGISTER_ACCESSORS(dr5)
|
|
DECLARE_REGISTER_ACCESSORS(dr6)
|
|
DECLARE_REGISTER_ACCESSORS(dr7)
|
|
|
|
static inline uint64_t
|
|
readflags(void)
|
|
{
|
|
uint64_t v;
|
|
__asm__ ("pushf\n\tpop %0\n\t" : "=a"(v));
|
|
return v;
|
|
}
|
|
|
|
#endif
|