#include "arch/kernel/main.hpp" #include "arch/boot/multiboot.hpp" #include "arch/boot/pointers.hpp" #include "arch/video/vga/text.hpp" namespace teachos::arch::kernel { auto print_meminfo(multiboot_tag * tag) -> void { using namespace video::vga; uint32_t * pointer = &tag->size; uint32_t mem_lower = *(++pointer); uint32_t mem_upper = *(++pointer); text::write("Lower memory bound: ", text::common_attributes::green_on_black); text::write_number(mem_lower, text::common_attributes::green_on_black); text::write("Upper memory bound: ", text::common_attributes::green_on_black); text::write_number(mem_upper, text::common_attributes::green_on_black); } auto print_memory_map(multiboot_tag * tag) -> void { using namespace video::vga; uint32_t * pointer = &tag->size; uint32_t entry_size = *(++pointer); uint32_t entry_version = *(++pointer); text::write("Version: ", text::common_attributes::green_on_black); text::write_number(entry_version, text::common_attributes::green_on_black); auto begin = (struct memory_map_entry *)++pointer; auto end = begin + entry_size; for (auto itr = begin; itr < end; ++itr) { text::write("Base Address: ", text::common_attributes::green_on_black); text::write_number(itr->base_addr, text::common_attributes::green_on_black); text::write("Length: ", text::common_attributes::green_on_black); text::write_number(itr->length, text::common_attributes::green_on_black); text::write("Type: ", text::common_attributes::green_on_black); text::write_number(itr->type, text::common_attributes::green_on_black); text::write("Reserved: ", text::common_attributes::green_on_black); text::write_number(itr->reserved, text::common_attributes::green_on_black); } } auto main() -> void { using namespace video::vga; text::clear(); text::cursor(false); text::write("TeachOS is starting up...", text::common_attributes::green_on_black); auto mip = arch::boot::multiboot_information_pointer; // Address of the first multiboot tag auto multiboot_tag = (struct multiboot_tag *)((uint8_t *)mip + 8); /* * Loop over the multiboot2 tags to access the information needed. * Tags are defined in the header. */ for (auto tag = multiboot_tag; tag->type != MULTIBOOT_TAG_TYPE_END; tag = (struct multiboot_tag *)((uint8_t *)tag + ((tag->size + 7) & ~7))) { switch (tag->type) { case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: print_meminfo(tag); break; case MULTIBOOT_TAG_TYPE_MMAP: print_memory_map(tag); break; } } } } // namespace teachos::arch::kernel