From 0c75a6ef8e47106e7fc51ca5e11eb4116e879e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20Gm=C3=BCr?= Date: Fri, 11 Apr 2025 10:50:03 +0000 Subject: Improve initialize_descriptor_tables --- arch/x86_64/src/context_switching/main.cpp | 31 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'arch/x86_64/src') 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; } -- cgit v1.2.3