From 690e1884f1fcc7128d97efaa64f933eb8f811cfd Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 17 Jan 2026 21:11:37 +0100 Subject: feat: kernel: stability improvements on the scheduler and AMD64 HAL. Signed-off-by: Amlal El Mahrouss --- src/boot/amd64-desktop.make | 2 +- src/kernel/HALKit/AMD64/HalCommonAPI.asm | 6 ++-- src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 42 ++++++++++++++-------- src/kernel/HALKit/AMD64/HalInterruptAPI.asm | 19 +++++++++- src/kernel/src/BitMapMgr.cc | 10 +++--- src/kernel/src/Storage/AHCIDeviceInterface.cc | 6 ++-- src/kernel/src/Storage/ATADeviceInterface.cc | 6 ++-- src/kernel/src/ZXD.cc | 5 --- src/kernel/src/ZXDCodeMgr.cc | 6 ++++ 9 files changed, 69 insertions(+), 33 deletions(-) delete mode 100644 src/kernel/src/ZXD.cc create mode 100644 src/kernel/src/ZXDCodeMgr.cc (limited to 'src') diff --git a/src/boot/amd64-desktop.make b/src/boot/amd64-desktop.make index 26877369..d1043d56 100644 --- a/src/boot/amd64-desktop.make +++ b/src/boot/amd64-desktop.make @@ -117,7 +117,7 @@ compile-amd64: .PHONY: run-efi-amd64-ahci run-efi-amd64-ahci: - $(EMU) $(EMU_FLAGS) -monitor stdio -hda $(IMG) -s -boot menu=on + $(EMU) $(EMU_FLAGS) -d int -hda $(IMG) -s -boot menu=on .PHONY: run-efi-amd64-ata-pio run-efi-amd64-ata-pio: diff --git a/src/kernel/HALKit/AMD64/HalCommonAPI.asm b/src/kernel/HALKit/AMD64/HalCommonAPI.asm index 144e5e7a..f571aba7 100644 --- a/src/kernel/HALKit/AMD64/HalCommonAPI.asm +++ b/src/kernel/HALKit/AMD64/HalCommonAPI.asm @@ -92,7 +92,7 @@ sched_jump_to_task: push rbp mov rbp, rsp - mov ax, 0x30 + mov ax, 0x33 mov ds, ax mov es, ax mov fs, ax @@ -101,11 +101,11 @@ sched_jump_to_task: mov ax, 0x18 ltr ax - push 0x30 + push 0x33 mov rdx, [rcx + 0x08] push rdx o64 pushf - push 0x28 + push 0x2B mov rdx, [rcx + 0x00] push rdx diff --git a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index 14ec5f60..040f5daa 100644 --- a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -31,26 +31,32 @@ static void hal_idt_send_eoi(UInt8 vector) { /// @param rsp EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - process.Crash(); + + if (process) process.Crash(); hal_idt_send_eoi(13); - process.Signal.SignalArg = rsp; - process.Signal.SignalID = SIGKILL; - process.Signal.Status = process.Status; + if (process) { + process.Signal.SignalArg = rsp; + process.Signal.SignalID = SIGKILL; + process.Signal.Status = process.Status; + } } /// @brief Handle page fault. /// @param rsp EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - process.Crash(); + + if (process) process.Crash(); hal_idt_send_eoi(14); - process.Signal.SignalArg = rsp; - process.Signal.SignalID = SIGKILL; - process.Signal.Status = process.Status; + if (process) { + process.Signal.SignalArg = rsp; + process.Signal.SignalID = SIGKILL; + process.Signal.Status = process.Status; + } } /// @brief Handle scheduler interrupt. @@ -73,21 +79,24 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - process.Crash(); + + if (process) process.Crash(); hal_idt_send_eoi(8); - process.Signal.SignalArg = rsp; - process.Signal.SignalID = sig_generate_unique(); - ; - process.Signal.Status = process.Status; + if (process) { + process.Signal.SignalArg = rsp; + process.Signal.SignalID = sig_generate_unique(); + process.Signal.Status = process.Status; + } } /// @brief Handle any generic fault. /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - process.Crash(); + + if (process) process.Crash(); hal_idt_send_eoi(30); @@ -104,6 +113,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); + if (process) process.Crash(); + hal_idt_send_eoi(3); process.Signal.SignalArg = rip; @@ -118,7 +129,8 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { /// @param rsp EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - process.Crash(); + + if (process) process.Crash(); hal_idt_send_eoi(6); diff --git a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm index c761684e..be8675f8 100644 --- a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -206,7 +206,24 @@ __NE_INT_32: o64 iret -IntNormal 33 +global __NE_INT_33 +__NE_INT_33: + cli + + push rax + + ; Read scancode from keyboard port to acknowledge + in al, 0x60 + + ; Send EOI to master PIC + mov al, 0x20 + out 0x20, al + + pop rax + + std + + o64 iret IntNormal 34 IntNormal 35 diff --git a/src/kernel/src/BitMapMgr.cc b/src/kernel/src/BitMapMgr.cc index 76a6a42f..56c261c2 100644 --- a/src/kernel/src/BitMapMgr.cc +++ b/src/kernel/src/BitMapMgr.cc @@ -127,12 +127,14 @@ namespace HAL { } UIntPtr raw_base = reinterpret_cast(base); - UIntPtr offset = (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) - ? (size + pad) - : ptr_bit_set[kBitMapSizeIdx]; + + if (ptr_bit_set[kBitMapSizeIdx] > kBitMapMaxSz) return nullptr; + + UIntPtr offset = (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) + ? (size + pad) + : ptr_bit_set[kBitMapSizeIdx]; base = reinterpret_cast(raw_base + offset); - if (base == nullptr) return nullptr; } return nullptr; diff --git a/src/kernel/src/Storage/AHCIDeviceInterface.cc b/src/kernel/src/Storage/AHCIDeviceInterface.cc index fd3c30cc..6d910f37 100644 --- a/src/kernel/src/Storage/AHCIDeviceInterface.cc +++ b/src/kernel/src/Storage/AHCIDeviceInterface.cc @@ -4,7 +4,7 @@ #include -using namespace Kernel; +namespace Kernel { /// @brief Class constructor /// @param Out Drive output @@ -82,4 +82,6 @@ const UInt32& AHCIDeviceInterface::GetIndex() { Void AHCIDeviceInterface::SetIndex(const UInt32& drv) { MUST_PASS(IMountpoint::kDriveIndexInvalid < drv); this->fDriveIndex = drv; -} \ No newline at end of file +} + +} // namespace Kernel \ No newline at end of file diff --git a/src/kernel/src/Storage/ATADeviceInterface.cc b/src/kernel/src/Storage/ATADeviceInterface.cc index f360325c..98997579 100644 --- a/src/kernel/src/Storage/ATADeviceInterface.cc +++ b/src/kernel/src/Storage/ATADeviceInterface.cc @@ -4,7 +4,7 @@ #include -using namespace Kernel; +namespace Kernel { /// @brief Class constructor /// @param Out Drive output @@ -91,4 +91,6 @@ const UInt16& ATADeviceInterface::GetMaster() { Void ATADeviceInterface::SetMaster(const UInt16& drv) { MUST_PASS(0xFFFF != drv); this->fMaster = drv; -} \ No newline at end of file +} + +} // namespace Kernel \ No newline at end of file diff --git a/src/kernel/src/ZXD.cc b/src/kernel/src/ZXD.cc deleted file mode 100644 index 5b2b044c..00000000 --- a/src/kernel/src/ZXD.cc +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (see LICENSE file) -// Official repository: https://github.com/nekernel-org/nekernel - -#include diff --git a/src/kernel/src/ZXDCodeMgr.cc b/src/kernel/src/ZXDCodeMgr.cc new file mode 100644 index 00000000..c8e8041e --- /dev/null +++ b/src/kernel/src/ZXDCodeMgr.cc @@ -0,0 +1,6 @@ +// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (see LICENSE file) +// Official repository: https://github.com/nekernel-org/nekernel + +#include +#include -- cgit v1.2.3