summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit
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
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')
-rw-r--r--src/kernel/HALKit/AMD64/HalCommonAPI.asm6
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc42
-rw-r--r--src/kernel/HALKit/AMD64/HalInterruptAPI.asm19
3 files changed, 48 insertions, 19 deletions
diff --git a/src/kernel/HALKit/AMD64/HalCommonAPI.asm b/src/kernel/HALKit/AMD64/HalCommonAPI.asm
index 144e5e7a..f571aba7 100644
--- a/src/kernel/HALKit/AMD64/HalCommonAPI.asm
+++ b/src/kernel/HALKit/AMD64/HalCommonAPI.asm
@@ -92,7 +92,7 @@ sched_jump_to_task:
push rbp
mov rbp, rsp
- mov ax, 0x30
+ mov ax, 0x33
mov ds, ax
mov es, ax
mov fs, ax
@@ -101,11 +101,11 @@ sched_jump_to_task:
mov ax, 0x18
ltr ax
- push 0x30
+ push 0x33
mov rdx, [rcx + 0x08]
push rdx
o64 pushf
- push 0x28
+ push 0x2B
mov rdx, [rcx + 0x00]
push rdx
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);
diff --git a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
index c761684e..be8675f8 100644
--- a/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/src/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -206,7 +206,24 @@ __NE_INT_32:
o64 iret
-IntNormal 33
+global __NE_INT_33
+__NE_INT_33:
+ cli
+
+ push rax
+
+ ; Read scancode from keyboard port to acknowledge
+ in al, 0x60
+
+ ; Send EOI to master PIC
+ mov al, 0x20
+ out 0x20, al
+
+ pop rax
+
+ std
+
+ o64 iret
IntNormal 34
IntNormal 35