summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc14
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm36
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc6
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);