aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/arch/cpu/initialization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/arch/cpu/initialization.cpp')
-rw-r--r--arch/x86_64/arch/cpu/initialization.cpp28
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();