aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kernel/main.cpp
blob: a5ffbb42bdc32bbca2784d77938cd44ed02d4d44 (plain)
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
#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 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:
          uint32_t size = tag->size;
          uint32_t mem_lower = *(uint32_t *)(&size + 32);
          uint32_t mem_upper = *(uint32_t *)(&size + 64);

          text::write_number(mem_lower, text::common_attributes::green_on_black);
          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);
          break;
      }
    }
  }
}  // namespace teachos::arch::kernel