summaryrefslogtreecommitdiff
path: root/viengoos/sysdeps/x86_64/x86-64.h
diff options
context:
space:
mode:
Diffstat (limited to 'viengoos/sysdeps/x86_64/x86-64.h')
-rw-r--r--viengoos/sysdeps/x86_64/x86-64.h93
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