#include #include extern "C" void dump_multiboot(uint32_t mb_magic, uint32_t mb_addr) { printk("multiboot magic: ", uhex{mb_magic}, mb_magic == MULTIBOOT2_BOOTLOADER_MAGIC ? " valid" : " invalid", '\n'); printk("multiboot addr: ", uhex{mb_addr}, !(mb_addr & 7) ? " is aligned" : " is not aligned", '\n'); struct multiboot_tag* tag; const uint32_t size = *reinterpret_cast(mb_addr); printk("Announced mbi size ", size, '\n'); for (tag = reinterpret_cast(mb_addr + 8); tag->type != MULTIBOOT_TAG_TYPE_END; tag = reinterpret_cast(reinterpret_cast(tag) + ((tag->size + 7u) & ~7u))) { switch (tag->type) { case MULTIBOOT_TAG_TYPE_CMDLINE: { auto* t = reinterpret_cast(tag); printk("Command line = [", t->string, "]\n"); } break; case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: { auto* t = reinterpret_cast(tag); printk("Boot loader name = [", t->string, "]\n"); } break; case MULTIBOOT_TAG_TYPE_BOOTDEV: { auto* t = reinterpret_cast(tag); printk("Boot device ", uhex{t->biosdev}, " slice ", t->slice, " part ", t->part, '\n'); } break; case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: { auto* t = reinterpret_cast(tag); printk("mem_lower = ", t->mem_lower, "KB\n", "mem_upper = ", t->mem_upper, "KB\n"); } break; case MULTIBOOT_TAG_TYPE_MMAP: { auto* t = reinterpret_cast(tag); multiboot_memory_map_t* mmap; printk("memory map\n"); for (mmap = t->entries; reinterpret_cast(mmap) < reinterpret_cast(tag) + tag->size; mmap = reinterpret_cast(reinterpret_cast(mmap) + reinterpret_cast(tag)->entry_size)) { printk(" base_addr = ", uhex{static_cast(mmap->addr >> 32)}, ' ', uhex{static_cast(mmap->addr & 0xffffffff)}); printk(" length = ", static_cast(mmap->len >> 32), ' ', static_cast(mmap->len & 0xffffffff)); printk(" type = ", mmap->type, '\n'); } } break; default: printk("Tag ", tag->type, ", Size ", tag->size, '\n'); break; } // switch(tag->type) } // for(each tag) tag = reinterpret_cast(reinterpret_cast(tag) + ((tag->size + 7u) & ~7u)); printk("Total mbi size ", reinterpret_cast(tag) - mb_addr, '\n'); }