aboutsummaryrefslogtreecommitdiff
path: root/libs/multiboot2
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-05 18:22:53 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-05 18:22:53 +0100
commit1124eb4e0a88e7cd13d6ebd9820d6ddcde343110 (patch)
treed0b3d2052ebbb68d6c61009ae5b2a61321b25e9d /libs/multiboot2
parent53402f496ee07351923945f523565f9aa618005a (diff)
downloadteachos-1124eb4e0a88e7cd13d6ebd9820d6ddcde343110.tar.xz
teachos-1124eb4e0a88e7cd13d6ebd9820d6ddcde343110.zip
multiboot2: implement section name reading
Diffstat (limited to 'libs/multiboot2')
-rw-r--r--libs/multiboot2/include/multiboot2/impl/tag.hpp20
-rw-r--r--libs/multiboot2/include/multiboot2/information.hpp14
2 files changed, 30 insertions, 4 deletions
diff --git a/libs/multiboot2/include/multiboot2/impl/tag.hpp b/libs/multiboot2/include/multiboot2/impl/tag.hpp
index 5edcd6f..a6e2678 100644
--- a/libs/multiboot2/include/multiboot2/impl/tag.hpp
+++ b/libs/multiboot2/include/multiboot2/impl/tag.hpp
@@ -82,16 +82,18 @@ namespace multiboot2::impl
{
using range_type = Range<VlaData const>;
+ using value_type = range_type::value_type;
+ using reference = range_type::const_reference;
+ using const_reference = range_type::const_reference;
+ using pointer = range_type::const_pointer;
+ using const_pointer = range_type::const_pointer;
+
using iterator = range_type::const_iterator;
using const_iterator = range_type::const_iterator;
using reverse_iterator = range_type::const_reverse_iterator;
using const_reverse_iterator = range_type::const_reverse_iterator;
using size_type = range_type::size_type;
using difference_type = range_type::difference_type;
- using reference = range_type::const_reference;
- using const_reference = range_type::const_reference;
- using pointer = range_type::const_pointer;
- using const_pointer = range_type::const_pointer;
vla_tag()
: tag<Data>{}
@@ -168,6 +170,16 @@ namespace multiboot2::impl
return m_vla.data();
}
+ [[nodiscard]] auto at() const -> const_reference
+ {
+ return m_vla.at();
+ }
+
+ [[nodiscard]] auto operator[](std::size_t index) const noexcept -> const_reference
+ {
+ return m_vla[index];
+ }
+
private:
auto static vla_start(tag_header const * header) noexcept -> VlaData *
{
diff --git a/libs/multiboot2/include/multiboot2/information.hpp b/libs/multiboot2/include/multiboot2/information.hpp
index 4be32aa..25f034d 100644
--- a/libs/multiboot2/include/multiboot2/information.hpp
+++ b/libs/multiboot2/include/multiboot2/information.hpp
@@ -11,6 +11,7 @@
#include <algorithm>
#include <cstddef>
#include <cstdint>
+#include <cstdlib>
#include <optional>
#include <span>
#include <string_view>
@@ -58,6 +59,19 @@ namespace multiboot2
{
using base = impl::vla_tag<impl::elf_symbols_data, elf::section_header<Format> const, std::span>;
using base::base;
+
+ [[nodiscard]] auto name(elf::section_header<Format> const & section) const noexcept -> std::string_view
+ {
+ if (!this->string_table_index)
+ {
+ std::abort();
+ }
+
+ auto string_table = this->begin()[this->string_table_index];
+ auto name_offset = section.name_offset;
+ auto name_array = std::bit_cast<char const *>(string_table.virtual_load_address);
+ return name_array + name_offset;
+ }
};
/**