diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2025-03-27 14:02:05 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2025-03-27 14:02:05 +0000 |
| commit | 9ddfcd02413a93718e8cde53f9ba5a96a5b29b8f (patch) | |
| tree | a31e132e717c9acc68f2480e9d50d78b32711262 | |
| parent | a6c5f6a273d0c5c4161f600fca6d4fe49858c23c (diff) | |
| download | teachos-9ddfcd02413a93718e8cde53f9ba5a96a5b29b8f.tar.xz teachos-9ddfcd02413a93718e8cde53f9ba5a96a5b29b8f.zip | |
update long jump handling
| -rw-r--r-- | .vscode/launch.json | 5 | ||||
| -rw-r--r-- | arch/x86_64/include/arch/boot/pointers.hpp | 2 | ||||
| -rw-r--r-- | arch/x86_64/src/boot/boot.s | 16 | ||||
| -rw-r--r-- | arch/x86_64/src/context_switching/main.cpp | 6 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/jmp.cpp | 10 |
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 |
