1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#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_memory_map(memory_map_info * mminfo) -> void
{
using namespace video::vga;
uint32_t const entry_size = mminfo->entry_size;
uint32_t const entry_version = mminfo->entry_version;
text::write("Entry Size: ", text::common_attributes::green_on_black);
text::write_number(entry_size, text::common_attributes::green_on_black);
text::write("Version: ", text::common_attributes::green_on_black);
text::write_number(entry_version, text::common_attributes::green_on_black);
uint32_t const remaining_size = mminfo->tag.size - (4 * sizeof(uint32_t));
uint32_t const entry_amount = remaining_size / entry_size;
auto begin = &mminfo->entries;
auto end = begin + entry_amount;
for (auto entry = begin; entry != end; ++entry)
{
text::write("Base Address: ", text::common_attributes::green_on_black);
text::write_number(entry->base_addr, text::common_attributes::green_on_black);
text::write("Length: ", text::common_attributes::green_on_black);
text::write_number(entry->length, text::common_attributes::green_on_black);
text::write("Type: ", text::common_attributes::green_on_black);
text::write_number(entry->type, text::common_attributes::green_on_black);
text::write("Reserved: ", text::common_attributes::green_on_black);
text::write_number(entry->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_MMAP:
print_memory_map((struct memory_map_info *)tag);
break;
}
}
}
} // namespace teachos::arch::kernel
|