#include "k_bootstrap.h" #include "k_main.h" #include "hos_types.h" #include "hos_defines.h" #include "multiboot.h" #include "sys/cpu.h" #include "k_early_panic.h" #include "mm/mm.h" #include "lang/kio.h" #include "isr/interrupts.h" #define DEBUG_LETTER(col,chr) *(u16_t *)(KERNEL_OFFSET + CONSOLE_MEMORY \ + 160 * 8 + (col) * 2) \ = 0x0700 | (chr) extern "C" { u8_t bootstrap_stack[4096]; /************************************************************************** * Multiboot header data block * *************************************************************************/ u32_t mb_header[] __attribute__ ((section (".multiboot_header") )) = { MB_HEADER_MAGIC, /* magic */ MB_HEADER_FLAGS, /* flags */ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS) /* checksum */ }; /************************************************************************** * This function is invoked to bootstrap the kernel. * *************************************************************************/ void k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) { DEBUG_LETTER(1, 'b'); if (mb_magic != MB_BOOTLOADER_MAGIC) { k_early_panic("Bad multiboot magic identifier!"); } if ( ! (mb_info->flags & MB_BOOTLOADER_MMAP) ) { k_early_panic("No memory map provided by bootloader!"); } for (mb_mmap_t * mmap = (mb_mmap_t *) (mb_info->mmap_addr + KERNEL_OFFSET), * end = (mb_mmap_t *) ((u32_t)mmap + mb_info->mmap_length); mmap < end; mmap = (mb_mmap_t *) (((u32_t)mmap) + mmap->size + 4)) { // kprintf(" ** size: %d, type: %d ", mmap->size, mmap->type); mm_record_mmap_entry(mmap); } DEBUG_LETTER(2, 'c'); /* * These functions could destroy the multiboot information block and * associated structures, so we must be finished reading those structures * before calling them. */ mm_bootstrap(); DEBUG_LETTER(3, 'd'); interrupts_bootstrap(); DEBUG_LETTER(4, 'e'); kio_bootstrap(); DEBUG_LETTER(5, 'f'); /* begin using the permanent stack */ write_esp(KERNEL_STACK_TOP); k_main(); idle_loop(); } void idle_loop() { for (;;) { __asm__ __volatile__ ("hlt"); } } } /* extern "C" */