aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/boot/multiboot.hpp40
-rw-r--r--arch/x86_64/src/kernel/main.cpp54
2 files changed, 91 insertions, 3 deletions
diff --git a/arch/x86_64/include/arch/boot/multiboot.hpp b/arch/x86_64/include/arch/boot/multiboot.hpp
index c39081a..dfb289d 100644
--- a/arch/x86_64/include/arch/boot/multiboot.hpp
+++ b/arch/x86_64/include/arch/boot/multiboot.hpp
@@ -11,9 +11,9 @@ struct multiboot_info
uint32_t total_size;
uint32_t reserved;
/*
- * field "tags" is an array of multiboot_tags, however the array is never
- * being accessed by index and using an array definition with size 0 produces a compiler
- * error.
+ * field "tags" is an array of multiboot_tag, however the array is never
+ * being accessed by index we don't know the real size at compile-time,
+ * and using an array definition with size 0 produces a compiler error.
*/
struct multiboot_tag tags;
};
@@ -22,6 +22,11 @@ struct memory_map_entry
{
uint64_t base_addr;
uint64_t length;
+#define MULTIBOOT_MEMORY_AVAILABLE 1
+#define MULTIBOOT_MEMORY_RESERVED 2
+#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
+#define MULTIBOOT_MEMORY_NVS 4
+#define MULTIBOOT_MEMORY_BADRAM 5
uint32_t type;
uint32_t reserved;
};
@@ -31,9 +36,38 @@ struct memory_map_info
multiboot_tag tag;
uint32_t entry_size;
uint32_t entry_version;
+ /*
+ * field "entries" is an array of memory_map_entry, however the array is never
+ * being accessed by index, we don't know the real size at compile-time,
+ * and using an array definition with size 0 produces a compiler error.
+ */
struct memory_map_entry entries;
};
+struct elf64_section_header
+{
+ uint32_t sh_name;
+ uint32_t sh_type;
+ uint64_t sh_flags;
+ uint64_t sh_addr;
+ uint64_t sh_offset;
+ uint64_t sh_size;
+ uint32_t sh_link;
+ uint32_t sh_info;
+ uint64_t sh_addralign;
+ uint64_t sh_entsize;
+};
+
+struct elf_symbols_section
+{
+ multiboot_tag tag;
+ uint16_t num;
+ uint16_t entsize;
+ uint16_t shndx;
+ uint16_t reserved;
+ struct elf64_section_header sections;
+};
+
/*
* Define all multiboot tag types to ther respective values
* The gnu boot information format is defined here:
diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp
index 7107a36..2040fe3 100644
--- a/arch/x86_64/src/kernel/main.cpp
+++ b/arch/x86_64/src/kernel/main.cpp
@@ -35,6 +35,57 @@ namespace teachos::arch::kernel
}
}
+ auto print_elf_sections(elf_symbols_section * symbol) -> void
+ {
+ using namespace video::vga;
+
+ uint16_t const num = symbol->num;
+ text::write("Number of entries: ", text::common_attributes::green_on_black);
+ text::write_number(num, text::common_attributes::green_on_black);
+ uint16_t const entsize = symbol->entsize;
+ text::write("Entry Size: ", text::common_attributes::green_on_black);
+ text::write_number(entsize, text::common_attributes::green_on_black);
+ uint16_t const shndx = symbol->shndx;
+ text::write("Section index: ", text::common_attributes::green_on_black);
+ text::write_number(shndx, text::common_attributes::green_on_black);
+
+ auto begin = &symbol->sections;
+ auto end = begin + num;
+ for (auto section = begin; section != end; ++section)
+ {
+ uint32_t const sh_name = section->sh_name;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_name, text::common_attributes::green_on_black);
+ uint32_t const sh_type = section->sh_type;
+ text::write("Section type: ", text::common_attributes::green_on_black);
+ text::write_number(sh_type, text::common_attributes::green_on_black);
+ uint64_t const sh_flags = section->sh_flags;
+ text::write("Section flags: ", text::common_attributes::green_on_black);
+ text::write_number(sh_flags, text::common_attributes::green_on_black);
+ uint64_t const sh_addr = section->sh_addr;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_addr, text::common_attributes::green_on_black);
+ uint64_t const sh_offset = section->sh_offset;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_offset, text::common_attributes::green_on_black);
+ uint64_t const sh_size = section->sh_size;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_size, text::common_attributes::green_on_black);
+ uint32_t const sh_link = section->sh_link;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_link, text::common_attributes::green_on_black);
+ uint32_t const sh_info = section->sh_info;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_info, text::common_attributes::green_on_black);
+ uint64_t const sh_addralign = section->sh_addralign;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_addralign, text::common_attributes::green_on_black);
+ uint64_t const sh_entsize = section->sh_entsize;
+ text::write("Section name: ", text::common_attributes::green_on_black);
+ text::write_number(sh_entsize, text::common_attributes::green_on_black);
+ }
+ }
+
auto main() -> void
{
using namespace video::vga;
@@ -57,6 +108,9 @@ namespace teachos::arch::kernel
{
switch (tag->type)
{
+ case MULTIBOOT_TAG_TYPE_ELF_SECTIONS:
+ print_elf_sections((struct elf_symbols_section *)tag);
+ break;
case MULTIBOOT_TAG_TYPE_MMAP:
print_memory_map((struct memory_map_info *)tag);
break;