From b19d7cc43fcd7bcb991e8d20b0b892221772eecc Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Tue, 20 Jan 2009 02:27:16 +0100 Subject: Small clean ups, a few asserts, and a bit of debugging output. --- viengoos/sysdeps/x86_64/boot32.c | 7 ++- viengoos/sysdeps/x86_64/boot64.c | 42 ++++++++++++++++++ viengoos/sysdeps/x86_64/x86-64.h | 93 +++++++++++++++++++++++----------------- 3 files changed, 102 insertions(+), 40 deletions(-) (limited to 'viengoos') 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 : 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 #include +#include - -/* 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 -- cgit v1.2.3