diff options
Diffstat (limited to 'arch/x86_64/arch/cpu/initialization.cpp')
| -rw-r--r-- | arch/x86_64/arch/cpu/initialization.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/arch/x86_64/arch/cpu/initialization.cpp b/arch/x86_64/arch/cpu/initialization.cpp index 83493fe3..be1cc9f8 100644 --- a/arch/x86_64/arch/cpu/initialization.cpp +++ b/arch/x86_64/arch/cpu/initialization.cpp @@ -8,7 +8,9 @@ #include <kstd/print.hpp> +#include <array> #include <bit> +#include <cstddef> #include <cstdint> namespace arch::cpu @@ -95,10 +97,10 @@ namespace arch::cpu { .limit_low = limit & 0xffff, // NOLINT(readability-magic-numbers) .base_low = address & 0xffffff, // NOLINT(readability-magic-numbers) - .accessed = false, + .accessed = true, .read_write = false, .direction_or_conforming = false, - .executable = false, + .executable = true, .type = segment_type::system, .privilege_level = 0, .present = true, @@ -111,11 +113,27 @@ namespace arch::cpu (address >> 32) & 0xffff'ffff, // NOLINT(readability-magic-numbers) }; } + + [[gnu::section(".ist1_stack")]] auto constinit ist1_stack = std::array<std::byte, 4096>{}; + + auto constinit tss = task_state_segment{ + .rsp0 = nullptr, + .rsp1 = nullptr, + .rsp2 = nullptr, + .ist1 = ist1_stack.data() + ist1_stack.size(), + .ist2 = nullptr, + .ist3 = nullptr, + .ist4 = nullptr, + .ist5 = nullptr, + .ist6 = nullptr, + .ist7 = nullptr, + .io_map_base_address = 0, + }; + } // namespace auto initialize_descriptors() -> void { - auto static tss = task_state_segment{}; auto static tss_descriptor = make_tss_descriptor(&tss); auto static gdt = global_descriptor_table{ @@ -126,6 +144,10 @@ namespace arch::cpu kstd::println("[ARCH:SYS] Reloading Global Descriptor Table."); gdt.load(1, 2); + kstd::println("[ARCH:SYS] Loading the Task Register."); + auto const tss_selector_offset = static_cast<std::uint16_t>(5 * sizeof(segment_descriptor)); + asm volatile("ltr %0" : : "r"(tss_selector_offset)); + kstd::println("[ARCH:SYS] Initializing Interrupt Descriptor Table."); auto static idt = interrupt_descriptor_table{}; idt.load(); |
