diff options
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 14 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 36 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 6 |
3 files changed, 26 insertions, 30 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 8957ca8f..5a530457 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -116,14 +116,13 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) { EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) { if (!stack_frame) return NO; - if (thrdid > kSMPCount) return NO; - if (!kSMPAware) { sched_jump_to_task(kHWThread[thrdid].mFramePtr); - return YES; } + if (thrdid > kSMPCount) return NO; + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); kHWThread[thrdid].mFramePtr = stack_frame; @@ -146,12 +145,6 @@ Bool mp_is_smp(Void) noexcept { Void mp_init_cores(VoidPtr vendor_ptr) noexcept { if (!vendor_ptr) return; - if (!kHandoverHeader) return; - - if (!kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) { - kSMPAware = NO; - return; - } PowerFactoryInterface hw_and_pow_int{vendor_ptr}; @@ -210,9 +203,6 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { ++kSMPCount; kout << "AP: kind: LAPIC: ON.\r"; - - // 0x7c00, as recommended by the Intel SDM. - hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c); } else { kout << "AP: kind: LAPIC: OFF.\r"; } diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index 3b3ad849..c761684e 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -16,7 +16,7 @@ %macro IntExp 1 global __NE_INT_%1 __NE_INT_%1: - cld + cli std @@ -26,7 +26,7 @@ __NE_INT_%1: %macro IntNormal 1 global __NE_INT_%1 __NE_INT_%1: - cld + cli std @@ -52,7 +52,7 @@ extern idt_handle_math section .text __NE_INT_0: - cld + cli push rcx call idt_handle_generic pop rcx @@ -62,7 +62,7 @@ __NE_INT_0: o64 iret __NE_INT_1: - cld + cli push rcx call idt_handle_generic pop rcx @@ -72,7 +72,7 @@ __NE_INT_1: o64 iret __NE_INT_2: - cld + cli push rcx call idt_handle_generic pop rcx @@ -83,7 +83,7 @@ __NE_INT_2: ;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched. __NE_INT_3: - cld + cli push rcx call idt_handle_breakpoint pop rcx @@ -93,7 +93,7 @@ __NE_INT_3: o64 iret __NE_INT_4: - cld + cli push rcx call idt_handle_generic @@ -104,14 +104,14 @@ __NE_INT_4: o64 iret __NE_INT_5: - cld + cli std o64 iret ;; Invalid opcode interrupt __NE_INT_6: - cld + cli push rcx call idt_handle_ud pop rcx @@ -121,7 +121,7 @@ __NE_INT_6: o64 iret __NE_INT_7: - cld + cli push rcx call idt_handle_generic pop rcx @@ -132,7 +132,7 @@ __NE_INT_7: ;; Invalid opcode interrupt __NE_INT_8: - cld + cli push rcx call idt_handle_math @@ -149,7 +149,7 @@ IntExp 11 IntExp 12 __NE_INT_13: - cld + cli push rcx call idt_handle_gpf @@ -162,7 +162,7 @@ __NE_INT_13: o64 iret __NE_INT_14: - cld + cli push rcx call idt_handle_pf pop rcx @@ -195,7 +195,7 @@ IntNormal 31 [extern kApicBaseAddress] __NE_INT_32: - cld + cli push rax mov rcx, rsp @@ -218,7 +218,7 @@ IntNormal 39 [extern rtl_rtl8139_interrupt_handler] __NE_INT_40: - cld + cli push rax mov rcx, rsp @@ -244,7 +244,7 @@ IntNormal 49 [extern hal_kernel_call_enter] __NE_INT_50: - cld + cli push rax mov rax, hal_system_call_enter @@ -262,7 +262,7 @@ __NE_INT_50: o64 iret __NE_INT_51: - cld + cli push rax mov rax, hal_kernel_call_enter @@ -301,7 +301,7 @@ section .text [global hal_load_gdt] hal_load_gdt: - cld + cli lgdt [rcx] diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index dfd71777..e23c5bc1 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -142,6 +142,12 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) { NeFS::fs_init_nefs(); #endif + UserProcessScheduler::The().SwitchTeam(kHighUserTeam); + + rtl_create_user_process([]() -> void { while (YES); }, "NeKernel"); + + HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); + HAL::Register64 idt_reg; idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable); |
