summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-19 10:24:52 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-05-19 10:24:52 +0200
commita9653add416fbddc1969a75adb733bc9e9c675d6 (patch)
treec03a8acfd7e1f3e4ffe1407d9acd4e1d52de76b4 /dev/kernel/HALKit/AMD64
parentce71265ae5bd333c309dff8c2d46e4d52dd78066 (diff)
feat(kernel, sched): Architectural improvements, and cleaned up
the codebase from previous implementations that didn't work/scale well. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc42
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc10
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc7
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelPanic.cc7
4 files changed, 37 insertions, 29 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index b12dc7fe..78db9b16 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -51,8 +51,7 @@ struct HAL_HARDWARE_THREAD;
struct HAL_HARDWARE_THREAD final {
HAL::StackFramePtr mFramePtr;
- ProcessID mProcessID{0};
- UInt8 mCoreID{0};
+ ProcessID mThreadID{0};
};
STATIC HAL_APIC_MADT* kMADTBlock = nullptr;
@@ -100,18 +99,24 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) {
STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
-EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid) {
- const auto process_index = pid % kSchedProcessLimitPerTeam;
+EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) {
+ const auto process_index = thrdid % kSchedProcessLimitPerTeam;
return kHWThread[process_index].mFramePtr;
}
-EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) {
- if (pid > kSMPCount) return NO;
+EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) {
+ if (thrdid > kSMPCount) return NO;
if (mp_is_smp()) {
- kHWThread[pid].mFramePtr = stack_frame;
- kHWThread[pid].mProcessID = pid;
+ kHWThread[thrdid].mFramePtr = stack_frame;
+ kHWThread[thrdid].mThreadID = thrdid;
+
+ STATIC HardwareTimer timer{rtl_milliseconds(1000)};
+
+ timer.Wait();
+
+ HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO);
return YES;
}
@@ -151,7 +156,14 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
PowerFactoryInterface hw_and_pow_int{vendor_ptr};
- kRawMADT = hw_and_pow_int.Find(APIC_MAG).Leak().Leak();
+ auto pwr = hw_and_pow_int.Find(APIC_MAG);
+
+ if (pwr.HasError()) {
+ kSMPAware = NO;
+ return;
+ }
+
+ kRawMADT = pwr.Leak().Leak();
kMADTBlock = reinterpret_cast<HAL_APIC_MADT*>(kRawMADT);
kSMPAware = NO;
@@ -181,11 +193,6 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
controller.Write(LAPIC_REG_TIMER_LVT, 32 | (1 << 17));
controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000);
- UInt8* trampoline_phys = (UInt8*) 0x7c00;
-
- *trampoline_phys = 0xcd;
- *(trampoline_phys + 1) = 0x00;
-
volatile UInt8* entry_ptr = reinterpret_cast<volatile UInt8*>(kMADTBlock->List);
volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length;
@@ -203,14 +210,15 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
kAPICLocales[kSMPCount] = entry_struct->ProcessorID;
++kSMPCount;
- kout << "LAPIC type, also is on...\r";
+ kout << "Kind: LAPIC: ON\r";
+ // 0x7c00, as recommended by the Intel SDM.
hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c);
} else {
- kout << "LAPIC type, also is not on...\r";
+ kout << "Kind: LAPIC: OFF\r";
}
} else {
- kout << "Unknown APIC type...\r";
+ kout << "Kind: UNKNOWN: ?\r";
}
entry_ptr += length;
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index eac6c389..51fc4f0e 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -54,8 +54,6 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) {
Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Crash();
-
- dbg_break_point();
}
/// @brief Handle page fault.
@@ -82,8 +80,6 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) {
process.Leak().Signal.Status = process.Leak().Status;
process.Leak().Crash();
-
- dbg_break_point();
}
/// @brief Handle scheduler interrupt.
@@ -125,8 +121,6 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) {
Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Crash();
-
- dbg_break_point();
}
/// @brief Handle any generic fault.
@@ -155,8 +149,6 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) {
Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Crash();
-
- dbg_break_point();
}
EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) {
@@ -216,8 +208,6 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) {
Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Crash();
-
- dbg_break_point();
}
/// @brief Enter syscall from assembly.
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 6020da3b..4de43f27 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -108,6 +108,13 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) {
HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard;
+ HardwareThreadScheduler::The()[index].Leak()->Busy(NO);
+ }
+
+ for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count();
+ ++index) {
+ UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status =
+ ProcessStatusKind::kInvalid;
}
rtl_create_user_process(sched_idle_task, "MgmtSrv"); //! Mgmt command server.
diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
index 7ec235bd..76b92574 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
@@ -31,6 +31,7 @@ class RecoveryFactory final {
/***********************************************************************************/
Void ke_panic(const Kernel::Int32& id, const Char* message) {
(Void)(kout << "*** STOP ***\r");
+
(Void)(kout << "Kernel_Panic_MSG: " << message << kendl);
(Void)(kout << "Kernel_Panic_ID: " << hex_number(id) << kendl);
(Void)(kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr) hal_read_cr2()) << kendl);
@@ -46,8 +47,10 @@ Void RecoveryFactory::Recover() noexcept {
void ke_runtime_check(bool expr, const Char* file, const Char* line) {
if (!expr) {
- (Void)(kout << "Kernel_Panic_File: " << file << kendl);
- (Void)(kout << "Kernel_Panic_Line: " << line << kendl);
+ (Void)(kout << "*** CHECK ***\r");
+
+ (Void)(kout << "Kernel_Panic_FILE: " << file << kendl);
+ (Void)(kout << "Kernel_Panic_LINE: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}