aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-07-14 15:39:09 +0000
committerFelix Morgner <felix.morgner@ost.ch>2025-07-14 15:39:09 +0000
commite7eedd234954509f4f5ec52b2d62cbc4a1723936 (patch)
tree7cff3076bf88ad07ed50066a6e7a2f8795dd27f0
parent22fbbf849497c32f5b237ab70e9ed8aef63e54cf (diff)
downloadteachos-e7eedd234954509f4f5ec52b2d62cbc4a1723936.tar.xz
teachos-e7eedd234954509f4f5ec52b2d62cbc4a1723936.zip
libs: begin extraction of kernel std
-rw-r--r--CMakeLists.txt9
-rw-r--r--arch/x86_64/CMakeLists.txt13
-rw-r--r--arch/x86_64/include/arch/memory/heap/linked_list_allocator.hpp5
-rw-r--r--arch/x86_64/include/arch/memory/heap/user_heap_allocator.hpp5
-rw-r--r--arch/x86_64/include/arch/memory/multiboot/elf_symbols_section.hpp41
-rw-r--r--arch/x86_64/include/arch/memory/multiboot/info.hpp64
-rw-r--r--arch/x86_64/include/arch/memory/multiboot/memory_map.hpp53
-rw-r--r--arch/x86_64/include/arch/memory/multiboot/reader.hpp19
-rw-r--r--arch/x86_64/src/memory/heap/linked_list_allocator.cpp2
-rw-r--r--arch/x86_64/src/memory/multiboot/reader.cpp250
-rw-r--r--libs/kstd/CMakeLists.txt24
-rw-r--r--libs/kstd/include/kstd/mutex.hpp (renamed from arch/x86_64/include/arch/stl/mutex.hpp)10
-rw-r--r--libs/kstd/src/mutex.cpp (renamed from arch/x86_64/src/stl/mutex.cpp)8
13 files changed, 206 insertions, 297 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8fef2f5..75ac1b5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -81,6 +81,7 @@ add_compile_options(
# Global Libraries
#]============================================================================]
+add_subdirectory("libs/kstd" EXCLUDE_FROM_ALL SYSTEM)
add_subdirectory("libs/multiboot2" EXCLUDE_FROM_ALL SYSTEM)
#[============================================================================[
@@ -134,13 +135,6 @@ add_library("teachos::interrupt_handling" ALIAS "_interrupt_handling")
target_compile_options("_interrupt_handling" PRIVATE "-mgeneral-regs-only")
#[============================================================================[
-# The Stub Standard Library
-#]============================================================================]
-
-add_library("_stl" OBJECT)
-add_library("teachos::stl" ALIAS "_stl")
-
-#[============================================================================[
# The Kernel
#]============================================================================]
@@ -154,7 +148,6 @@ target_link_libraries("_kernel" PRIVATE
"teachos::video"
"teachos::memory"
"teachos::exception"
- "teachos::stl"
"teachos::context_switching"
"teachos::interrupt_handling"
)
diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt
index bd06ea7..511fe43 100644
--- a/arch/x86_64/CMakeLists.txt
+++ b/arch/x86_64/CMakeLists.txt
@@ -71,14 +71,7 @@ target_sources("_memory" PRIVATE
target_link_libraries("_memory" PUBLIC
"multiboot2::multiboot2"
-)
-
-#[============================================================================[
-# The STL Library
-#]============================================================================]
-
-target_sources("_stl" PRIVATE
- "src/stl/mutex.cpp"
+ "libs::kstd"
)
#[============================================================================[
@@ -115,6 +108,10 @@ target_sources("_context" PRIVATE
"src/context_switching/interrupt_descriptor_table/segment_selector.cpp"
)
+target_link_libraries("_context" PUBLIC
+ "libs::kstd"
+)
+
#[============================================================================[
# The Interrupt Handlers
#]============================================================================]
diff --git a/arch/x86_64/include/arch/memory/heap/linked_list_allocator.hpp b/arch/x86_64/include/arch/memory/heap/linked_list_allocator.hpp
index 582b4af..bbbad19 100644
--- a/arch/x86_64/include/arch/memory/heap/linked_list_allocator.hpp
+++ b/arch/x86_64/include/arch/memory/heap/linked_list_allocator.hpp
@@ -3,7 +3,8 @@
#include "arch/memory/heap/heap_allocator.hpp"
#include "arch/memory/heap/memory_block.hpp"
-#include "arch/stl/mutex.hpp"
+
+#include <kstd/mutex.hpp>
namespace teachos::arch::memory::heap
{
@@ -112,7 +113,7 @@ namespace teachos::arch::memory::heap
std::size_t size) -> void;
memory_block * first; ///< First free entry in our memory.
- stl::mutex mutex; ///< Mutex to ensure only one thread calls allocate or deallocate at once.
+ kstd::mutex mutex; ///< Mutex to ensure only one thread calls allocate or deallocate at once.
};
} // namespace teachos::arch::memory::heap
diff --git a/arch/x86_64/include/arch/memory/heap/user_heap_allocator.hpp b/arch/x86_64/include/arch/memory/heap/user_heap_allocator.hpp
index 6b1b7bb..3b47f15 100644
--- a/arch/x86_64/include/arch/memory/heap/user_heap_allocator.hpp
+++ b/arch/x86_64/include/arch/memory/heap/user_heap_allocator.hpp
@@ -2,8 +2,9 @@
#define TEACHOS_ARCH_X86_64_MEMORY_HEAP_USER_HEAP_ALLOCATOR_HPP
#include "arch/memory/heap/memory_block.hpp"
-#include "arch/stl/mutex.hpp"
+// #include <kstd/mutex.hpp>
+#include <kstd/mutex.hpp>
#include <optional>
namespace teachos::arch::memory::heap
@@ -141,7 +142,7 @@ namespace teachos::arch::memory::heap
std::size_t size) -> void;
memory_block * first = {}; ///< First free entry in our memory.
- stl::mutex mutex = {}; ///< Mutex to ensure only one thread calls allocate or deallocate at once.
+ kstd::mutex mutex = {}; ///< Mutex to ensure only one thread calls allocate or deallocate at once.
};
} // namespace teachos::arch::memory::heap
diff --git a/arch/x86_64/include/arch/memory/multiboot/elf_symbols_section.hpp b/arch/x86_64/include/arch/memory/multiboot/elf_symbols_section.hpp
index 0a25ca9..348c159 100644
--- a/arch/x86_64/include/arch/memory/multiboot/elf_symbols_section.hpp
+++ b/arch/x86_64/include/arch/memory/multiboot/elf_symbols_section.hpp
@@ -1,9 +1,9 @@
#ifndef TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_ELF_SYBOLS_SECTION_HPP
#define TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_ELF_SYBOLS_SECTION_HPP
-#include "arch/memory/multiboot/info.hpp"
-#include "arch/stl/container.hpp"
-#include "arch/stl/contiguous_pointer_iterator.hpp"
+// #include "arch/memory/multiboot/info.hpp"
+// #include "arch/stl/container.hpp"
+// #include "arch/stl/contiguous_pointer_iterator.hpp"
#include <bitset>
#include <cstdint>
@@ -145,24 +145,25 @@ namespace teachos::arch::memory::multiboot
auto is_null() const -> bool;
};
- /**
- * @brief Defines an entry in the multi_boot_tag array of the multi_boot_info struct, of type
- * multi_boot_tag_type::ELF_SECTIONS.
- *
- * @note The first section in the sections array will always be INACTIVE, there can only ever be one DYNAMIC section
- * and only either one DYNAMIC_SYMBOL_TABLE or SYMBOL_TABLE.
- */
- struct elf_symbols_section_header
- {
- tag info; ///< Basic multi_boot_tag information.
- uint32_t number_of_sections; ///< Number of sections in the sections array.
- uint32_t entry_size; ///< Size of each entry in the sections array.
- uint32_t section_index; ///< Index to the string table used for symbol names.
- std::byte end; ///< Marks the end of the tag, used to mark the beginning of any additional data.
- ///< contained in the section, to ensure byte alignment is actually 4 byte.
- };
+ // /**
+ // * @brief Defines an entry in the multi_boot_tag array of the multi_boot_info struct, of type
+ // * multi_boot_tag_type::ELF_SECTIONS.
+ // *
+ // * @note The first section in the sections array will always be INACTIVE, there can only ever be one DYNAMIC
+ // section
+ // * and only either one DYNAMIC_SYMBOL_TABLE or SYMBOL_TABLE.
+ // */
+ // struct elf_symbols_section_header
+ // {
+ // tag info; ///< Basic multi_boot_tag information.
+ // uint32_t number_of_sections; ///< Number of sections in the sections array.
+ // uint32_t entry_size; ///< Size of each entry in the sections array.
+ // uint32_t section_index; ///< Index to the string table used for symbol names.
+ // std::byte end; ///< Marks the end of the tag, used to mark the beginning of any additional data.
+ // ///< contained in the section, to ensure byte alignment is actually 4 byte.
+ // };
- using elf_section_header_container = stl::container<stl::contiguous_pointer_iterator<elf_section_header>>;
+ // using elf_section_header_container = stl::container<stl::contiguous_pointer_iterator<elf_section_header>>;
} // namespace teachos::arch::memory::multiboot
diff --git a/arch/x86_64/include/arch/memory/multiboot/info.hpp b/arch/x86_64/include/arch/memory/multiboot/info.hpp
deleted file mode 100644
index a9abf12..0000000
--- a/arch/x86_64/include/arch/memory/multiboot/info.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_INFO_HPP
-#define TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_INFO_HPP
-
-#include <cstdint>
-
-namespace teachos::arch::memory::multiboot
-{
- /**
- * @brief Defines all possible types a multiboot2 tag structure can have.
- *
- * @note See
- * https://github.com/rhboot/grub2/blob/fedora-39/include/multiboot2.h for more information on the structure of the
- * tag headers and see https://github.com/rhboot/grub2/blob/fedora-39/include/multiboot.h for more information on the
- * actual header contents and their following data.
- */
- enum struct tag_type : uint32_t
- {
- END, ///< Signals final tag for the multiboot2 information structure.
- CMDLINE, ///< Contains the command line string.
- BOOT_LOADER_NAME, ///< Contains the name of the boot loader booting the kernel.
- MODULE, ///< Indicates the boot module which was loaded along the kernel image.
- BASIC_MEMORY_INFO, ///< Contains the amount of lower (0MB start address) and upper memory (1MB start address).
- BOOTDEV, ///< Indicates which BIOS disk device the hoot loader has loaded the OS image from.
- MEMORY_MAP, ///< Describes the memory layout of the system with individual areas and their flags.
- VBE_INFO, ///< Includes information to access and utilize the device GPU.
- FRAMEBUFFER, ///< VBE framebuffer information.
- ELF_SECTIONS, ///< Includes list of all section headers from the loaded ELF kernel.
- APM_INFO, ///< Advanced Power Management information.
- EFI32, ///< EFI 32 bit system table pointer.
- EFI64, ///< EFI 64 bit system table pointer.
- SMBIOS, ///< Contains copy of all Sytem Management BIOS tables.
- ACPI_OLD, ///< Contains copy of RSDP as defined per ACPI1.0 specification.
- ACPI_NEW, ///< Contains copy of RSDP as defined per ACPI2.0 or later specification.
- NETWORK, ///< Contains network information specified specified as DHCP.
- EFI_MEMORY_MAP, ///< Contains EFI memory map.
- EFI_BS_NOT_TERMINATED, ///< Indicated ExitBootServies wasn't called.
- EFI32_IMAGE_HANDLE, ///< EFI 32 bit image handle pointer.
- EFI64_IMAGE_HANDLE, ///< EFI 64 bit imae handle pointer.
- LOAD_BASE_ADDRESS ///< Contains image load base physical address.
- };
-
- /**
- * @brief Basic structure that every entry in the multi_boot_tag array of the multi_boot_info struct has to begin
- * with.
- */
- struct tag
- {
- tag_type type; ///< Specific type of this multi_boot_tag entry, used to differentiate handling.
- uint32_t size; ///< Total size of this multi_boot_tag entry with all fields of the actual type.
- };
-
- /**
- * @brief Basic structure the multiboot_information_pointer points too and which contains all information of
- * multiboot2 in the tags array of different types. The start as well as the content has to be 8 byte aligned.
- */
- struct info_header
- {
- uint32_t total_size; ///< Total size of all multiboot::tags and their data.
- alignas(8) struct tag tags; ///< Specific tags.
- };
-
-} // namespace teachos::arch::memory::multiboot
-
-#endif // TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_INFO_HPP
diff --git a/arch/x86_64/include/arch/memory/multiboot/memory_map.hpp b/arch/x86_64/include/arch/memory/multiboot/memory_map.hpp
deleted file mode 100644
index 68394c8..0000000
--- a/arch/x86_64/include/arch/memory/multiboot/memory_map.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_MEMORY_MAP_HPP
-#define TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_MEMORY_MAP_HPP
-
-#include "arch/memory/multiboot/info.hpp"
-#include "arch/stl/container.hpp"
-#include "arch/stl/contiguous_pointer_iterator.hpp"
-
-#include <cstdint>
-
-namespace teachos::arch::memory::multiboot
-{
- /**
- * @brief Defines all memory area types possible that the memory region can be in.
- */
- enum struct memory_area_type : uint32_t
- {
- AVAILABLE = 1, ///< Region is available for use by the OS.
- RESERVED, ///< Region is reserved by firmware or bootloader and should not be used by OS.
- ACPI_AVAILABLE, ///< Region is reclaimable by OS after ACPI event.
- RESERVED_HIBERNATION, ///< Region is used for Non-volatile Storage (NVS).
- DEFECTIVE ///< Region is defective or unusable.
- };
-
- /**
- * @brief Defines an entry in the entries array of the memory_map struct.
- *
- * @note Last value needs to be padded, because the size of the entry needs to be
- * exactly 24 bytes and not one byte more.
- */
- struct memory_area
- {
- uint64_t base_address; ///< Base address the memory region starts at.
- uint64_t area_length; ///< Size of the memory region, added to base_address results in the final address.
- alignas(8) memory_area_type type; ///< Specific type of memory the region can contain.
- };
-
- /**
- * @brief Defines an entry in the multi_boot_tag array of the multi_boot_info struct, of type
- * multi_boot_tag_type::MEMORY_MAP.
- */
- struct memory_map_header
- {
- tag info; ///< Basic multi_boot_tag information.
- uint32_t entry_size; ///< Size of each entry in the memory_area array. Guaranteed multiple of 8.
- uint32_t entry_version; ///< Version of the entries, currently 0.
- struct memory_area entries; ///< Specific memory regions.
- };
-
- using memory_area_container = stl::container<stl::contiguous_pointer_iterator<memory_area>>;
-
-} // namespace teachos::arch::memory::multiboot
-
-#endif // TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_MEMORY_MAP_HPP
diff --git a/arch/x86_64/include/arch/memory/multiboot/reader.hpp b/arch/x86_64/include/arch/memory/multiboot/reader.hpp
index bda0c43..c5464cb 100644
--- a/arch/x86_64/include/arch/memory/multiboot/reader.hpp
+++ b/arch/x86_64/include/arch/memory/multiboot/reader.hpp
@@ -1,10 +1,14 @@
#ifndef TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_READER_HPP
#define TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_READER_HPP
+// #include "arch/memory/multiboot/elf_symbols_section.hpp"
+// #include "arch/memory/multiboot/memory_map.hpp"
+
#include "arch/memory/multiboot/elf_symbols_section.hpp"
-#include "arch/memory/multiboot/memory_map.hpp"
#include <cstdint>
+#include <multiboot2/information.hpp>
+#include <span>
namespace teachos::arch::memory::multiboot
{
@@ -14,12 +18,13 @@ namespace teachos::arch::memory::multiboot
*/
struct memory_information
{
- std::size_t kernel_start; ///< Start address of the kernel code in memory.
- std::size_t kernel_end; ///< End address of the kernel code in memory.
- elf_section_header_container sections; ///< Contains non-owning pointers to all kernel sections.
- std::size_t multiboot_start; ///< Start address of the multiboot code in memory.
- std::size_t multiboot_end; ///< End address of the multiboot code in memory.
- memory_area_container areas; ///< Contains non-owning pointers to all memory areas.
+ std::size_t kernel_start; ///< Start address of the kernel code in memory.
+ std::size_t kernel_end; ///< End address of the kernel code in memory.
+ multiboot2::elf_symbols; ///< Contains non-owning pointers to all kernel sections.
+ std::size_t multiboot_start; ///< Start address of the multiboot code in memory.
+ std::size_t multiboot_end; ///< End address of the multiboot code in memory.
+ // std::sp
+ // memory_area_container areas; ///< Contains non-owning pointers to all memory areas.
};
/**
diff --git a/arch/x86_64/src/memory/heap/linked_list_allocator.cpp b/arch/x86_64/src/memory/heap/linked_list_allocator.cpp
index 63a6111..00ca366 100644
--- a/arch/x86_64/src/memory/heap/linked_list_allocator.cpp
+++ b/arch/x86_64/src/memory/heap/linked_list_allocator.cpp
@@ -9,7 +9,7 @@ namespace teachos::arch::memory::heap
{
linked_list_allocator::linked_list_allocator(std::size_t heap_start, std::size_t heap_end)
: first(nullptr)
- , mutex{stl::mutex{}}
+ , mutex{kstd::mutex{}}
{
auto const heap_size = heap_end - heap_start;
exception_handling::assert(
diff --git a/arch/x86_64/src/memory/multiboot/reader.cpp b/arch/x86_64/src/memory/multiboot/reader.cpp
index 2bf5b25..b05e6b3 100644
--- a/arch/x86_64/src/memory/multiboot/reader.cpp
+++ b/arch/x86_64/src/memory/multiboot/reader.cpp
@@ -2,130 +2,134 @@
#include "arch/boot/pointers.hpp"
#include "arch/exception_handling/assert.hpp"
-#include "arch/memory/multiboot/elf_symbols_section.hpp"
-#include "arch/memory/multiboot/info.hpp"
+#include "multiboot2/information.hpp"
+// #include "arch/memory/multiboot/elf_symbols_section.hpp"
+// #include "arch/memory/multiboot/info.hpp"
#include <algorithm>
#include <ranges>
-namespace teachos::arch::memory::multiboot
-{
- namespace
- {
- 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 process_memory_map(memory_map_header * mminfo) -> memory_area_container
- {
- auto const expected_entry_size = mminfo->entry_size;
- auto constexpr actual_entry_size = sizeof(memory_area);
- exception_handling::assert(expected_entry_size == actual_entry_size,
- "[Multiboot Reader] Unexpected memory area entry size");
-
- auto const total_size = mminfo->info.size;
- auto const total_entries_size = total_size - sizeof(memory_map_header) + actual_entry_size;
- auto const number_of_entries = total_entries_size / actual_entry_size;
-
- auto const begin = memory_area_container::iterator{&mminfo->entries};
- auto const end = begin + number_of_entries;
- return memory_area_container{begin, end};
- }
-
- auto process_elf_sections(elf_symbols_section_header * symbol, std::size_t & kernel_start,
- std::size_t & kernel_end) -> elf_section_header_container
- {
- auto const expected_entry_size = symbol->entry_size;
- auto constexpr actual_entry_size = sizeof(elf_section_header);
- exception_handling::assert(expected_entry_size == actual_entry_size,
- "[Multiboot Reader] Unexpected elf section header entry size");
-
- auto const expected_total_size = symbol->info.size;
- auto const actual_total_entry_size = actual_entry_size * symbol->number_of_sections;
- auto constexpr actual_total_section_size = sizeof(elf_symbols_section_header) - sizeof(uint32_t);
- auto const actual_total_size = actual_total_entry_size + actual_total_section_size;
- exception_handling::assert(expected_total_size == actual_total_size,
- "[Multiboot Reader] Unexpected elf symbols section header total size");
-
- auto const begin = elf_section_header_container::iterator{reinterpret_cast<elf_section_header *>(&symbol->end)};
- auto const end = begin + symbol->number_of_sections;
- exception_handling::assert(begin->is_null(),
- "[Multiboot Reader] Elf symbols section not starting with SHT_NULL section");
-
- elf_section_header_container sections{begin, end};
-
- auto allocated_sections = sections | std::views::filter([](auto const & section) {
- return section.flags.contains_flags(elf_section_flags::OCCUPIES_MEMORY);
- });
-
- auto const elf_section_with_lowest_physical_address = std::ranges::min_element(
- allocated_sections, [](auto const & a, auto const & b) { return a.physical_address < b.physical_address; });
-
- auto const elf_section_with_highest_physical_address =
- std::ranges::max_element(allocated_sections, [](auto const & a, auto const & b) {
- auto a_physical_address_end = a.physical_address + a.section_size;
- auto b_physical_address_end = b.physical_address + b.section_size;
- return a_physical_address_end < b_physical_address_end;
- });
-
- auto const symbol_table_section_count = std::ranges::count_if(sections, [](auto const & section) {
- return section.type == elf_section_type::DYNAMIC_SYMBOL_TABLE || section.type == elf_section_type::SYMBOL_TABLE;
- });
- auto const dynamic_section_count = std::ranges::count_if(
- sections, [](auto const & section) { return section.type == elf_section_type::DYNAMIC; });
-
- exception_handling::assert(
- symbol_table_section_count == 1U,
- "[Multiboot Reader] ELF Specifications allows only (1) symbol table section, but got more");
- exception_handling::assert(
- dynamic_section_count <= 1U,
- "[Multiboot Reader] ELF Specifications allows only (1) or less dynamic sections, but got more");
-
- auto const lowest_elf_section = *elf_section_with_lowest_physical_address;
- kernel_start = lowest_elf_section.physical_address;
-
- auto const highest_elf_section = *elf_section_with_highest_physical_address;
- kernel_end = highest_elf_section.physical_address + highest_elf_section.section_size;
-
- return sections;
- }
- } // namespace
-
- auto read_multiboot2() -> memory_information
- {
- memory_information mem_info{UINT64_MAX,
- 0U,
- elf_section_header_container{},
- boot::multiboot_information_pointer,
- 0U,
- memory_area_container{}};
-
- auto const multiboot_information_pointer = reinterpret_cast<info_header *>(boot::multiboot_information_pointer);
- auto const multiboot_tag = &multiboot_information_pointer->tags;
- mem_info.multiboot_end = mem_info.multiboot_start + multiboot_information_pointer->total_size;
-
- for (auto tag = multiboot_tag; tag->type != tag_type::END; tag = align_to_8_byte_boundary(tag, tag->size))
- {
- switch (tag->type)
- {
- case tag_type::ELF_SECTIONS: {
- auto const symbol = reinterpret_cast<elf_symbols_section_header *>(tag);
- mem_info.sections = process_elf_sections(symbol, mem_info.kernel_start, mem_info.kernel_end);
- break;
- }
- case tag_type::MEMORY_MAP: {
- auto const mminfo = reinterpret_cast<memory_map_header *>(tag);
- mem_info.areas = process_memory_map(mminfo);
- break;
- }
- default:
- // All other cases are not important and can be ignored.
- break;
- }
- }
- return mem_info;
- }
-} // namespace teachos::arch::memory::multiboot
+// namespace teachos::arch::memory::multiboot
+// {
+// namespace
+// {
+// 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 process_memory_map(memory_map_header * mminfo) -> memory_area_container
+// {
+// auto const expected_entry_size = mminfo->entry_size;
+// auto constexpr actual_entry_size = sizeof(memory_area);
+// exception_handling::assert(expected_entry_size == actual_entry_size,
+// "[Multiboot Reader] Unexpected memory area entry size");
+
+// auto const total_size = mminfo->info.size;
+// auto const total_entries_size = total_size - sizeof(memory_map_header) + actual_entry_size;
+// auto const number_of_entries = total_entries_size / actual_entry_size;
+
+// auto const begin = memory_area_container::iterator{&mminfo->entries};
+// auto const end = begin + number_of_entries;
+// return memory_area_container{begin, end};
+// }
+
+// auto process_elf_sections(elf_symbols_section_header * symbol, std::size_t & kernel_start, std::size_t &
+// kernel_end)
+// -> elf_section_header_container
+// {
+// auto const expected_entry_size = symbol->entry_size;
+// auto constexpr actual_entry_size = sizeof(elf_section_header);
+// exception_handling::assert(expected_entry_size == actual_entry_size,
+// "[Multiboot Reader] Unexpected elf section header entry size");
+
+// auto const expected_total_size = symbol->info.size;
+// auto const actual_total_entry_size = actual_entry_size * symbol->number_of_sections;
+// auto constexpr actual_total_section_size = sizeof(elf_symbols_section_header) - sizeof(uint32_t);
+// auto const actual_total_size = actual_total_entry_size + actual_total_section_size;
+// exception_handling::assert(expected_total_size == actual_total_size,
+// "[Multiboot Reader] Unexpected elf symbols section header total size");
+
+// auto const begin = elf_section_header_container::iterator{reinterpret_cast<elf_section_header
+// *>(&symbol->end)}; auto const end = begin + symbol->number_of_sections;
+// exception_handling::assert(begin->is_null(),
+// "[Multiboot Reader] Elf symbols section not starting with SHT_NULL section");
+
+// elf_section_header_container sections{begin, end};
+
+// auto allocated_sections = sections | std::views::filter([](auto const & section) {
+// return section.flags.contains_flags(elf_section_flags::OCCUPIES_MEMORY);
+// });
+
+// auto const elf_section_with_lowest_physical_address = std::ranges::min_element(
+// allocated_sections, [](auto const & a, auto const & b) { return a.physical_address < b.physical_address;
+// });
+
+// auto const elf_section_with_highest_physical_address =
+// std::ranges::max_element(allocated_sections, [](auto const & a, auto const & b) {
+// auto a_physical_address_end = a.physical_address + a.section_size;
+// auto b_physical_address_end = b.physical_address + b.section_size;
+// return a_physical_address_end < b_physical_address_end;
+// });
+
+// auto const symbol_table_section_count = std::ranges::count_if(sections, [](auto const & section) {
+// return section.type == elf_section_type::DYNAMIC_SYMBOL_TABLE || section.type ==
+// elf_section_type::SYMBOL_TABLE;
+// });
+// auto const dynamic_section_count = std::ranges::count_if(
+// sections, [](auto const & section) { return section.type == elf_section_type::DYNAMIC; });
+
+// exception_handling::assert(
+// symbol_table_section_count == 1U,
+// "[Multiboot Reader] ELF Specifications allows only (1) symbol table section, but got more");
+// exception_handling::assert(
+// dynamic_section_count <= 1U,
+// "[Multiboot Reader] ELF Specifications allows only (1) or less dynamic sections, but got more");
+
+// auto const lowest_elf_section = *elf_section_with_lowest_physical_address;
+// kernel_start = lowest_elf_section.physical_address;
+
+// auto const highest_elf_section = *elf_section_with_highest_physical_address;
+// kernel_end = highest_elf_section.physical_address + highest_elf_section.section_size;
+
+// return sections;
+// }
+// } // namespace
+
+// auto read_multiboot2() -> memory_information
+// {
+// memory_information mem_info{UINT64_MAX,
+// 0U,
+// elf_section_header_container{},
+// boot::multiboot_information_pointer,
+// 0U,
+// memory_area_container{}};
+
+// auto const multiboot_information_pointer = reinterpret_cast<info_header *>(boot::multiboot_information_pointer);
+// auto const multiboot_tag = &multiboot_information_pointer->tags;
+// mem_info.multiboot_end = mem_info.multiboot_start + multiboot_information_pointer->total_size;
+
+// for (auto tag = multiboot_tag; tag->type != tag_type::END; tag = align_to_8_byte_boundary(tag, tag->size))
+// {
+// switch (tag->type)
+// {
+// case tag_type::ELF_SECTIONS: {
+// auto const symbol = reinterpret_cast<elf_symbols_section_header *>(tag);
+// mem_info.sections = process_elf_sections(symbol, mem_info.kernel_start, mem_info.kernel_end);
+// break;
+// }
+// case tag_type::MEMORY_MAP: {
+// auto const mminfo = reinterpret_cast<memory_map_header *>(tag);
+// mem_info.areas = process_memory_map(mminfo);
+// break;
+// }
+// default:
+// // All other cases are not important and can be ignored.
+// break;
+// }
+// }
+// return mem_info;
+// }
+// } // namespace teachos::arch::memory::multiboot
diff --git a/libs/kstd/CMakeLists.txt b/libs/kstd/CMakeLists.txt
new file mode 100644
index 0000000..06083f3
--- /dev/null
+++ b/libs/kstd/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION "3.27")
+
+project("kstd"
+ LANGUAGES CXX
+ VERSION "1.0.0"
+)
+
+add_library("kstd" STATIC)
+add_library("libs::kstd" ALIAS "kstd")
+
+target_sources("kstd" PRIVATE
+ "src/mutex.cpp"
+)
+
+target_sources("kstd" PUBLIC
+ FILE_SET HEADERS
+ BASE_DIRS "include"
+ FILES
+ "include/kstd/mutex.hpp"
+)
+
+target_include_directories("kstd" PUBLIC
+ "include"
+)
diff --git a/arch/x86_64/include/arch/stl/mutex.hpp b/libs/kstd/include/kstd/mutex.hpp
index a7d297d..cf8549f 100644
--- a/arch/x86_64/include/arch/stl/mutex.hpp
+++ b/libs/kstd/include/kstd/mutex.hpp
@@ -1,9 +1,9 @@
-#ifndef TEACHOS_ARCH_X86_64_STL_MUTEX_HPP
-#define TEACHOS_ARCH_X86_64_STL_MUTEX_HPP
+#ifndef KSTD_MUTEX_HPP
+#define KSTD_MUTEX_HPP
#include <atomic>
-namespace teachos::arch::stl
+namespace kstd
{
/**
* @brief Custom mutex implementation, that simply wraps an atomic boolean to keep track if the mutex is already in
@@ -55,6 +55,6 @@ namespace teachos::arch::stl
std::atomic<bool> locked = {false}; // Atomic boolean to track if mutex is locked or not.
};
-} // namespace teachos::arch::stl
+} // namespace kstd
-#endif // TEACHOS_ARCH_X86_64_STL_MUTEX_HPP
+#endif \ No newline at end of file
diff --git a/arch/x86_64/src/stl/mutex.cpp b/libs/kstd/src/mutex.cpp
index 232a11c..cfb1c84 100644
--- a/arch/x86_64/src/stl/mutex.cpp
+++ b/libs/kstd/src/mutex.cpp
@@ -1,16 +1,16 @@
-#include "arch/stl/mutex.hpp"
+#include "kstd/mutex.hpp"
-namespace teachos::arch::stl
+namespace kstd
{
auto mutex::lock() -> void
{
while (!try_lock())
{
- // Nothing to do
+ asm volatile("nop");
}
}
auto mutex::try_lock() -> bool { return !locked.exchange(true, std::memory_order_acquire); }
auto mutex::unlock() -> void { locked.store(false, std::memory_order_release); }
-} // namespace teachos::arch::stl
+} // namespace kstd