visor/include/x86/cr.h

61 lines
1.3 KiB
C

#ifndef _VISOR_CR_H_
#define _VISOR_CR_H_
#include <stdint.h>
#define CR4_VMXE (1 << 13)
// TODO properly handle segment registers as 16-bit values
#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 uint16_t
readtr(void)
{
uint16_t v;
__asm__ ("str %0\n\t" : "=a"(v));
return v;
}
static inline uint64_t
readflags(void)
{
uint64_t v;
__asm__ ("pushf\n\tpop %0\n\t" : "=a"(v));
return v;
}
#endif