From 87082c29765034e804b77f18dbe3964b032d0167 Mon Sep 17 00:00:00 2001 From: Amlal Date: Fri, 6 Sep 2024 17:34:24 +0200 Subject: Kernel: Improvements and fixes have been done. (Amlal) Signed-off-by: Amlal --- dev/ZKA/ArchKit/ArchKit.hxx | 2 +- dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx | 17 ++++++++++------- dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 1 + dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 8 +------- dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 2 +- dev/ZKA/HALKit/AMD64/Processor.hxx | 5 ++--- dev/ZKA/Sources/HardwareThreadScheduler.cxx | 2 +- 7 files changed, 17 insertions(+), 20 deletions(-) (limited to 'dev') diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx index c31ee48d..6e93359b 100644 --- a/dev/ZKA/ArchKit/ArchKit.hxx +++ b/dev/ZKA/ArchKit/ArchKit.hxx @@ -109,4 +109,4 @@ inline Kernel::Array> 16) & __INT16_MAX__); + Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & 0xFFFF); + Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & 0xFFFF); Detail::kInterruptVectorTable[idt_indx].OffsetHigh = - (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__); + (((UIntPtr)ptr_ivt[idt_indx] >> 32) & 0xFFFFFFFF); Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; } + idt.Base = (UIntPtr)&Detail::kInterruptVectorTable; + idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * + (kKernelIdtSize) - 1; + hal_load_idt(idt); - HAL::Out8(0xA1, 0xFF); - HAL::Out8(0x21, 0xFF); + Detail::hal_remap_intel_pic_ctrl(); } void GDTLoader::Load(Ref& gdt) diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index 49e02ee1..28f86b34 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -244,6 +244,7 @@ global hal_load_idt global hal_user_code_start hal_load_idt: + cli lidt [rcx] sti ret diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index fb76ad20..df5317e5 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -57,10 +57,7 @@ Kernel::Property cKernelVersion; Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; - EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept; - -EXTERN_C void hal_user_code_start(void); EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); EXTERN_C void hal_init_platform( @@ -87,7 +84,7 @@ EXTERN_C void hal_init_platform( kKernelPhysicalStart = reinterpret_cast( reinterpret_cast(kHandoverHeader->f_PhysicalStart)); - STATIC CONST auto cEntriesCount = 5; + STATIC CONST auto cEntriesCount = 6; /* GDT, mostly descriptors for user and kernel segments. */ STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[cEntriesCount] = { @@ -96,7 +93,6 @@ EXTERN_C void hal_init_platform( {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // Kernel data {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fFlags = 0xCF, .fBaseHigh = 0}, // User data {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fFlags = 0xAF, .fBaseHigh = 0}, // User code - }; // Load memory descriptors. @@ -117,8 +113,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { Kernel::HAL::Register64 idtBase; idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; - idtBase.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * - (kKernelIdtSize - 1); CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index 07ddbefe..2a6be79a 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -57,7 +57,7 @@ mp_pre_switch: mov rdx, [mp_system_call_handler] shr rdx, 32 mov rcx, 0xc0000082 - wrsmr + wrmsr ret diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index 0636c291..8c05d37c 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -30,8 +30,7 @@ EXTERN_C #define kInterruptGate (0x8E) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) -#define kGdtKernelCodeSelector (0x08) -#define kGdtUserCodeSelector (0x23) +#define kGdtCodeSelector (0x08) namespace Kernel { @@ -289,7 +288,7 @@ EXTERN_C Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr); EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); /// @brief Maximum size of the IDT. -#define kKernelIdtSize 0x100 +#define kKernelIdtSize (0x100) #define kKernelInterruptId 0x32 inline Kernel::VoidPtr kKernelVirtualStart = nullptr; diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx index 47c71192..cbe0cc46 100644 --- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx +++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx @@ -107,7 +107,7 @@ namespace Kernel } else { - kcout << "Switching to task...\r"; + kcout << "Switching to the Process's thread...\r"; mp_do_context_switch(image, stack_ptr, fStack); -- cgit v1.2.3