summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
diff options
context:
space:
mode:
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);