visor/include/x86/cr.h

62 lines
1.3 KiB
C
Raw Normal View History

2025-03-10 19:19:53 +01:00
#ifndef _VISOR_CR_H_
#define _VISOR_CR_H_
#include <stdint.h>
2025-03-10 20:24:32 +01:00
#define CR4_VMXE (1 << 13)
2025-03-12 02:33:53 +01:00
// TODO properly handle segment registers as 16-bit values
2025-03-11 01:40:28 +01:00
#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));\
}
2025-03-10 19:19:53 +01:00
2025-03-11 01:40:28 +01:00
/* 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)
2025-03-10 19:19:53 +01:00
2025-03-12 02:33:53 +01:00
static inline uint16_t
readtr(void)
{
uint16_t v;
__asm__ ("str %0\n\t" : "=a"(v));
return v;
}
2025-03-10 19:19:53 +01:00
static inline uint64_t
2025-03-11 01:40:28 +01:00
readflags(void)
2025-03-10 19:19:53 +01:00
{
uint64_t v;
2025-03-11 01:40:28 +01:00
__asm__ ("pushf\n\tpop %0\n\t" : "=a"(v));
2025-03-10 19:19:53 +01:00
return v;
}
#endif