hos/kernel/boot/k_bootstrap.cc

65 lines
1.9 KiB
C++

#include "hos_types.h"
#include "hos_defines.h"
#include "multiboot.h"
#include "k_early_panic.h"
#include "mm/mm.h"
#include "lang/kio.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];
/**************************************************************************
* This function is invoked before paging is enabled. Segmentation is *
* utilized to map virtual address 0xE000_0000 to physical address 0x0. *
*************************************************************************/
u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic)
{
DEBUG_LETTER(2, 'c');
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!");
}
mb_mmap_t * mmap = (mb_mmap_t *) (mb_info->mmap_addr + KERNEL_OFFSET - 4);
for (unsigned int sz = 0; sz < mb_info->mmap_length; sz += mmap->size + 4)
{
mm_record_mmap_entry(mmap);
mmap = (mb_mmap_t *) (((u32_t)mmap) + mmap->size + 4);
}
DEBUG_LETTER(3, 'd');
/*
* These functions could destroy the multiboot information block and
* associated structures, so we must be finished reading those structures
* before calling them.
*/
mm_bootstrap();
kio_bootstrap();
kprintf("Hello from kprintf()! %d, %x, %u, %l\n", 42, 0xabcd0123, 0xFFFFFFFF, -1234567891234ll);
#if 0
kprintf("d1: 0x%X\n", MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1));
kprintf("d2: 0x%X\n", MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0));
for (;;)
;
#endif
return 0;
}
} /* extern "C" */