diff options
Diffstat (limited to 'kernel.cc')
-rw-r--r-- | kernel.cc | 104 |
1 files changed, 46 insertions, 58 deletions
@@ -8,10 +8,10 @@ #error "This tutorial needs to be compiled with a ix86-elf compiler" #endif -#include "multiboot2.h" -#include "vga.h" #include <stdlib.h> #include <types.h> +#include "multiboot2.h" +#include "vga.h" extern "C" void kernel_main(uint32_t mb_magic, uint32_t mb_addr) { VGA terminal; @@ -19,69 +19,57 @@ extern "C" void kernel_main(uint32_t mb_magic, uint32_t mb_addr) { printk("Hello, kernel World!\n"); - printk("multiboot magic: 0x", mb_magic, - mb_magic == MULTIBOOT2_BOOTLOADER_MAGIC ? " is valid" : " is invalid", - '\n'); - printk("multiboot addr: 0x", mb_addr, '\n'); + 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'); - if (mb_addr & 7) { - printk("unaligned mbi\n"); - } + struct multiboot_tag* tag; + const uint32_t size = *(unsigned*)mb_addr; + printk("Announced mbi size ", size, '\n'); - struct multiboot_tag *tag; - const uint32_t size = *(unsigned *)mb_addr; - printk("Announced mbi size 0x", size, '\n'); + for (tag = (struct multiboot_tag*)(mb_addr + 8); tag->type != MULTIBOOT_TAG_TYPE_END; + tag = (struct multiboot_tag*)((multiboot_uint8_t*)tag + ((tag->size + 7) & ~7))) { + switch (tag->type) { + case MULTIBOOT_TAG_TYPE_CMDLINE: { + auto* t = reinterpret_cast<multiboot_tag_string*>(tag); + printk("Command line = [", t->string, "]\n"); + } break; - for (tag = (struct multiboot_tag *)(mb_addr + 8); - tag->type != MULTIBOOT_TAG_TYPE_END; - tag = (struct multiboot_tag *)((multiboot_uint8_t *)tag + - ((tag->size + 7) & ~7))) { + case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: { + auto* t = reinterpret_cast<multiboot_tag_string*>(tag); + printk("Boot loader name = [", t->string, "]\n"); + } break; - switch (tag->type) { - case MULTIBOOT_TAG_TYPE_CMDLINE: - printk("Command line = [", ((struct multiboot_tag_string *)tag)->string, - "]\n"); - break; - case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: - printk("Boot loader name = [", - ((struct multiboot_tag_string *)tag)->string, "]\n"); - break; - case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: - printk("mem_lower = ", - ((struct multiboot_tag_basic_meminfo *)tag)->mem_lower, "KB\n", - "mem_upper = ", - ((struct multiboot_tag_basic_meminfo *)tag)->mem_upper, "KB\n"); - break; - case MULTIBOOT_TAG_TYPE_BOOTDEV: - printk("Boot device 0x", ((struct multiboot_tag_bootdev *)tag)->biosdev, - " slice ", ((struct multiboot_tag_bootdev *)tag)->slice, " part ", - ((struct multiboot_tag_bootdev *)tag)->part, '\n'); - break; - case MULTIBOOT_TAG_TYPE_MMAP: { - multiboot_memory_map_t *mmap; + case MULTIBOOT_TAG_TYPE_BOOTDEV: { + auto* t = reinterpret_cast<multiboot_tag_bootdev*>(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<multiboot_tag_basic_meminfo*>(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<multiboot_tag_mmap*>(tag); + multiboot_memory_map_t* mmap; - printk("mmap\n"); + printk("memory map\n"); + for (mmap = t->entries; (multiboot_uint8_t*)mmap < (multiboot_uint8_t*)tag + tag->size; + mmap = (multiboot_memory_map_t*)((unsigned long)mmap + ((struct multiboot_tag_mmap*)tag)->entry_size)) { + printk(" base_addr = ", uhex{(unsigned)(mmap->addr >> 32)}, ' ', uhex{(unsigned)(mmap->addr & 0xffffffff)}); + printk(" length = ", (unsigned)(mmap->len >> 32), ' ', (unsigned)(mmap->len & 0xffffffff)); + printk(" type = ", (unsigned)mmap->type, '\n'); + } + } break; - for (mmap = ((struct multiboot_tag_mmap *)tag)->entries; - (multiboot_uint8_t *)mmap < (multiboot_uint8_t *)tag + tag->size; - mmap = (multiboot_memory_map_t *)((unsigned long)mmap + - ((struct multiboot_tag_mmap *)tag) - ->entry_size)) - printk(" base_addr = 0x", (unsigned)(mmap->addr >> 32), ' ', - (unsigned)(mmap->addr & 0xffffffff), " length = 0x", - (unsigned)(mmap->len >> 32), ' ', - (unsigned)(mmap->len & 0xffffffff), " type = 0x", - (unsigned)mmap->type, '\n'); - } break; - default: - printk("Tag 0x", tag->type, ", Size 0x", tag->size, '\n'); - break; - } // switch(tag->type) - } // for(each tag) + default: + printk("Tag ", tag->type, ", Size ", tag->size, '\n'); + break; + } // switch(tag->type) + } // for(each tag) - tag = (struct multiboot_tag *)((multiboot_uint8_t *)tag + - ((tag->size + 7) & ~7)); - printk("Total mbi size 0x", (unsigned)tag - mb_addr, '\n'); + tag = (struct multiboot_tag*)((multiboot_uint8_t*)tag + ((tag->size + 7) & ~7)); + printk("Total mbi size ", (unsigned)tag - mb_addr, '\n'); abort(); } |