summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-01 13:29:29 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-04-01 13:29:29 +0200
commite2b41947cde11c870d96970712dcfb3aa76eb0cf (patch)
tree1fac60e9955a3d8d380e17b5665d89703a32a3c3
parent1c3b37123cef3fa9c69099bc6228d7b4a082ee90 (diff)
kernel/wip: SMP tweaks, and code cleanup.
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc15
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc3
-rw-r--r--dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc3
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc11
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc1
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc1
-rw-r--r--dev/kernel/src/KernelProcessScheduler.cc14
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc (renamed from dev/kernel/src/ProcessScheduler.cc)6
8 files changed, 36 insertions, 18 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 10361d8e..c7e639e4 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -210,16 +210,25 @@ namespace Kernel::HAL
if (kMADTBlock)
{
- SizeT index = 0;
+ SizeT index = 1;
kSMPInterrupt = 0;
kSMPCount = 0;
+ UInt32 eax, edx;
kout << "SMP: Starting APs...\r";
- UInt32 eax, edx;
kApicBaseAddress = kMADTBlock->Address;
+ constexpr auto kMemoryAPStart = 0x7C000;
+ Char* ptr_ap_code = reinterpret_cast<Char*>(kMemoryAPStart);
+
+ mm_map_page(ptr_ap_code, ptr_ap_code, kMMFlagsWr);
+
+ SizeT hal_ap_blob_len = hal_ap_blob_end - hal_ap_blob_start;
+
+ rt_copy_memory((Char*)hal_ap_blob_start, ptr_ap_code, hal_ap_blob_len);
+
while (Yes)
{
if (kMADTBlock->List[index].Type > 9 ||
@@ -244,7 +253,7 @@ namespace Kernel::HAL
/// TODO: HAL helper to create an address.
- hal_send_sipi(kApicBaseAddress, kAPICLocales[kSMPCount], (UInt8)(((UIntPtr)hal_ap_blob_start) >> 12));
+ hal_send_sipi(kApicBaseAddress, kAPICLocales[kSMPCount], (UInt8)(((UIntPtr)ptr_ap_code) >> 12));
++kSMPCount;
break;
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 3c2939b6..7de5bb0b 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -115,10 +115,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
auto process = Kernel::UserProcessScheduler::The().CurrentProcess();
if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning)
- {
- kout << "Getting here.\r";
return;
- }
kIsScheduling = NO;
diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
index d3ac8e7e..96276964 100644
--- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
+++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
@@ -4,6 +4,7 @@
------------------------------------------- */
+#include <FSKit/NeFS.h>
#include <ArchKit/ArchKit.h>
#include <HALKit/AMD64/Processor.h>
@@ -109,6 +110,8 @@ namespace Kernel::HAL
hal_load_idt(idt);
+ NeFS::fs_init_nefs();
+
Detail::hal_enable_pit(kPITTickForScheduler);
rt_sti();
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index f4dbc16e..0ebba546 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -94,7 +94,9 @@ EXTERN_C void hal_init_platform(
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
- Kernel::NeFS::fs_init_nefs();
+ kEndTim = hal_rdtsc_fn();
+
+ kout << "Boot Time: " << Kernel::number(kEndTim - kStartTim) << kendl;
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -106,12 +108,9 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
kEndTim = hal_rdtsc_fn();
- kout << "Cycles Spent Before Userland: " << Kernel::number(kEndTim - kStartTim) << kendl;
+ kout << "Init Time: " << Kernel::number(kEndTim - kStartTim) << kendl;
idt_loader.Load(idt_reg);
- while (YES)
- {
- continue;
- }
+ dbg_break_point();
}
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index 2a360e60..21d95b5d 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -15,7 +15,6 @@
*
*/
-#include "NewKit/Defines.h"
#include <KernelKit/DeviceMgr.h>
#include <KernelKit/DriveMgr.h>
#include <KernelKit/ProcessScheduler.h>
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
index c6eee7f7..aa3b50c4 100644
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
@@ -15,7 +15,6 @@
*
*/
-#include "NewKit/Defines.h"
#include <modules/ATA/ATA.h>
#include <ArchKit/ArchKit.h>
#include <KernelKit/DriveMgr.h>
diff --git a/dev/kernel/src/KernelProcessScheduler.cc b/dev/kernel/src/KernelProcessScheduler.cc
new file mode 100644
index 00000000..340adb39
--- /dev/null
+++ b/dev/kernel/src/KernelProcessScheduler.cc
@@ -0,0 +1,14 @@
+/* -------------------------------------------
+
+ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+ FILE: UserProcessScheduler.cc
+ PURPOSE: Low level/Ring-3 Process scheduler.
+
+------------------------------------------- */
+
+/***********************************************************************************/
+/// @file KernelProcessScheduler.cc
+/// @brief Privileged/Ring-0 process scheduler.
+/// @author Amlal El Mahrouss (amlal@nekernel.org)
+/***********************************************************************************/
diff --git a/dev/kernel/src/ProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 2cd8dcd4..da8553ba 100644
--- a/dev/kernel/src/ProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -9,7 +9,7 @@
/***********************************************************************************/
/// @file UserProcessScheduler.cc
-/// @brief User/Ring-3 process scheduler.
+/// @brief Unprivileged/Ring-3 process scheduler.
/// @author Amlal El Mahrouss (amlal@nekernel.org)
/***********************************************************************************/
@@ -439,9 +439,9 @@ namespace Kernel
if (mTeam.mProcessCount < 1)
{
- kout << "UserProcessScheduler::Run(): This team doesn't have any process!\r";
return 0UL;
}
+
for (; process_index < mTeam.AsArray().Capacity(); ++process_index)
{
auto& process = mTeam.AsArray()[process_index];
@@ -454,8 +454,6 @@ namespace Kernel
process.PTime = static_cast<Int32>(process.Affinity);
- kout << "Switch to: '" << process.Name << "'.\r";
-
// tell helper to find a core to schedule on.
BOOL ret = UserProcessHelper::Switch(process.Image.fCode, &process.StackReserve[process.StackSize - 1], process.StackFrame,
process.ProcessId);