From 8beb8b758c33cf1ac5357b31296927e7df8cf971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20Gm=C3=BCr?= Date: Mon, 14 Oct 2024 08:15:16 +0000 Subject: Fix typos, implementation in header and missing doxygen --- arch/x86_64/src/kernel/main.cpp | 41 +++++++++++++++++------------- arch/x86_64/src/memory/frame_allocator.cpp | 32 +++++++++++++++++++++++ 2 files changed, 55 insertions(+), 18 deletions(-) (limited to 'arch/x86_64/src') diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp index 3fa44d3..1289eb6 100644 --- a/arch/x86_64/src/kernel/main.cpp +++ b/arch/x86_64/src/kernel/main.cpp @@ -16,24 +16,28 @@ namespace teachos::arch::kernel // to prevent the while loop being optimized away // See // https://stackoverflow.com/questions/9495856/how-to-prevent-g-from-optimizing-out-a-loop-controlled-by-a-variable-that-can - // for mroe information. + // for more information. asm volatile("" : "+g"(condition)); } } - auto process_memory_map(arch::memory::memory_map * mminfo, arch::memory::memory_area ** memory_areas, - uint8_t * area_count) -> void + 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); assert(expected_entry_size == actual_entry_size); - *memory_areas = &mminfo->entries; - *area_count = sizeof(mminfo->entries) / mminfo->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 process_elf_sections(arch::memory::elf_symbols_section * symbol, uint64_t & kernel_start, + uint64_t & kernel_end) -> void { // Validate ELF sections auto expected_entry_size = symbol->entry_size; @@ -58,14 +62,14 @@ namespace teachos::arch::kernel switch (section->type) { case arch::memory::elf_section_type::PROGRAMM: - if (section->virtual_address < *kernel_start) + if (section->virtual_address < kernel_start) { - *kernel_start = section->virtual_address; + kernel_start = section->virtual_address; } - if (section->virtual_address + section->section_size > *kernel_end) + if (section->virtual_address + section->section_size > kernel_end) { - *kernel_end = section->virtual_address + section->section_size; + kernel_end = section->virtual_address + section->section_size; } break; case arch::memory::elf_section_type::DYNAMIC_SYMBOL_TABLE: @@ -73,7 +77,6 @@ namespace teachos::arch::kernel symbol_table_section_count++; break; case arch::memory::elf_section_type::DYNAMIC: - symbol_table_section_count++; dynamic_section_count++; break; default: @@ -94,8 +97,8 @@ namespace teachos::arch::kernel text::cursor(false); text::write("TeachOS is starting up...", text::common_attributes::green_on_black); - arch::memory::multi_boot_info * multiboot_information_pointer = - (arch::memory::multi_boot_info *)arch::boot::multiboot_information_pointer; + auto * multiboot_information_pointer = + reinterpret_cast(arch::boot::multiboot_information_pointer); auto multiboot_tag = &(multiboot_information_pointer->tags); uint64_t kernel_start = UINT64_MAX; @@ -113,15 +116,17 @@ namespace teachos::arch::kernel * 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 = (arch::memory::multi_boot_tag *)(((uint8_t *)tag) + ((tag->size + 7) & ~7))) + tag = reinterpret_cast((reinterpret_cast(tag)) + + ((tag->size + 7) & ~7))) { switch (tag->type) { case arch::memory::multi_boot_tag_type::ELF_SECTIONS: - process_elf_sections((arch::memory::elf_symbols_section *)tag, &kernel_start, &kernel_end); + process_elf_sections(reinterpret_cast(tag), kernel_start, + kernel_end); break; case arch::memory::multi_boot_tag_type::MEMORY_MAP: - process_memory_map((arch::memory::memory_map *)tag, &memory_areas, &area_count); + process_memory_map(reinterpret_cast(tag), memory_areas, area_count); break; default: // All other cases are not important and can be ignored @@ -140,7 +145,7 @@ namespace teachos::arch::kernel // Address of Frame: 0x203F00 auto allocator = arch::memory::area_frame_allocator(kernel_start, kernel_end, multiboot_start, multiboot_end, memory_areas, area_count); - std::optional allocated = allocator.allocate_frame(); + auto allocated = allocator.allocate_frame(); // WATCH OUT: using optional::value() crashes the build... I think its because of missing exception handling if (allocated.has_value()) diff --git a/arch/x86_64/src/memory/frame_allocator.cpp b/arch/x86_64/src/memory/frame_allocator.cpp index 829cd6d..3ad2d96 100644 --- a/arch/x86_64/src/memory/frame_allocator.cpp +++ b/arch/x86_64/src/memory/frame_allocator.cpp @@ -2,6 +2,34 @@ namespace teachos::arch::memory { + frame::frame(std::size_t frame_number) + : frame_number(frame_number) + { + // Nothing to do + } + + auto frame::containing_address(std::size_t address) -> frame { return frame{address / PAGE_FRAME_SIZE}; } + + memory_area_iterator::memory_area_iterator(memory_area * p) + : ptr(p) + { + // Nothing to do + } + + memory_area & memory_area_iterator::operator*() const { return *ptr; } + + auto memory_area_iterator::operator++(int) -> memory_area_iterator + { + ++(*this); + return *this; + } + + auto memory_area_iterator::operator++() -> memory_area_iterator & + { + ++ptr; + return *this; + } + auto area_frame_allocator::choose_next_area() -> void { current_area = std::nullopt; @@ -77,4 +105,8 @@ namespace teachos::arch::memory { } } + + auto area_frame_allocator::begin() -> memory_area_iterator { return area_begin; } + + auto area_frame_allocator::end() -> memory_area_iterator { return area_end; } } // namespace teachos::arch::memory -- cgit v1.2.3