diff options
Diffstat (limited to 'src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc')
| -rw-r--r-- | src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 42 |
1 files changed, 27 insertions, 15 deletions
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<SIGKILL>(); - ; - process.Signal.Status = process.Status; + if (process) { + process.Signal.SignalArg = rsp; + process.Signal.SignalID = sig_generate_unique<SIGKILL>(); + 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); |
