From 6a52d123672b7a00af6e22b4c138205be2042a94 Mon Sep 17 00:00:00 2001 From: Alexis211 Date: Sat, 6 Feb 2010 20:51:56 +0100 Subject: Reorganisation --- src/kernel/core/kmain.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/kernel/core/kmain.c (limited to 'src/kernel/core/kmain.c') diff --git a/src/kernel/core/kmain.c b/src/kernel/core/kmain.c new file mode 100644 index 0000000..ef92dff --- /dev/null +++ b/src/kernel/core/kmain.c @@ -0,0 +1,63 @@ +#include +#include "multiboot.h" +#include "monitor.h" +#include "sys.h" +#include +#include +#include +#include +#include +#include +#include + +void kmain(struct multiboot_info_t* mbd, int32_t magic) { + size_t totalRam = 0; + uint32_t i; + + mem_placementAddr = (size_t)&end; + mbd->cmdline += 0xE0000000; mbd->mods_addr += 0xE0000000; + struct module_t *mods = (struct module_t*)mbd->mods_addr; + for (i = 0; i < mbd->mods_count; i++) { + mods[i].mod_start += 0xE0000000; + mods[i].mod_end += 0xE0000000; + mods[i].string += 0xE0000000; + if (mods[i].mod_end > mem_placementAddr) + mem_placementAddr = (mods[i].mod_end & 0xFFFFF000) + 0x1000; + } + + monitor_clear(); + + if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { + PANIC("wrong multiboot magic number."); + } + + monitor_write("Grapes kernel booting ...\n"); + + idt_init(); + + totalRam = ((mbd->mem_upper + mbd->mem_lower) * 1024); + paging_init(totalRam); + gdt_init(); + paging_cleanup(); + kheap_init(); + timer_init(20); + tasking_init(); + + monitor_write("Loading modules...\n"); + for (i = 0; i < mbd->mods_count; i++) { + monitor_write((char*)mods[i].string); + if (elf_check((uint8_t*)mods[i].mod_start)) { + monitor_write(" : Invalid ELF file\n"); + } else { + if (elf_exec((uint8_t*)mods[i].mod_start) == 0) { + monitor_write(" : Error loading\n"); + } else { + monitor_write(" : OK\n"); + } + } + } + + monitor_write("Passing control to loaded modules...\n"); + sti(); + tasking_switch(); +} -- cgit v1.2.3