aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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, 20 insertions, 19 deletions
diff --git a/.vscode/launch.json b/.vscode/launch.json
index ebcd01a..e6af5d0 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -24,7 +24,12 @@
{
"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 5bcb792..5092fa6 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" size_t const segment_register_reload_pointer;
+ extern "C" auto reload_segment_register_trampoline() -> void;
} // namespace teachos::arch::boot
diff --git a/arch/x86_64/src/boot/boot.s b/arch/x86_64/src/boot/boot.s
index 35a6121..f6c7978 100644
--- a/arch/x86_64/src/boot/boot.s
+++ b/arch/x86_64/src/boot/boot.s
@@ -354,8 +354,11 @@ prepare_page_maps:
.section .boot_text, "ax", @progbits
.code64
-.global segment_register_reload_pointer
-segment_register_reload_pointer:
+.global reload_segment_register_trampoline
+reload_segment_register_trampoline:
+ jmp 0x08, $_reload_cs
+
+_reload_cs:
xor %rax, %rax
mov %rax, %ss
mov %rax, %ds
@@ -366,14 +369,7 @@ segment_register_reload_pointer:
ret
_transition_to_long_mode:
- //call segment_register_reload_pointer
-
- xor %rax, %rax
- mov %rax, %ss
- mov %rax, %ds
- mov %rax, %es
- mov %rax, %fs
- mov %rax, %gs
+ call _reload_cs
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 c3c0cf0..1417a25 100644
--- a/arch/x86_64/src/context_switching/main.cpp
+++ b/arch/x86_64/src/context_switching/main.cpp
@@ -13,10 +13,8 @@ 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();
- 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);
+ // Execute trampoline function for the GDT loading long jump
+ boot::reload_segment_register_trampoline();
// 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 205c4a9..78b65f4 100644
--- a/arch/x86_64/src/kernel/cpu/jmp.cpp
+++ b/arch/x86_64/src/kernel/cpu/jmp.cpp
@@ -7,8 +7,10 @@ namespace teachos::arch::kernel::cpu
asm volatile("jmp *%[input]" : /* no output from call */ : [input] "r"(address));
}
- auto jmp(far_pointer pointer) -> void
- {
- asm volatile("jmp *%[input]" : /* no output from call */ : [input] "m"(pointer));
- }
+ // 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));
+ // }
} // namespace teachos::arch::kernel::cpu