aboutsummaryrefslogtreecommitdiff
path: root/kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kernel.cc')
-rw-r--r--kernel.cc104
1 files changed, 46 insertions, 58 deletions
diff --git a/kernel.cc b/kernel.cc
index b2e2b01..3045374 100644
--- a/kernel.cc
+++ b/kernel.cc
@@ -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();
}