diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-10 12:11:55 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-10 12:11:55 +0000 |
| commit | dff78de795a89c181e9c94b26db2f16988e8f4d6 (patch) | |
| tree | ac19416b7b3ff76f58c4b3deeacbf64bb4cbad84 /arch/x86_64/src/kernel | |
| parent | 62d7fa83e831e84ea851d97b5c957146880ad69a (diff) | |
| download | teachos-dff78de795a89c181e9c94b26db2f16988e8f4d6.tar.xz teachos-dff78de795a89c181e9c94b26db2f16988e8f4d6.zip | |
move context_switch function and environment into different directory
Diffstat (limited to 'arch/x86_64/src/kernel')
| -rw-r--r-- | arch/x86_64/src/kernel/cpu/segment_register.cpp | 9 | ||||
| -rw-r--r-- | arch/x86_64/src/kernel/main.cpp | 56 |
2 files changed, 11 insertions, 54 deletions
diff --git a/arch/x86_64/src/kernel/cpu/segment_register.cpp b/arch/x86_64/src/kernel/cpu/segment_register.cpp index d7857dd..9fb7433 100644 --- a/arch/x86_64/src/kernel/cpu/segment_register.cpp +++ b/arch/x86_64/src/kernel/cpu/segment_register.cpp @@ -30,4 +30,13 @@ namespace teachos::arch::kernel::cpu : [input] "m"(segment_selector)); } + auto read_code_segment_register() -> context_switching::interrupt_descriptor_table::segment_selector + { + context_switching::interrupt_descriptor_table::segment_selector current_value; + asm volatile("mov %%cs, %[output]" : [output] "=r"(current_value)); + return current_value; + } + + auto validate_segment_registers() -> context_switching::interrupt_descriptor_table::segment_selector {} + } // namespace teachos::arch::kernel::cpu diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp index ac2591e..b69064d 100644 --- a/arch/x86_64/src/kernel/main.cpp +++ b/arch/x86_64/src/kernel/main.cpp @@ -50,50 +50,6 @@ namespace teachos::arch::kernel delete test9; } - auto return_function() -> void - { - video::vga::text::write("User Mode!!!", video::vga::text::common_attributes::green_on_black); - } - - /** - * @brief Switch context into the mode defined in the segment selectors. - * - * Setup the stack IRETQ expects to switch the mode: - * 1. push data selector - * 2. push current stack pointer - * 3. push eflags - * 4. push code segment selector - * 5. push return address - * - * @param data_segment - * @param code_segment - * @param address - */ - [[gnu::naked]] - auto switch_context(context_switching::interrupt_descriptor_table::segment_selector data_segment, - context_switching::interrupt_descriptor_table::segment_selector code_segment, uint64_t address) - -> void - { - asm volatile("mov %[data_segment], %%rax\n" - "mov %%rax, %%ds\n" - "mov %%rax, %%es\n" - "mov %%rax, %%fs\n" - "mov %%rax, %%gs\n" - "mov %%rsp, %%rax\n" - - "push %[data_segment]\n" - "push %%rax\n" - "pushfq\n" - "push %[code_segment]\n" - "mov %[return_function], %%rax\n" - "push %%rax\n" - - "iretq\n" - : - : [data_segment] "m"(data_segment), [code_segment] "m"(code_segment), [return_function] "r"(address) - : "rax"); - } - auto main() -> void { video::vga::text::clear(); @@ -109,16 +65,8 @@ namespace teachos::arch::kernel heap_test(); decltype(auto) descriptor_tables = context_switching::initialize_descriptor_tables(); - - context_switching::interrupt_descriptor_table::segment_selector user_code_segment_selector{ - 3U, context_switching::interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_USER}; - context_switching::interrupt_descriptor_table::segment_selector user_data_segment_selector{ - 4U, context_switching::interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_USER}; - - cpu::set_segment_registers(user_data_segment_selector); - switch_context(user_data_segment_selector, user_code_segment_selector, - reinterpret_cast<uint64_t>(&return_function)); - (void)descriptor_tables; + + context_switching::switch_to_user_mode(); } } // namespace teachos::arch::kernel |
