aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kernel/main.cpp
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-19 13:15:45 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-19 13:15:45 +0000
commita2fdcea0d7615f8933401e45e0c64a2f618bb730 (patch)
tree805cbb09342459992a9c56609477a907a20c8e0d /arch/x86_64/src/kernel/main.cpp
parentb6ce3a41fb53eabc6fde12c13f598d228435642a (diff)
downloadteachos-a2fdcea0d7615f8933401e45e0c64a2f618bb730.tar.xz
teachos-a2fdcea0d7615f8933401e45e0c64a2f618bb730.zip
Move compelte multiboot2 code into seperate files and behaviour into seperate static class
Diffstat (limited to 'arch/x86_64/src/kernel/main.cpp')
-rw-r--r--arch/x86_64/src/kernel/main.cpp151
1 files changed, 3 insertions, 148 deletions
diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp
index babe251..c0d4aed 100644
--- a/arch/x86_64/src/kernel/main.cpp
+++ b/arch/x86_64/src/kernel/main.cpp
@@ -1,120 +1,14 @@
#include "arch/kernel/main.hpp"
-#include "arch/boot/pointers.hpp"
#include "arch/exception_handling/assert.hpp"
#include "arch/memory/frame_allocator.hpp"
-#include "arch/memory/multiboot.hpp"
+#include "arch/memory/multiboot/reader.hpp"
#include "arch/video/vga/text.hpp"
#include <algorithm>
namespace teachos::arch::kernel
{
- auto process_memory_map(arch::memory::memory_map * mminfo, arch::memory::memory_area *& memory_areas,
- uint8_t & area_count) -> void
- {
- auto expected_entry_size = mminfo->entry_size;
- constexpr auto actual_entry_size = sizeof(arch::memory::memory_area);
- arch::exception_handling::assert(expected_entry_size == actual_entry_size, "Unexpected memoryarea entry size");
-
- auto total_size = mminfo->tag.size;
- auto total_entries_size = total_size - sizeof(arch::memory::memory_map) + actual_entry_size;
- auto number_of_entries = total_entries_size / actual_entry_size;
-
- memory_areas = &mminfo->entries;
- area_count = number_of_entries;
- }
-
- auto process_elf_sections(arch::memory::elf_symbols_section * symbol, uint64_t & kernel_start,
- uint64_t & kernel_end) -> void
- {
- auto expected_entry_size = symbol->entry_size;
- constexpr auto actual_entry_size = sizeof(arch::memory::elf_section_header);
- arch::exception_handling::assert(expected_entry_size == actual_entry_size,
- "Unexpected elf_section_header entry size");
-
- auto expected_total_size = symbol->tag.size;
- auto actual_total_entry_size = actual_entry_size * symbol->number_of_sections;
- constexpr auto actual_total_section_size = sizeof(arch::memory::elf_symbols_section) - sizeof(uint32_t);
- auto actual_total_size = actual_total_entry_size + actual_total_section_size;
- arch::exception_handling::assert(expected_total_size == actual_total_size, "Unexpected elf_symbols total size");
-
- auto begin = reinterpret_cast<arch::memory::elf_section_header *>(&symbol->end);
- auto end = begin + symbol->number_of_sections;
- arch::exception_handling::assert(begin->is_null(), "Missing elf_section_header begin");
-
- std::size_t symbol_table_section_count = 0U;
- std::size_t dynamic_section_count = 0U;
-
- for (auto section = begin; section != end; ++section)
- {
- bool const writable = section->flags.contains_flags(arch::memory::elf_section_flags::WRITABLE);
- bool const occupies_memory = section->flags.contains_flags(arch::memory::elf_section_flags::OCCUPIES_MEMORY);
- bool const is_executable = section->flags.contains_flags(arch::memory::elf_section_flags::EXECUTABLE_CODE);
- bool const contains_duplicate_data =
- section->flags.contains_flags(arch::memory::elf_section_flags::DUPLICATE_DATA);
- bool const contains_strings = section->flags.contains_flags(arch::memory::elf_section_flags::CONTAINS_STRING);
- bool const section_header_info_is_section_header_table_index = section->flags.contains_flags(
- arch::memory::elf_section_flags::SECTION_HEADER_INFO_IS_SECTION_HEADER_TABLE_INDEX);
- bool const preserve_ordering_after_combination =
- section->flags.contains_flags(arch::memory::elf_section_flags::PRESERVE_ORDERING_AFTER_COMBINATION);
- bool const requires_special_os_processing =
- section->flags.contains_flags(arch::memory::elf_section_flags::REQUIRES_SPECIAL_OS_PROCESSING);
- bool const is_section_group_member =
- section->flags.contains_flags(arch::memory::elf_section_flags::SECTION_GROUP_MEMBER);
- bool const holds_thread_local_data =
- section->flags.contains_flags(arch::memory::elf_section_flags::HOLDS_THREAD_LOCAL_DATA);
- bool const is_compressed = section->flags.contains_flags(arch::memory::elf_section_flags::COMPRESSED);
- bool const has_special_ordering_requirements =
- section->flags.contains_flags(arch::memory::elf_section_flags::SPECIAL_ORDERING_REQUIREMENTS);
- bool const is_excluded_unless_referenced_or_allocated =
- section->flags.contains_flags(arch::memory::elf_section_flags::EXCLUDED_UNLESS_REFERENCED_OR_ALLOCATED);
-
- if (writable && occupies_memory && is_executable && contains_duplicate_data && contains_strings &&
- section_header_info_is_section_header_table_index && preserve_ordering_after_combination &&
- requires_special_os_processing && is_section_group_member && holds_thread_local_data && is_compressed &&
- has_special_ordering_requirements && is_excluded_unless_referenced_or_allocated)
- {
- }
-
- switch (section->type)
- {
- case arch::memory::elf_section_type::PROGRAMM: {
- if (section->virtual_address < kernel_start)
- {
- kernel_start = section->virtual_address;
- }
- auto virtual_address_end = section->virtual_address + section->section_size;
- if (virtual_address_end > kernel_end)
- {
- kernel_end = virtual_address_end;
- }
- break;
- }
- case arch::memory::elf_section_type::DYNAMIC_SYMBOL_TABLE:
- case arch::memory::elf_section_type::SYMBOL_TABLE:
- symbol_table_section_count++;
- break;
- case arch::memory::elf_section_type::DYNAMIC:
- dynamic_section_count++;
- break;
- default:
- // All other cases are not important and can be ignored
- break;
- }
- }
-
- arch::exception_handling::assert(symbol_table_section_count == 1U, "Unexpected symbol_table_count value");
- arch::exception_handling::assert(dynamic_section_count <= 1U, "Unexpected dynamic_section_count value");
- }
-
- template<typename T>
- requires std::is_pointer<T>::value
- auto align_to_8_byte_boundary(T ptr, uint32_t size) -> T
- {
- return reinterpret_cast<T>(reinterpret_cast<uint8_t *>(ptr) + ((size + 7) & ~7));
- }
-
auto main() -> void
{
using namespace video::vga;
@@ -123,47 +17,8 @@ namespace teachos::arch::kernel
text::cursor(false);
text::write("TeachOS is starting up...", text::common_attributes::green_on_black);
- auto * multiboot_information_pointer =
- reinterpret_cast<arch::memory::multi_boot_info *>(arch::boot::multiboot_information_pointer);
- auto multiboot_tag = &(multiboot_information_pointer->tags);
-
- uint64_t kernel_start = UINT64_MAX;
- uint64_t kernel_end = 0;
- uint64_t multiboot_start = arch::boot::multiboot_information_pointer;
- uint64_t multiboot_end = multiboot_start + multiboot_information_pointer->total_size;
- arch::memory::memory_area * memory_areas = nullptr;
- uint8_t area_count = 0;
-
- /*
- * Loop over the multiboot2 tags to access the information needed.
- * Tags are defined in the header file and are padded so that each
- * Tag starts at an 8-bytes aligned adress.
- *
- * The increment part aligns the size to an 8-byte address.
- */
- for (auto tag = multiboot_tag; tag->type != arch::memory::multi_boot_tag_type::END;
- tag = align_to_8_byte_boundary(tag, tag->size))
- {
- switch (tag->type)
- {
- case arch::memory::multi_boot_tag_type::ELF_SECTIONS: {
- auto symbol = reinterpret_cast<teachos::arch::memory::elf_symbols_section *>(tag);
- process_elf_sections(symbol, kernel_start, kernel_end);
- break;
- }
- case arch::memory::multi_boot_tag_type::MEMORY_MAP: {
- auto mminfo = reinterpret_cast<teachos::arch::memory::memory_map *>(tag);
- process_memory_map(mminfo, memory_areas, area_count);
- break;
- }
- default:
- // All other cases are not important and can be ignored
- break;
- }
- }
-
- auto allocator = arch::memory::area_frame_allocator(kernel_start, kernel_end, multiboot_start, multiboot_end,
- memory_areas, area_count);
+ auto memory_information = memory::multiboot::read_multiboot2();
+ auto allocator = memory::area_frame_allocator(memory_information);
auto last_allocated = allocator.allocate_frame();
auto allocated = last_allocated;