diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-17 21:11:37 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-17 21:13:22 +0100 |
| commit | 690e1884f1fcc7128d97efaa64f933eb8f811cfd (patch) | |
| tree | d974ffee0a7a2b8c5a948d65314711f308c1a7a2 /src/kernel/HALKit | |
| parent | 144ab97968b7efd2eacfb281e4d152bcad859671 (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.asm | 6 | ||||
| -rw-r--r-- | src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 42 | ||||
| -rw-r--r-- | src/kernel/HALKit/AMD64/HalInterruptAPI.asm | 19 |
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 |
