diff options
| author | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-03-28 10:52:25 +0000 |
|---|---|---|
| committer | Matteo Gmür <matteo.gmuer1@ost.ch> | 2025-03-28 10:52:25 +0000 |
| commit | 437c3554f9a86b6347d97f5e2a82543c1e068b05 (patch) | |
| tree | 419241f4d0764eb211fb2e0005b003acb2a304ed | |
| parent | e0eae9b9e905a1842b333823bfdb7c253cda8d1e (diff) | |
| download | teachos-437c3554f9a86b6347d97f5e2a82543c1e068b05.tar.xz teachos-437c3554f9a86b6347d97f5e2a82543c1e068b05.zip | |
Attempt to fix ljmp. Might not be possible in Long mode
| -rw-r--r-- | arch/x86_64/include/arch/boot/pointers.hpp | 2 | ||||
| -rw-r--r-- | arch/x86_64/include/arch/kernel/cpu/jmp.hpp | 6 | ||||
| -rw-r--r-- | arch/x86_64/src/boot/boot.s | 6 | ||||
| -rw-r--r-- | arch/x86_64/src/context_switching/main.cpp | 2 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/jmp.cpp | 4 |
5 files changed, 10 insertions, 10 deletions
diff --git a/arch/x86_64/include/arch/boot/pointers.hpp b/arch/x86_64/include/arch/boot/pointers.hpp index 5bcb792..c08de52 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" size_t reload_segment_register; } // namespace teachos::arch::boot diff --git a/arch/x86_64/include/arch/kernel/cpu/jmp.hpp b/arch/x86_64/include/arch/kernel/cpu/jmp.hpp index 5bc7d07..163fac6 100644 --- a/arch/x86_64/include/arch/kernel/cpu/jmp.hpp +++ b/arch/x86_64/include/arch/kernel/cpu/jmp.hpp @@ -12,9 +12,9 @@ namespace teachos::arch::kernel::cpu */ struct [[gnu::packed]] far_pointer { - uint64_t offset; ///< Selector of the segment in which the jump occurs. (0- 63) + std::size_t function; ///< Address of the function we want to jump too. (0- 63) context_switching::interrupt_descriptor_table::segment_selector - selector; ///< Address to jump to within the segment. (64 - 79) + selector; ///< Segment selector that shows the segment we want to jump into. (64 - 79) }; /** @@ -22,7 +22,7 @@ namespace teachos::arch::kernel::cpu * * @param address Address we want to jump to. */ - auto jmp(uint64_t address) -> void; + auto jmp(std::size_t address) -> void; /** * @brief Far jump - A jump to an instruction located in a different segment than the current code segment but at the diff --git a/arch/x86_64/src/boot/boot.s b/arch/x86_64/src/boot/boot.s index 35a6121..bf150a3 100644 --- a/arch/x86_64/src/boot/boot.s +++ b/arch/x86_64/src/boot/boot.s @@ -354,8 +354,8 @@ prepare_page_maps: .section .boot_text, "ax", @progbits .code64 -.global segment_register_reload_pointer -segment_register_reload_pointer: +.global reload_segment_register +reload_segment_register: xor %rax, %rax mov %rax, %ss mov %rax, %ds @@ -366,7 +366,7 @@ segment_register_reload_pointer: ret _transition_to_long_mode: - //call segment_register_reload_pointer + //call reload_segment_register xor %rax, %rax mov %rax, %ss diff --git a/arch/x86_64/src/context_switching/main.cpp b/arch/x86_64/src/context_switching/main.cpp index c3c0cf0..5d19f23 100644 --- a/arch/x86_64/src/context_switching/main.cpp +++ b/arch/x86_64/src/context_switching/main.cpp @@ -15,7 +15,7 @@ namespace teachos::arch::context_switching 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::far_pointer pointer{boot::reload_segment_register, segment_selector}; kernel::cpu::jmp(pointer); // Load task state segment descriptor from the last element in the global descriptor table, done by calculating diff --git a/arch/x86_64/src/kernel/cpu/jmp.cpp b/arch/x86_64/src/kernel/cpu/jmp.cpp index 205c4a9..0c94693 100644 --- a/arch/x86_64/src/kernel/cpu/jmp.cpp +++ b/arch/x86_64/src/kernel/cpu/jmp.cpp @@ -2,13 +2,13 @@ namespace teachos::arch::kernel::cpu { - auto jmp(uint64_t address) -> void + auto jmp(std::size_t address) -> void { 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)); + asm volatile("rex64 ljmp *%[input]" : /* no output from call */ : [input] "m"(pointer)); } } // namespace teachos::arch::kernel::cpu |
