diff options
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 71 |
1 files changed, 51 insertions, 20 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 771a1e33..32be8dee 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -9,24 +9,31 @@ #include <NewKit/KString.h> #include <POSIXKit/signal.h> +STATIC BOOL kIsScheduling = NO; + /// @brief Handle GPF fault. /// @param rsp EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { - kcout << "Kernel: GPF.\r"; - auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + + kcout << "Kernel: GPF.\r"; + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); } @@ -35,21 +42,26 @@ 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"; - kcout << "Kernel: SIGKILL set.\r"; - auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + + kcout << "Kernel: Page Fault.\r"; + kcout << "Kernel: SIGKILL set.\r"; + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); @@ -59,10 +71,9 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { - static BOOL is_scheduling = NO; static Kernel::Int64 try_count_before_brute = 100000UL; - while (is_scheduling) + while (kIsScheduling) { --try_count_before_brute; @@ -71,32 +82,37 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) } try_count_before_brute = 100000UL; - is_scheduling = YES; + kIsScheduling = YES; kcout << "Kernel: Timer IRQ (Scheduler Notification).\r"; Kernel::UserProcessHelper::StartScheduling(); - is_scheduling = NO; + kIsScheduling = NO; } /// @brief Handle math fault. /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { - kcout << "Kernel: Math error (division by zero?).\r"; - auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + + kcout << "Kernel: Math error (division by zero?).\r"; + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); @@ -107,20 +123,25 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { - kcout << "Kernel: Generic Process Fault.\r"; - auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + + kcout << "Kernel: Generic Process Fault.\r"; + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); @@ -134,6 +155,11 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + kcout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << endl; kcout << "Kernel: SIGTRAP set.\r"; @@ -151,20 +177,25 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) /// @param rsp EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { - kcout << "Kernel: Undefined Opcode.\r"; - auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) Kernel::ke_panic(RUNTIME_CHECK_PAGE); + if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) + return; + + kIsScheduling = NO; + + kcout << "Kernel: Undefined Opcode.\r"; + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); |
