diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-07 16:30:10 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-07 16:30:10 +0100 |
| commit | 516efdab62108ff03af7f1d91e6dcba02f6aad47 (patch) | |
| tree | 5301fd170496f7562d0872c950cda0ec9d1f5db0 /dev/ZKAKit/HALKit | |
| parent | 3bb0b718b3fde156b6f30b7f05fa34a4937befaf (diff) | |
Kernel: lots of fixes and improvements.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/HALKit')
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc | 17 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc | 12 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc | 27 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/Processor.h | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc | 6 |
7 files changed, 41 insertions, 35 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 2cef8125..f6956793 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -12,6 +12,7 @@ /// @param rsp EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { + kcout << "Kernel: GPF.\r"; Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); } @@ -19,12 +20,14 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { + kcout << "Kernel: Page Fault.\r"; Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); } /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { + kcout << "Kernel: IRQ0.\r"; Kernel::UserProcessHelper::StartScheduling(); } @@ -32,6 +35,7 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { + kcout << "Kernel: Math.\r"; Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); } @@ -39,6 +43,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { + kcout << "Kernel: Generic Fault.\r"; Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); } @@ -46,6 +51,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { + kcout << "Kernel: Undefined Opcode.\r"; Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); } diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc index b3718b96..d484c2a0 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc @@ -133,8 +133,6 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector); } - EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame); - STATIC struct PROCESS_CONTROL_BLOCK final { HAL::StackFramePtr f_Frame; @@ -142,18 +140,21 @@ namespace Kernel::HAL VoidPtr f_Image; } kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; - EXTERN_C HAL::StackFramePtr mp_get_current_context(Void) + EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid) { - return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; + const auto process_index = pid % kSchedProcessLimitPerTeam; + return kProcessBlocks[process_index].f_Frame; } - EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) + EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid) { MUST_PASS(image && stack_ptr && stack_frame); - kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame; - kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr; - kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image; + const auto process_index = pid % kSchedProcessLimitPerTeam; + + kProcessBlocks[process_index].f_Frame = stack_frame; + kProcessBlocks[process_index].f_Stack = stack_ptr; + kProcessBlocks[process_index].f_Image = image; return Yes; } diff --git a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc index fe6491c6..bfa9bcf3 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc @@ -7,14 +7,14 @@ #include <ArchKit/ArchKit.h> #include <HALKit/AMD64/Processor.h> -#define kPITDefaultTicks (1000U) +#define kPITDefaultTicks (100U) namespace Kernel::HAL { namespace Detail { STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64 - kInterruptVectorTable[kKernelIdtSize]; + kInterruptVectorTable[kKernelIdtSize] = { }; STATIC void hal_set_irq_mask(UInt8 irql); STATIC void hal_clear_irq_mask(UInt8 irql); @@ -84,11 +84,13 @@ namespace Kernel::HAL Void IDTLoader::Load(Register64& idt) { + rt_cli(); + const Int16 kPITTickForScheduler = kPITDefaultTicks; volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; - for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) + for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; @@ -103,11 +105,13 @@ namespace Kernel::HAL idt.Base = (UIntPtr)&Detail::kInterruptVectorTable[0]; idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * - (kKernelIdtSize)-1; + (kKernelIdtSize); hal_load_idt(idt); Detail::hal_enable_pit(kPITTickForScheduler); + + rt_sti(); } void GDTLoader::Load(Ref<RegisterGDT>& gdt) diff --git a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm index d25d34f6..9121edb9 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm @@ -340,8 +340,6 @@ mp_system_call_handler: o64 sysret hal_load_idt: - cli - lidt [rcx] ; Master PIC initialization @@ -369,8 +367,6 @@ hal_load_idt: out 0x21, al out 0xA1, al - sti - ret section .data diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc index 2e78a292..cebe2fe6 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc @@ -20,22 +20,22 @@ EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[]; EXTERN_C Kernel::MainKind __CTOR_LIST__[]; EXTERN_C Kernel::MainKind __DTOR_LIST__[]; +namespace Kernel +{ + EXTERN ProcessID kProcessIDCounter; +} + STATIC Kernel::Void hal_init_cxx_ctors() { + Kernel::kProcessIDCounter = 0UL; + for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__[0]; ++index) { Kernel::MainKind constructor_cxx = (Kernel::MainKind)__CTOR_LIST__[index]; constructor_cxx(); - - kcout << "Called constrcutor.\r"; } } -namespace Kernel -{ - EXTERN ProcessID kProcessIDCounter; -} - /// @brief Kernel init procedure. EXTERN_C void hal_init_platform( Kernel::HEL::HANDOVER_INFO_HEADER* HandoverHeader) @@ -50,8 +50,6 @@ EXTERN_C void hal_init_platform( hal_init_cxx_ctors(); - Kernel::kProcessIDCounter = 0UL; - /************************************** */ /* INITIALIZE BIT MAP. */ /************************************** */ @@ -93,22 +91,23 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept /* Initialize filesystem. */ Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); + const Kernel::Char process_name[] = "Kernel"; + Kernel::rtl_create_process([]() -> void { while (Yes) ; - }, "RtlProcess"); + }, process_name); + + /* Load interrupts and start SMP. */ - /* Start any cores. */ if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); Kernel::HAL::Register64 idt_reg; idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable; - /* Load interrupts. */ Kernel::HAL::IDTLoader idt_loader; idt_loader.Load(idt_reg); - while (Yes) - ; + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/dev/ZKAKit/HALKit/AMD64/Processor.h b/dev/ZKAKit/HALKit/AMD64/Processor.h index c854969b..9d0a989c 100644 --- a/dev/ZKAKit/HALKit/AMD64/Processor.h +++ b/dev/ZKAKit/HALKit/AMD64/Processor.h @@ -306,8 +306,8 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp); EXTERN_C Kernel::Void idt_handle_math(Kernel::UIntPtr rsp); EXTERN_C Kernel::Void idt_handle_pf(Kernel::UIntPtr rsp); -EXTERN_C Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr); -EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); +EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr); +EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; diff --git a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc index 28d36c5a..c6425cf1 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc @@ -16,12 +16,12 @@ STATIC struct PROCESS_CONTROL_BLOCK final VoidPtr f_Image; } kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; -EXTERN_C HAL::StackFramePtr mp_get_current_context(Void) +EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid) { - return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; + return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame; } -EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) +EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid) { MUST_PASS(image && stack_ptr && stack_frame); return No; |
