From 3e607e871b1b20e14527845a511ae2a6739fcaac Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 9 Mar 2024 08:37:29 +0100 Subject: See below. - HCoreKrnl: - Improve interrupt handler for AMD64 targets. - Wrapped AHCI and PE types into a namespace. - Replace L0 with the label MainLoop. - Reworked C++Kit and NetBoot modules. - Put INewFSIterator constructor as explicit. Signed-off-by: Amlal El Mahrouss --- Private/HALKit/AMD64/HalDescriptorLoader.cpp | 12 +++++----- Private/HALKit/AMD64/HalInterruptHandlerAMD64.cxx | 29 +++++++++++++---------- Private/HALKit/AMD64/HalNewBoot.asm | 2 +- Private/HALKit/AMD64/Processor.hpp | 4 ++-- 4 files changed, 26 insertions(+), 21 deletions(-) (limited to 'Private/HALKit') diff --git a/Private/HALKit/AMD64/HalDescriptorLoader.cpp b/Private/HALKit/AMD64/HalDescriptorLoader.cpp index a68fb54a..1dbe8e9e 100644 --- a/Private/HALKit/AMD64/HalDescriptorLoader.cpp +++ b/Private/HALKit/AMD64/HalDescriptorLoader.cpp @@ -25,11 +25,12 @@ STATIC ::HCore::Detail::AMD64::InterruptDescriptorAMD64 void IDTLoader::Load(Register64 &idt) { volatile ::HCore::UIntPtr **baseIdt = (volatile ::HCore::UIntPtr **)idt.Base; + MUST_PASS(baseIdt); - - MUST_PASS(baseIdt[0]); - + for (UInt16 i = 0; i < kKernelIdtSize; i++) { + MUST_PASS(baseIdt[i]); + kInterruptVectorTable[i].Selector = kGdtCodeSelector; kInterruptVectorTable[i].Ist = 0x0; kInterruptVectorTable[i].TypeAttributes = kInterruptGate; @@ -40,10 +41,9 @@ void IDTLoader::Load(Register64 &idt) { kInterruptVectorTable[i].Zero = 0x0; } - kRegIdt.Base = (UIntPtr)kInterruptVectorTable; + kRegIdt.Base = reinterpret_cast(kInterruptVectorTable); kRegIdt.Limit = sizeof(::HCore::Detail::AMD64::InterruptDescriptorAMD64) * - kKernelIdtSize - - 1; + (kKernelIdtSize - 1); rt_load_idt(kRegIdt); diff --git a/Private/HALKit/AMD64/HalInterruptHandlerAMD64.cxx b/Private/HALKit/AMD64/HalInterruptHandlerAMD64.cxx index be0932bd..34cf049e 100644 --- a/Private/HALKit/AMD64/HalInterruptHandlerAMD64.cxx +++ b/Private/HALKit/AMD64/HalInterruptHandlerAMD64.cxx @@ -9,21 +9,26 @@ #include -/// @brief Interrupt handler 21h, 10h -/// @param rsp stack pointer. - -#define kInterruptIdAlt 0x10 #define kInterruptId 0x21 -EXTERN_C ATTRIBUTE(naked) HCore::UIntPtr rt_handle_interrupts(HCore::UIntPtr rsp) +/// @brief Runtime interrupt handler +/// @param sf The stack frame pushed by the isr. +/// @return the stackframe pointer. +EXTERN_C ATTRIBUTE(naked) HCore::UIntPtr rt_handle_interrupts(HCore::UIntPtr sf) { - HCore::HAL::StackFramePtr stackPtr = reinterpret_cast(rsp); - - if (stackPtr->IntNum == kInterruptId || - stackPtr->IntNum == kInterruptIdAlt) { - /// Do system call TODO - + volatile HCore::HAL::StackFramePtr stackPtr = reinterpret_cast(sf); + MUST_PASS(stackPtr); + + switch (stackPtr->IntNum) + { + case kInterruptId: + { + /* TODO: HcOpenDevice and such syscalls. */ + break; + } + default: + break; } - return rsp; + return sf; } \ No newline at end of file diff --git a/Private/HALKit/AMD64/HalNewBoot.asm b/Private/HALKit/AMD64/HalNewBoot.asm index a18b6814..881c1728 100644 --- a/Private/HALKit/AMD64/HalNewBoot.asm +++ b/Private/HALKit/AMD64/HalNewBoot.asm @@ -34,7 +34,7 @@ Main: push rcx call RuntimeMain pop rcx -L0: +MainLoop: cli hlt jmp $ diff --git a/Private/HALKit/AMD64/Processor.hpp b/Private/HALKit/AMD64/Processor.hpp index e5e35f20..c69e35d0 100644 --- a/Private/HALKit/AMD64/Processor.hpp +++ b/Private/HALKit/AMD64/Processor.hpp @@ -23,8 +23,8 @@ #define kCPUBackendName "AMD64" -#define IsActiveLow(flag) (flag & 2) -#define IsLevelTriggered(flag) (flag & 8) +#define IsActiveLow(FLG) (FLG & 2) +#define IsLevelTriggered(FLG) (FLG & 8) #define kInterruptGate 0x8E #define kTrapGate 0xEF -- cgit v1.2.3