aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2025-03-28 09:59:09 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2025-03-28 09:59:09 +0000
commite0eae9b9e905a1842b333823bfdb7c253cda8d1e (patch)
treebf02711f9d3e0424dccef4dc1299b5a70c9f839a
parent9ddfcd02413a93718e8cde53f9ba5a96a5b29b8f (diff)
downloadteachos-e0eae9b9e905a1842b333823bfdb7c253cda8d1e.tar.xz
teachos-e0eae9b9e905a1842b333823bfdb7c253cda8d1e.zip
Revert "update long jump handling"
This reverts commit 9ddfcd02413a93718e8cde53f9ba5a96a5b29b8f.
-rw-r--r--.vscode/launch.json5
-rw-r--r--arch/x86_64/include/arch/boot/pointers.hpp2
-rw-r--r--arch/x86_64/src/boot/boot.s16
-rw-r--r--arch/x86_64/src/context_switching/main.cpp6
-rw-r--r--arch/x86_64/src/kernel/cpu/jmp.cpp10
5 files changed, 19 insertions, 20 deletions
diff --git a/.vscode/launch.json b/.vscode/launch.json
index e6af5d0..ebcd01a 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -24,12 +24,7 @@
{
"description": "Set breakpoint on _start",
"text": "-break-insert _start"
- },
- {
- "description": "Set breakpoint on reload_segment_register_trampoline",
- "text": "-break-insert reload_segment_register_trampoline"
}
-
]
}
],
diff --git a/arch/x86_64/include/arch/boot/pointers.hpp b/arch/x86_64/include/arch/boot/pointers.hpp
index 5092fa6..5bcb792 100644
--- a/arch/x86_64/include/arch/boot/pointers.hpp
+++ b/arch/x86_64/include/arch/boot/pointers.hpp
@@ -13,7 +13,7 @@ namespace teachos::arch::boot
/**
* @brief Address pointing to the method that clears all segment registers.
*/
- extern "C" auto reload_segment_register_trampoline() -> void;
+ extern "C" size_t const segment_register_reload_pointer;
} // namespace teachos::arch::boot
diff --git a/arch/x86_64/src/boot/boot.s b/arch/x86_64/src/boot/boot.s
index f6c7978..35a6121 100644
--- a/arch/x86_64/src/boot/boot.s
+++ b/arch/x86_64/src/boot/boot.s
@@ -354,11 +354,8 @@ prepare_page_maps:
.section .boot_text, "ax", @progbits
.code64
-.global reload_segment_register_trampoline
-reload_segment_register_trampoline:
- jmp 0x08, $_reload_cs
-
-_reload_cs:
+.global segment_register_reload_pointer
+segment_register_reload_pointer:
xor %rax, %rax
mov %rax, %ss
mov %rax, %ds
@@ -369,7 +366,14 @@ _reload_cs:
ret
_transition_to_long_mode:
- call _reload_cs
+ //call segment_register_reload_pointer
+
+ xor %rax, %rax
+ mov %rax, %ss
+ mov %rax, %ds
+ mov %rax, %es
+ mov %rax, %fs
+ mov %rax, %gs
movl $0xb8000, (vga_buffer_pointer)
diff --git a/arch/x86_64/src/context_switching/main.cpp b/arch/x86_64/src/context_switching/main.cpp
index 1417a25..c3c0cf0 100644
--- a/arch/x86_64/src/context_switching/main.cpp
+++ b/arch/x86_64/src/context_switching/main.cpp
@@ -13,8 +13,10 @@ namespace teachos::arch::context_switching
decltype(auto) global_descriptor_table = segment_descriptor_table::initialize_global_descriptor_table();
decltype(auto) interrupt_descriptor_table = interrupt_descriptor_table::initialize_interrupt_descriptor_table();
- // Execute trampoline function for the GDT loading long jump
- boot::reload_segment_register_trampoline();
+ interrupt_descriptor_table::segment_selector segment_selector{
+ 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL};
+ kernel::cpu::far_pointer pointer{boot::segment_register_reload_pointer, segment_selector};
+ kernel::cpu::jmp(pointer);
// Load task state segment descriptor from the last element in the global descriptor table, done by calculating
// offset in bytes to the start of the segment descriptor (5 * 16) = 80
diff --git a/arch/x86_64/src/kernel/cpu/jmp.cpp b/arch/x86_64/src/kernel/cpu/jmp.cpp
index 78b65f4..205c4a9 100644
--- a/arch/x86_64/src/kernel/cpu/jmp.cpp
+++ b/arch/x86_64/src/kernel/cpu/jmp.cpp
@@ -7,10 +7,8 @@ namespace teachos::arch::kernel::cpu
asm volatile("jmp *%[input]" : /* no output from call */ : [input] "r"(address));
}
- // auto jmp(far_pointer pointer) -> void
- // {
- // asm volatile("ljmp $[segment_selector],$[address]"
- // : /* no output from call */
- // : [segment_selector] "m"(pointer.selector), [address] "m"(pointer.offset));
- // }
+ auto jmp(far_pointer pointer) -> void
+ {
+ asm volatile("jmp *%[input]" : /* no output from call */ : [input] "m"(pointer));
+ }
} // namespace teachos::arch::kernel::cpu