aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-11-21 14:53:37 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-11-21 14:53:37 +0100
commita5ca21e45e9c8ead0b5895771c0b2f3fe3baf96b (patch)
treed8cdd8f24d18d46b62a567c1f4fe9be490a54d7e /arch/x86_64/src
parent886c920b8c943753a56ef4893e074c5754a1aa2d (diff)
downloadteachos-a5ca21e45e9c8ead0b5895771c0b2f3fe3baf96b.tar.xz
teachos-a5ca21e45e9c8ead0b5895771c0b2f3fe3baf96b.zip
x86_64: rework control register access
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/cpu/registers.cpp64
-rw-r--r--arch/x86_64/src/kapi/memory.cpp3
-rw-r--r--arch/x86_64/src/memory/mmu.cpp4
3 files changed, 4 insertions, 67 deletions
diff --git a/arch/x86_64/src/cpu/registers.cpp b/arch/x86_64/src/cpu/registers.cpp
deleted file mode 100644
index d59776b..0000000
--- a/arch/x86_64/src/cpu/registers.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#include "x86_64/cpu/registers.hpp"
-
-#include <type_traits>
-
-namespace teachos::cpu::x86_64
-{
- auto read_control_register(control_register cr) -> uint64_t
- {
- uint64_t current_value{};
- switch (cr)
- {
- case control_register::cr0:
- asm volatile("mov %%cr0, %[output]" : [output] "=r"(current_value));
- break;
- case control_register::cr2:
- asm volatile("mov %%cr2, %[output]" : [output] "=r"(current_value));
- break;
- case control_register::cr3:
- asm volatile("mov %%cr3, %[output]" : [output] "=r"(current_value));
- break;
- case control_register::cr4:
- asm volatile("mov %%cr4, %[output]" : [output] "=r"(current_value));
- break;
- }
- return current_value;
- }
-
- auto write_control_register(control_register cr, uint64_t new_value) -> void
- {
- switch (cr)
- {
- case control_register::cr0:
- asm volatile("mov %[input], %%cr0"
- : /* no output from call */
- : [input] "r"(new_value)
- : "memory");
- break;
- case control_register::cr2:
- asm volatile("mov %[input], %%cr2"
- : /* no output from call */
- : [input] "r"(new_value)
- : "memory");
- break;
- case control_register::cr3:
- asm volatile("mov %[input], %%cr3"
- : /* no output from call */
- : [input] "r"(new_value)
- : "memory");
- break;
- case control_register::cr4:
- asm volatile("mov %[input], %%cr4"
- : /* no output from call */
- : [input] "r"(new_value)
- : "memory");
- break;
- }
- }
-
- auto set_cr0_bit(cr0_flags flag) -> void
- {
- auto const cr0 = read_control_register(control_register::cr0);
- write_control_register(control_register::cr0, static_cast<std::underlying_type_t<cr0_flags>>(flag) | cr0);
- }
-} // namespace teachos::cpu::x86_64
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp
index aa3eb58..4766bb3 100644
--- a/arch/x86_64/src/kapi/memory.cpp
+++ b/arch/x86_64/src/kapi/memory.cpp
@@ -6,6 +6,7 @@
#include "x86_64/boot/boot.hpp"
#include "x86_64/boot/ld.hpp"
+#include "x86_64/cpu/impl/control_registers.hpp"
#include "x86_64/cpu/registers.hpp"
#include "x86_64/memory/region_allocator.hpp"
@@ -48,7 +49,7 @@ namespace teachos::memory
auto enable_cpu_protections() -> void
{
- cpu::x86_64::set_cr0_bit(cpu::x86_64::cr0_flags::WRITE_PROTECT);
+ cpu::x86_64::cr0::clear(cpu::x86_64::cr0::flags::write_protect);
// set_efer_bit(efer_flags::NXE);
}
} // namespace
diff --git a/arch/x86_64/src/memory/mmu.cpp b/arch/x86_64/src/memory/mmu.cpp
index e573b4e..8ec8a2e 100644
--- a/arch/x86_64/src/memory/mmu.cpp
+++ b/arch/x86_64/src/memory/mmu.cpp
@@ -13,7 +13,7 @@ namespace teachos::memory::x86_64
auto tlb_flush_all() -> void
{
- auto current_value = cpu::read_control_register(cpu::control_register::cr3);
- cpu::write_control_register(cpu::control_register::cr3, current_value);
+ auto paging_root = cpu::cr3::read();
+ cpu::cr3::write(paging_root);
}
} // namespace teachos::memory::x86_64