diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-16 09:51:24 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-16 10:08:17 +0200 |
| commit | 5b2ec031ab578caec8fbbdbe5350b9c0df493fd3 (patch) | |
| tree | a0aab7bea6ef32aaa48ece6bdf287974dd67c8eb /dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | |
| parent | b7c6e7aef4c2c647623520f65d78921841bdffaa (diff) | |
feat(kernel/ap): Improved and fixed the AP boot flow, also made sure that the segment
loading for the long mode stub works.
TODO:
- Stack pointer shall be set when jumping to AP routine.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index ff283141..d5a40390 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -11,9 +11,11 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); +EXTERN_C Kernel::UIntPtr kApicBaseAddress; + /// @brief Handle GPF fault. /// @param rsp -EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { +EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: General Protection Fault.\r"; @@ -27,6 +29,8 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle page fault. @@ -44,10 +48,16 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { + ((volatile UInt32*) kApicBaseAddress)[0xB0] = 0; + + Kernel::HAL::rt_out8(0x20, 0x20); + NE_UNUSED(rsp); Kernel::UserProcessHelper::StartScheduling(); } @@ -68,6 +78,8 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle any generic fault. @@ -87,6 +99,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { @@ -104,6 +118,8 @@ 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. @@ -124,6 +140,8 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Enter syscall from assembly. |
