diff options
Diffstat (limited to 'viengoos/sysdeps/x86_64/x86-64.h')
-rw-r--r-- | viengoos/sysdeps/x86_64/x86-64.h | 93 |
1 files changed, 54 insertions, 39 deletions
diff --git a/viengoos/sysdeps/x86_64/x86-64.h b/viengoos/sysdeps/x86_64/x86-64.h index 189fde7..332f571 100644 --- a/viengoos/sysdeps/x86_64/x86-64.h +++ b/viengoos/sysdeps/x86_64/x86-64.h @@ -20,14 +20,11 @@ #ifndef X86_64_X86_64_H #define X86_64_X86_64_H X86_64_X86_64_H + #include <stdbool.h> #include <stdint.h> +#include <assert.h> - -/* rfl (3.1.7) */ -#define X86_64_RFL_IF (1 << 9) - - /* read the time stamp counter */ static inline uint64_t __attribute__ ((__always_inline__)) @@ -170,8 +167,12 @@ x86_64_wrmsr (uint32_t msr, uintptr_t v) /* efer - extended feature enable register (3.1.8) */ -#define X86_64_EFER_SCE (1 << 0) /* system call extensions */ -#define X86_64_EFER_LMA (1 << 10) /* long mode active */ +/* System call extensions. */ +#define X86_64_EFER_SCE (1 << 0) +/* Long mode enable. */ +#define X86_64_EFER_LME (1 << 8) +/* Long mode active. */ +#define X86_64_EFER_LMA (1 << 10) /* STAR (6.1.1) */ @@ -183,47 +184,61 @@ x86_64_star_set (uintptr_t call_selector, uintptr_t ret_selector) } -/* rflags (3.1.7) */ -typedef union PACKED +/* RFLAGS (3.1.7). */ +struct rflags { - struct + union { - uintptr_t cf : 1; /* carry flag */ - uintptr_t rsv_rao : 1; /* reserved, read as one */ - uintptr_t pf : 1; /* parity flag */ - uintptr_t rsv_raz1 : 1; /* reserved, read as zero */ - uintptr_t af : 1; /* auxiliary flag */ - uintptr_t rsv_raz2 : 1; - uintptr_t zf : 1; /* zero flag */ - uintptr_t sf : 1; /* sign flag */ - uintptr_t tf : 1; /* trap flag */ - uintptr_t if_ : 1; /* interrupt flag (if is a keyword) */ - uintptr_t df : 1; /* direction flag */ - uintptr_t of : 1; /* overflow flag */ - uintptr_t iopl : 2; /* io privilege level */ - uintptr_t nt : 1; /* nested task */ - uintptr_t rsv_raz3 : 1; - uintptr_t rf : 1; /* resume flag */ - uintptr_t vm : 1; /* virtual 8086 mode */ - uintptr_t ac : 1; /* alignment check */ - uintptr_t vif : 1; /* virtual interrupt flag */ - uintptr_t vip : 1; /* virtual interrupt pending */ - uintptr_t id : 1; /* id flag */ - uintptr_t rsv_raz4 : 42; + struct + { + uintptr_t cf : 1; /* carry flag */ + uintptr_t rsv_rao : 1; /* reserved, read as one */ + uintptr_t pf : 1; /* parity flag */ + uintptr_t rsv_raz1 : 1; /* reserved, read as zero */ + uintptr_t af : 1; /* auxiliary flag */ + uintptr_t rsv_raz2 : 1; + uintptr_t zf : 1; /* zero flag */ + uintptr_t sf : 1; /* sign flag */ + uintptr_t tf : 1; /* trap flag */ + uintptr_t if_ : 1; /* interrupt flag (if is a keyword) */ + uintptr_t df : 1; /* direction flag */ + uintptr_t of : 1; /* overflow flag */ + uintptr_t iopl : 2; /* io privilege level */ + uintptr_t nt : 1; /* nested task */ + uintptr_t rsv_raz3 : 1; + uintptr_t rf : 1; /* resume flag */ + uintptr_t vm : 1; /* virtual 8086 mode */ + uintptr_t ac : 1; /* alignment check */ + uintptr_t vif : 1; /* virtual interrupt flag */ + uintptr_t vip : 1; /* virtual interrupt pending */ + uintptr_t id : 1; /* id flag */ + uintptr_t rsv_raz4 : 42; + }; + uintptr_t raw; }; - uintptr_t raw; -} rflags_t; +}; +build_assert (sizeof (struct rflags) == sizeof (uint64_t)); -static inline void -x86_64_rflags_get (rflags_t* rfl) +#define RFLAGS(value) \ + ({ \ + struct rflags _rflags = { { .raw = (value) } }; \ + _rflags; \ + }) + +#define X86_64_RFL_IF (1 << 9) + +static inline struct rflags +x86_64_rflags_get (void) { - asm volatile ("pushfq;popq %0" : "=r" (rfl -> raw)); + struct rflags rflags; + asm volatile ("pushfq; popq %0" : "=r" (rflags.raw)); + return rflags; } static inline void -x86_64_rflags_set (rflags_t* r) +x86_64_rflags_set (struct rflags rflags) { - asm volatile ("pushq %0;popfq" :: "r" (r -> raw)); + asm volatile ("pushq %0; popfq" :: "r" (rflags.raw)); } #endif |