diff options
Diffstat (limited to 'arch/x86_64')
| -rw-r--r-- | arch/x86_64/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | arch/x86_64/include/arch/kernel/cpu/call.hpp (renamed from arch/x86_64/include/arch/kernel/cpu/jmp.hpp) | 17 | ||||
| -rw-r--r-- | arch/x86_64/src/context_switching/main.cpp | 4 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/call.cpp | 9 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/jmp.cpp | 14 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/main.cpp | 1 |
6 files changed, 17 insertions, 30 deletions
diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt index 0d52463..8f5b9bd 100644 --- a/arch/x86_64/CMakeLists.txt +++ b/arch/x86_64/CMakeLists.txt @@ -11,7 +11,7 @@ target_sources("_kernel" PRIVATE "src/kernel/cpu/gdtr.cpp" "src/kernel/cpu/idtr.cpp" "src/kernel/cpu/if.cpp" - "src/kernel/cpu/jmp.cpp" + "src/kernel/cpu/call.cpp" "src/kernel/cpu/msr.cpp" "src/kernel/cpu/segment_register.cpp" "src/kernel/cpu/tlb.cpp" diff --git a/arch/x86_64/include/arch/kernel/cpu/jmp.hpp b/arch/x86_64/include/arch/kernel/cpu/call.hpp index 1657c18..3c43304 100644 --- a/arch/x86_64/include/arch/kernel/cpu/jmp.hpp +++ b/arch/x86_64/include/arch/kernel/cpu/call.hpp @@ -8,29 +8,22 @@ namespace teachos::arch::kernel::cpu { /** - * @brief Far jump - A jump to an instruction located in a different segment. + * @brief Far Pointer. Address to function located in another code segment. */ struct far_pointer { - void (*function)(); ///< Address of the function we want to jump too. (0-63) + void (*function)(); ///< Address of the function we want to call. (0-63) context_switching::interrupt_descriptor_table::segment_selector selector; ///< Segment selector pointing to the GDT entry we want to load into register CS. (64-79) }; /** - * @brief Near jump - A jump to an instruction within the current code segment. - * - * @param address Address we want to jump to. - */ - 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 + * @brief Far call - A call to an instruction located in a different segment than the current code segment but at the * same privilege level. * - * @param pointer 64-bit operand size far pointer that we should jump too. + * @param pointer 64-bit operand size far pointer that we want to call. */ - auto jmp(far_pointer pointer) -> void; + auto call(far_pointer pointer) -> void; } // namespace teachos::arch::kernel::cpu diff --git a/arch/x86_64/src/context_switching/main.cpp b/arch/x86_64/src/context_switching/main.cpp index 124df93..762445f 100644 --- a/arch/x86_64/src/context_switching/main.cpp +++ b/arch/x86_64/src/context_switching/main.cpp @@ -1,8 +1,8 @@ #include "arch/context_switching/main.hpp" #include "arch/exception_handling/assert.hpp" +#include "arch/kernel/cpu/call.hpp" #include "arch/kernel/cpu/if.hpp" -#include "arch/kernel/cpu/jmp.hpp" #include "arch/kernel/cpu/segment_register.hpp" #include "arch/kernel/cpu/tr.hpp" @@ -18,7 +18,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{&kernel::cpu::reload_segment_registers, segment_selector}; - kernel::cpu::jmp(pointer); + kernel::cpu::call(pointer); segment_descriptor_table::update_task_state_segment_register(); diff --git a/arch/x86_64/src/kernel/cpu/call.cpp b/arch/x86_64/src/kernel/cpu/call.cpp new file mode 100644 index 0000000..98fa248 --- /dev/null +++ b/arch/x86_64/src/kernel/cpu/call.cpp @@ -0,0 +1,9 @@ +#include "arch/kernel/cpu/call.hpp" + +namespace teachos::arch::kernel::cpu +{ + auto call(far_pointer pointer) -> void + { + asm volatile("rex64 lcall *%[input]" : /* no output from call */ : [input] "m"(pointer)); + } +} // namespace teachos::arch::kernel::cpu diff --git a/arch/x86_64/src/kernel/cpu/jmp.cpp b/arch/x86_64/src/kernel/cpu/jmp.cpp deleted file mode 100644 index 2833219..0000000 --- a/arch/x86_64/src/kernel/cpu/jmp.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "arch/kernel/cpu/jmp.hpp" - -namespace teachos::arch::kernel::cpu -{ - 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("rex64 lcall *%[input]" : /* no output from call */ : [input] "m"(pointer)); - } -} // namespace teachos::arch::kernel::cpu diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp index 52799f0..7787f30 100644 --- a/arch/x86_64/src/kernel/main.cpp +++ b/arch/x86_64/src/kernel/main.cpp @@ -4,7 +4,6 @@ #include "arch/context_switching/interrupt_descriptor_table/segment_selector.hpp" #include "arch/context_switching/main.hpp" #include "arch/kernel/cpu/if.hpp" -#include "arch/kernel/cpu/jmp.hpp" #include "arch/kernel/cpu/segment_register.hpp" #include "arch/memory/heap/bump_allocator.hpp" #include "arch/memory/heap/global_heap_allocator.hpp" |
