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.cc30
1 files changed, 26 insertions, 4 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 7e2b8957..eac6c389 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -37,6 +37,9 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) {
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "General Access Fault.");
+ }
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();
@@ -62,6 +65,10 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Access Fault.");
+ }
+
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();
@@ -101,6 +108,9 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Math Fault.");
+ }
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();
@@ -126,6 +136,10 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Generic Fault.");
+ }
+
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();
@@ -146,10 +160,15 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
}
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
- hal_idt_send_eoi(3);
-
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ while (YES)
+ ;
+ }
+
+ hal_idt_send_eoi(3);
+
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();
@@ -167,8 +186,6 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
Kernel::kout << "Kernel: SIGTRAP status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kFrozen;
-
- idt_handle_scheduler(rip);
}
/// @brief Handle #UD fault.
@@ -180,6 +197,11 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess();
+ if (!process) {
+ while (YES)
+ ;
+ }
+
if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT ||
process.Leak().Signal.SignalID == SIGTRAP) {
dbg_break_point();