summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-01-17 21:11:37 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-01-17 21:13:22 +0100
commit690e1884f1fcc7128d97efaa64f933eb8f811cfd (patch)
treed974ffee0a7a2b8c5a948d65314711f308c1a7a2 /src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
parent144ab97968b7efd2eacfb281e4d152bcad859671 (diff)
feat: kernel: stability improvements on the scheduler and AMD64 HAL.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc')
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc42
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);