aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/kernel/main.cpp41
-rw-r--r--arch/x86_64/src/memory/frame_allocator.cpp32
2 files changed, 55 insertions, 18 deletions
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::memory::multi_boot_info *>(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<arch::memory::multi_boot_tag *>((reinterpret_cast<uint8_t *>(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<teachos::arch::memory::elf_symbols_section *>(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<teachos::arch::memory::memory_map *>(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<arch::memory::frame> 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