summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc71
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();