85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
|
|
#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" */
|