aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/context_switching/main.cpp31
1 files changed, 14 insertions, 17 deletions
diff --git a/arch/x86_64/src/context_switching/main.cpp b/arch/x86_64/src/context_switching/main.cpp
index 5cac878..952a3b2 100644
--- a/arch/x86_64/src/context_switching/main.cpp
+++ b/arch/x86_64/src/context_switching/main.cpp
@@ -12,6 +12,10 @@ namespace teachos::arch::context_switching
{
namespace
{
+ constexpr interrupt_descriptor_table::segment_selector KERNEL_CODE_SEGMENT_SELECTOR{
+ 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL};
+ constexpr kernel::cpu::far_pointer KERNEL_CODE_POINTER{&kernel::cpu::reload_data_segment_registers,
+ KERNEL_CODE_SEGMENT_SELECTOR};
constexpr context_switching::interrupt_descriptor_table::segment_selector USER_CODE_SEGMENT_SELECTOR{
3U, context_switching::interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_USER};
constexpr context_switching::interrupt_descriptor_table::segment_selector USER_DATA_SEGMENT_SELECTOR{
@@ -22,30 +26,23 @@ namespace teachos::arch::context_switching
auto initialize_descriptor_tables() -> descriptor_tables
{
static bool initalized = false;
- if (initalized)
- {
- descriptor_tables tables = {segment_descriptor_table::get_or_create_global_descriptor_table(),
- interrupt_descriptor_table::get_or_create_interrupt_descriptor_table()};
- return tables;
- }
-
- kernel::cpu::clear_interrupt_flag();
- segment_descriptor_table::update_global_descriptor_table_register();
- interrupt_descriptor_table::update_interrupt_descriptor_table_register();
+ if (!initalized)
+ {
+ kernel::cpu::clear_interrupt_flag();
- interrupt_descriptor_table::segment_selector segment_selector{
- 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL};
- kernel::cpu::far_pointer pointer{&kernel::cpu::reload_data_segment_registers, segment_selector};
- kernel::cpu::call(pointer);
+ segment_descriptor_table::update_global_descriptor_table_register();
+ interrupt_descriptor_table::update_interrupt_descriptor_table_register();
- segment_descriptor_table::update_task_state_segment_register();
+ kernel::cpu::call(KERNEL_CODE_POINTER);
+ segment_descriptor_table::update_task_state_segment_register();
- kernel::cpu::set_interrupt_flag();
+ kernel::cpu::set_interrupt_flag();
+ initalized = true;
+ }
descriptor_tables tables = {segment_descriptor_table::get_or_create_global_descriptor_table(),
interrupt_descriptor_table::get_or_create_interrupt_descriptor_table()};
- initalized = true;
return tables;
}