summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-01-20 02:27:16 +0100
committerNeal H. Walfield <neal@gnu.org>2009-01-20 04:48:41 +0100
commitb19d7cc43fcd7bcb991e8d20b0b892221772eecc (patch)
tree09c113332583e3e7f21b74bb2a12c1a0728290d5
parent70961719e9d2e129a77096dca0875c07e51c7a98 (diff)
Small clean ups, a few asserts, and a bit of debugging output.
-rw-r--r--viengoos/sysdeps/x86_64/boot32.c7
-rw-r--r--viengoos/sysdeps/x86_64/boot64.c42
-rw-r--r--viengoos/sysdeps/x86_64/x86-64.h93
3 files changed, 102 insertions, 40 deletions
diff --git a/viengoos/sysdeps/x86_64/boot32.c b/viengoos/sysdeps/x86_64/boot32.c
index cf73f0d..cfe93fd 100644
--- a/viengoos/sysdeps/x86_64/boot32.c
+++ b/viengoos/sysdeps/x86_64/boot32.c
@@ -30,10 +30,15 @@
#define KERNEL_OFFSET 0xffffffff80000000ul
+/* We can't use <stdint.h>: we are compiling in 32-bit mode. */
typedef unsigned short u16;
typedef unsigned long u32;
typedef unsigned long long u64;
+build_assert (sizeof (u16) == 2);
+build_assert (sizeof (u32) == 4);
+build_assert (sizeof (u64) == 8);
+
#define CR4_PAE (1 << 5)
#define CR0_PE (1 << 31)
@@ -68,7 +73,7 @@ cmain32 (u32 magic, u32 addr)
/* b) setup (initial) PML4 (maps first 1G) */
int i;
for (i = 0; i < PTES; ++i)
- pdir.entry[i] = pde (i * 0x200000, false, PTE_RWX, true);
+ pdir.entry[i] = pde (i * (1 << (9 + 12)), false, PTE_RWX, true);
pdp.entry[0] = pdpe ((uint64_t) (uint32_t) &pdir, false, PTE_RWX, false);
pdp.entry[ADDR_PDP_INDEX (KERNEL_OFFSET)] = pdp.entry[0];
diff --git a/viengoos/sysdeps/x86_64/boot64.c b/viengoos/sysdeps/x86_64/boot64.c
index 9c9cbd7..544c6d8 100644
--- a/viengoos/sysdeps/x86_64/boot64.c
+++ b/viengoos/sysdeps/x86_64/boot64.c
@@ -58,6 +58,43 @@
/* The multiboot info. */
static multiboot_info_t* boot_info;
+static void
+debug_dump (void)
+{
+ multiboot_info_t *mbi = (multiboot_info_t *) boot_info;
+
+ if (CHECK_FLAG (mbi->flags, 9))
+ debug (1, "Booted by %s", (char *) (uintptr_t) mbi->boot_loader_name);
+
+ if (CHECK_FLAG (mbi->flags, 0))
+ debug (1, "Memory: Lower %u KB, Upper %u KB",
+ mbi->mem_lower, mbi->mem_upper);
+
+ if (CHECK_FLAG (mbi->flags, 3))
+ {
+ module_t *mod = (module_t *) (uintptr_t) mbi->mods_addr;
+ int nr;
+
+ for (nr = 0; nr < mbi->mods_count; nr++)
+ debug (1, "Module %i: Start 0x%x, End 0x%x, Cmd %s",
+ nr + 1, mod[nr].mod_start, mod[nr].mod_end,
+ (char *) (uintptr_t) mod[nr].string);
+ }
+
+ if (CHECK_FLAG (mbi->flags, 6))
+ {
+ memory_map_t *mmap;
+ int nr = 1;
+
+ for (mmap = (memory_map_t *) (uintptr_t) mbi->mmap_addr;
+ (uint64_t) mmap < mbi->mmap_addr + mbi->mmap_length;
+ mmap = (memory_map_t *) ((uint64_t) mmap
+ + mmap->size + sizeof (mmap->size)))
+ debug (1, "Memory Map %i: Type %i, Base 0x%lx, Length 0x%lx",
+ nr++, mmap->type, mmap->base_addr, mmap->length);
+ }
+}
+
int main (int argc, char *argv[]);
void
cmain (uint32_t magic, uint32_t addr)
@@ -157,6 +194,11 @@ char stack[STACK_SIZE] __attribute__((__aligned__(16)));
void
arch_bootstrap (void)
{
+ /* We wait until now to dump the multiboot infor structure as this
+ is the first function called after the output device has been
+ configured. */
+ debug_dump ();
+
/* setup gdt (also does syscall/sysret setup) */
gdt_init ();
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