aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-14 09:47:49 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2024-10-14 09:47:49 +0000
commit7fc99d55ffff20b49dc4088efc95b68b3d33a45b (patch)
tree329f969f2ed11f24982b169ffcb3a4ef375eb6ce /arch
parent8beb8b758c33cf1ac5357b31296927e7df8cf971 (diff)
downloadteachos-7fc99d55ffff20b49dc4088efc95b68b3d33a45b.tar.xz
teachos-7fc99d55ffff20b49dc4088efc95b68b3d33a45b.zip
Use scoped switch statements to extract calculations to variables
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/memory/multiboot.hpp8
-rw-r--r--arch/x86_64/src/kernel/main.cpp30
2 files changed, 24 insertions, 14 deletions
diff --git a/arch/x86_64/include/arch/memory/multiboot.hpp b/arch/x86_64/include/arch/memory/multiboot.hpp
index d66ca35..3aee7fc 100644
--- a/arch/x86_64/include/arch/memory/multiboot.hpp
+++ b/arch/x86_64/include/arch/memory/multiboot.hpp
@@ -49,7 +49,7 @@ namespace teachos::arch::memory
/**
* @brief Basic structure the multiboot_information_pointer points too and which contains all information of
- * multiboot2 in the tags array of different types.
+ * multiboot2 in the tags array of different types. The start as well as the content has to be 8 byte aligned.
*/
struct multi_boot_info
{
@@ -109,7 +109,7 @@ namespace teachos::arch::memory
enum class elf_section_type : uint32_t
{
INACTIVE, ///< (SHT_NULL) Unused, meaning all values are zeroed out
- PROGRAMM, ///< (SHT_PROGBITS) Program data
+ PROGRAMM, ///< (SHT_PROGBITS) Program data (DATA, CODE)
SYMBOL_TABLE, ///< (SHT_SYMBTAB) Contains actual entries pointed to in symbol hash table
STRING_TABLE, ///< (SHT_STRTAB) Contains symbols, section and deubbging null-terminated strings
RELOCATION_ENTRY_WITH_ADDENDS, ///< (SHT_RELA) Only used on 64 bit systems
@@ -146,7 +146,9 @@ namespace teachos::arch::memory
}
/**
- * @brief (SHF_WRITE) Wether the current section is writable or not. Read from bit index 0.
+ * @brief (SHF_WRITE) Wether the current section is writable at runtime or not. If it isn't then the section is
+ * assumed to be READONLY and only that behaviour is shown in the objdump -h of the kernel file. Read from bit index
+ * 0.
*
* @return Current section is writable.
*/
diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp
index 1289eb6..1c6aa55 100644
--- a/arch/x86_64/src/kernel/main.cpp
+++ b/arch/x86_64/src/kernel/main.cpp
@@ -9,8 +9,13 @@ namespace teachos::arch::kernel
{
auto assert(bool condition) -> void
{
+ if (condition)
+ {
+ return;
+ }
+
video::vga::text::write("Assert failed", video::vga::text::common_attributes::green_on_black);
- while (!condition)
+ for (;;)
{
// Trick the compiler into thinking the variable is changes at run time,
// to prevent the while loop being optimized away
@@ -39,7 +44,6 @@ namespace teachos::arch::kernel
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;
constexpr auto actual_entry_size = sizeof(arch::memory::elf_section_header);
assert(expected_entry_size == actual_entry_size);
@@ -61,17 +65,18 @@ namespace teachos::arch::kernel
{
switch (section->type)
{
- case arch::memory::elf_section_type::PROGRAMM:
+ case arch::memory::elf_section_type::PROGRAMM: {
if (section->virtual_address < kernel_start)
{
kernel_start = section->virtual_address;
}
-
- if (section->virtual_address + section->section_size > kernel_end)
+ auto virtual_address_end = section->virtual_address + section->section_size;
+ if (virtual_address_end > kernel_end)
{
- kernel_end = section->virtual_address + section->section_size;
+ 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++;
@@ -121,13 +126,16 @@ namespace teachos::arch::kernel
{
switch (tag->type)
{
- case arch::memory::multi_boot_tag_type::ELF_SECTIONS:
- process_elf_sections(reinterpret_cast<teachos::arch::memory::elf_symbols_section *>(tag), kernel_start,
- kernel_end);
+ 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:
- process_memory_map(reinterpret_cast<teachos::arch::memory::memory_map *>(tag), memory_areas, area_count);
+ }
+ 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;