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/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 42 ++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to 'src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc') 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); -- cgit v1.2.3