#include "kernel.h" #include "multiboot.h" #include "module.h" mb_info_t mb_info_block; mb_mmap_t mb_mmap[MAX_MMAP]; mb_module_t mb_modules[MAX_MODULES]; mb_apm_t mb_apm_table; char mb_cmdline[256]; /* This function runs in segmented memory - 0xC000_0000 is mapped to 0x0 but 0x0 itself is an invalid linear address. Therefore, the multiboot information addresses must be manually adjusted by VIRT_OFFSET to become valid linear addresses. */ int k_mbsave(mb_info_t *mbinfo, unsigned int mb_magic) { if (mb_magic != MULTIBOOT_BOOTLOADER_MAGIC) { char *msg = "Bad multiboot magic identifier!"; char *dest = (char *) 0xC00B8000; while (*msg) { *dest++ = *msg++; *dest++ = 0x04; //red error message } for (;;) ; } mb_info_block = *mbinfo; if (mb_info_block.flags & MB_BOOTLOADER_COMMAND_LINE) { mb_info_block.cmdline += VIRT_OFFSET; memcpy(mb_cmdline, mb_info_block.cmdline, 256); mb_cmdline[255] = 0; } if (mb_info_block.flags & MB_BOOTLOADER_MODS) { mb_info_block.mods_addr += VIRT_OFFSET; int i; for (i = 0; i < mb_info_block.mods_count && i < MAX_MODULES; i++) { mb_modules[i] = ((mb_module_t *)mb_info_block.mods_addr)[i]; } } if (mb_info_block.flags & MB_BOOTLOADER_MMAP) { mb_info_block.mmap_addr += VIRT_OFFSET - 4; //-4 to get to size field, not base_addr_low field mb_mmap_t *mmap = (mb_mmap_t *)mb_info_block.mmap_addr; int i, sz = 0; for (i = 0; sz < mb_info_block.mmap_length && i < MAX_MMAP; i++) { sz += mmap->size; mb_mmap[i] = *mmap; mmap = (mb_mmap_t *)(((u32_t) mmap) + mmap->size); } } if (mb_info_block.flags & MB_BOOTLOADER_APM) { mb_info_block.apm_table += VIRT_OFFSET; mb_apm_table = *(mb_apm_t *)mb_info_block.apm_table; } return 0; } void k_init() { for (;;) { (*(char*)0xC00B8000)++; } } void isr() { for (;;) ; }