aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-07-14 16:25:00 +0000
committerFelix Morgner <felix.morgner@ost.ch>2025-07-14 16:25:00 +0000
commitec572bff8150e2f8cd2dc99e053c5e8c8a0b99e3 (patch)
treef66048c99b5015bf9cb7603b7be09c2a28d766ee /arch/x86_64/src
parent25483b7af8df6b08d460f807fda04c6d409bd44e (diff)
downloadteachos-ec572bff8150e2f8cd2dc99e053c5e8c8a0b99e3.tar.xz
teachos-ec572bff8150e2f8cd2dc99e053c5e8c8a0b99e3.zip
arch: prepare interfaces
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/boot/boot.s2
-rw-r--r--arch/x86_64/src/io.cpp22
-rw-r--r--arch/x86_64/src/memory.cpp62
-rw-r--r--arch/x86_64/src/system.cpp12
4 files changed, 97 insertions, 1 deletions
diff --git a/arch/x86_64/src/boot/boot.s b/arch/x86_64/src/boot/boot.s
index 7932045..5488073 100644
--- a/arch/x86_64/src/boot/boot.s
+++ b/arch/x86_64/src/boot/boot.s
@@ -364,5 +364,5 @@ _transition_to_long_mode:
call _init
- call kernel_main
+ call main
call halt
diff --git a/arch/x86_64/src/io.cpp b/arch/x86_64/src/io.cpp
new file mode 100644
index 0000000..8808dbb
--- /dev/null
+++ b/arch/x86_64/src/io.cpp
@@ -0,0 +1,22 @@
+namespace teachos::arch::io
+{
+
+ // using x86_64::vga::text_mode::attributes;
+ // using x86_64::vga::text_mode::color;
+
+ // namespace
+ // {
+ // auto constexpr error_attributes =
+ // attributes{.foreground = color::light_gray, .bright = true, .background = color::red, .blink = true};
+ // } // namespace
+
+ auto init() -> void
+ {
+ // kernel::set_print_handler([](auto text) { return x86_64::vga::text_mode::print(text); });
+ // kernel::set_println_handler([](auto text) { return x86_64::vga::text_mode::println(text); });
+ // kernel::set_print_error_handler([](auto text) { return x86_64::vga::text_mode::print(text, error_attributes); });
+ // kernel::set_println_error_handler(
+ // [](auto text) { return x86_64::vga::text_mode::println(text, error_attributes); });
+ }
+
+} // namespace teachos::arch::io
diff --git a/arch/x86_64/src/memory.cpp b/arch/x86_64/src/memory.cpp
new file mode 100644
index 0000000..245d7bd
--- /dev/null
+++ b/arch/x86_64/src/memory.cpp
@@ -0,0 +1,62 @@
+#include "arch/memory.hpp"
+
+// #include "noarch/error.hpp"
+// #include "noarch/print.hpp"
+// #include "x86_64/bootstrap/mutiboot.hpp"
+// #include "x86_64/memory/frame_allocator.hpp"
+// #include "x86_64/memory/mbi_frame_allocator.hpp"
+
+// #include <elf/constants.hpp>
+// #include <elf/section_header.hpp>
+// #include <elf/section_header_table.hpp>
+// #include <multiboot2/information.hpp>
+
+namespace teachos::arch::memory
+{
+
+ // namespace
+ // {
+ // /**
+ // * @brief Remap the kernel according to the ELF information.
+ // *
+ // * After initial bootup, a basic identity mapping of the lower 1GiB is set up. This mapping allows execution
+ // from,
+ // * as well as read and write access to, the mapped memory. In order to protect the kernel, remap it according to
+ // the
+ // * information supplied by the ELF file. This means remapping code sections as read-only and data sections as
+ // * no-execute (and read only for .rodata).
+ // *
+ // * @param sections Information about the sections in the loaded kernel binary.
+ // * @param allocator The frame allocator used to create new page mappings.
+ // */
+ // auto remap_kernel(elf::section_header_table const & sections, x86_64::memory::frame_allocator & allocator) ->
+ // void
+ // {
+ // static_cast<void>(sections);
+ // static_cast<void>(allocator);
+ // }
+ // } // namespace
+
+ auto init() -> void
+ {
+ // kernel::println("Initializing memory");
+
+ // if (!x86_64::bootstrap::multiboot_information_pointer->has<multiboot2::memory_map>())
+ // {
+ // kernel::panic("Received no memory map from the boot loader!");
+ // }
+
+ // if (!x86_64::bootstrap::multiboot_information_pointer->has<multiboot2::elf_symbols>())
+ // {
+ // kernel::panic("Received no ELF symbol information from the boot loader!");
+ // }
+
+ // auto memory_map = x86_64::bootstrap::multiboot_information_pointer->memory_map();
+ // auto elf_symbols = x86_64::bootstrap::multiboot_information_pointer->elf_symbols();
+ // auto section_header_table = elf::section_header_table{elf_symbols.data(), elf::file_class::bits_64};
+ // auto allocator = x86_64::memory::mbi_frame_allocator{memory_map, section_header_table};
+
+ // remap_kernel(section_header_table, allocator);
+ }
+
+} // namespace teachos::arch::memory
diff --git a/arch/x86_64/src/system.cpp b/arch/x86_64/src/system.cpp
new file mode 100644
index 0000000..60ebf0e
--- /dev/null
+++ b/arch/x86_64/src/system.cpp
@@ -0,0 +1,12 @@
+#include "arch/system.hpp"
+
+namespace teachos::arch::system
+{
+
+ auto halt() -> void
+ {
+ asm volatile("1: hlt\njmp 1b");
+ __builtin_unreachable();
+ }
+
+} // namespace teachos::arch::system