aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kernel
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2025-04-10 12:11:55 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2025-04-10 12:11:55 +0000
commitdff78de795a89c181e9c94b26db2f16988e8f4d6 (patch)
treeac19416b7b3ff76f58c4b3deeacbf64bb4cbad84 /arch/x86_64/src/kernel
parent62d7fa83e831e84ea851d97b5c957146880ad69a (diff)
downloadteachos-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.cpp9
-rw-r--r--arch/x86_64/src/kernel/main.cpp56
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