summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 14:52:09 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 14:53:26 +0100
commit8c179d8801df7f5f77fe7ec65a0a98b7901dad09 (patch)
tree788ccdfd9e56e1b0402cc7b4b1af7d792888fd68 /dev
parente0633b442140d49e08af6759bd07c89e16ef0e2a (diff)
KAN-11: Half-done on AMD64, not yet started on ARM64.
KAN-12: Found GPF issue on DriveMgr, working on it. ADD: Improvement of the BootThread class. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/Boot/amd64-desktop.make4
-rw-r--r--dev/Boot/src/BootThread.cc10
-rw-r--r--dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc66
-rw-r--r--dev/Kernel/HALKit/AMD64/HalKernelMain.cc24
4 files changed, 88 insertions, 16 deletions
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make
index 5b1b1096..36cba61a 100644
--- a/dev/Boot/amd64-desktop.make
+++ b/dev/Boot/amd64-desktop.make
@@ -29,10 +29,10 @@ IMG=epm-master-1.img
IMG_2=epm-slave.img
IMG_3=epm-master-2.img
-EMU_FLAGS=-net none -smp 1 -m 8G -M q35 \
+EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \
-bios $(BIOS) -drive \
file=fat:rw:src/Root/,index=2,format=raw \
- -serial stdio
+ -d int
LD_FLAGS=-e Main --subsystem=10
diff --git a/dev/Boot/src/BootThread.cc b/dev/Boot/src/BootThread.cc
index e874c758..61f3e805 100644
--- a/dev/Boot/src/BootThread.cc
+++ b/dev/Boot/src/BootThread.cc
@@ -185,15 +185,19 @@ namespace Boot
if (own_stack)
{
- return rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(8) - 1]);
+ rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(8) - 1]);
}
else
{
- delete[] fStack;
+ if (fStack)
+ delete[] fStack;
+
+ fStack = nullptr;
+
return reinterpret_cast<HEL::HandoverProc>(fStartAddress)(fHandover);
}
- return NO;
+ return kEfiOk;
}
const Char* BootThread::GetName()
diff --git a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc b/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc
index 298dfe06..5d314aa7 100644
--- a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc
+++ b/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc
@@ -19,6 +19,8 @@
#define kApicSignature "APIC"
+#define kApicBaseAddress (0xFEE00000)
+
#define kAPIC_ICR_Low 0x300
#define kAPIC_ICR_High 0x310
#define kAPIC_SIPI_Vector 0x00500
@@ -48,9 +50,14 @@ namespace Kernel::HAL
STATIC Bool kSMPAware = false;
STATIC Int64 kSMPCount = 0;
- STATIC Int32 kSMPInterrupt = 0;
- STATIC UInt64 kAPICLocales[kSMPMax] = {0};
- STATIC VoidPtr kRawMADT = nullptr;
+ STATIC Int32 kSMPInterrupt = 0;
+ STATIC UInt64 kAPICLocales[kSMPMax] = {0};
+ STATIC struct
+ {
+ UInt64 mAddress;
+ BOOL mUsed;
+ } kAPICAddresses[kSMPMax];
+ STATIC VoidPtr kRawMADT = nullptr;
/// @brief Multiple APIC Descriptor Table.
struct MADT_TABLE final : public SDT
@@ -127,7 +134,7 @@ namespace Kernel::HAL
/// @param targetAddress
/// @return
/***********************************************************************************/
- Void hal_send_end_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress)
+ Void hal_send_sipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress)
{
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_High, (apicId << 24));
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
@@ -156,7 +163,36 @@ namespace Kernel::HAL
kProcessBlocks[process_index].f_Stack = stack_ptr;
kProcessBlocks[process_index].f_Image = image;
- return NO;
+ if (!mp_is_smp())
+ {
+ ke_panic(RUNTIME_CHECK_PROCESS, "The Kernel does not support non-SMP profiles as of now. We are unable to process this context switch.");
+ }
+ else
+ {
+ for (SizeT smpi = 0UL; smpi < kSMPMax; ++smpi)
+ {
+ if (!kAPICAddresses[smpi].mUsed)
+ {
+ kAPICAddresses[smpi].mUsed = YES;
+
+ hal_send_start_ipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
+
+ for (SizeT i = 0; i < 1000000; ++i)
+ ;
+
+ hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
+
+ for (SizeT i = 0; i < 1000000; ++i)
+ ;
+
+ hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
+
+ kAPICAddresses[smpi].mUsed = NO;
+ }
+ }
+ }
+
+ return YES;
}
/***********************************************************************************/
@@ -177,6 +213,12 @@ namespace Kernel::HAL
if (!vendor_ptr)
return;
+ if (!kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
+ {
+ kSMPAware = NO;
+ return;
+ }
+
auto hw_and_pow_int = PowerFactoryInterface(vendor_ptr);
kRawMADT = hw_and_pow_int.Find(kApicSignature).Leak().Leak();
@@ -185,7 +227,9 @@ namespace Kernel::HAL
if (kMADTBlock)
{
- SizeT index = 0;
+ SizeT index_address = 0;
+ SizeT index_local = 0;
+ SizeT index = 0;
// reset values.
@@ -205,19 +249,23 @@ namespace Kernel::HAL
switch (kMADTBlock->List[index].Type)
{
case 0x00: {
- kAPICLocales[index] = kMADTBlock->List[index].LAPIC.ProcessorID;
- kcout << "SMP: APIC ID: " << number(kAPICLocales[index]) << endl;
+ kAPICLocales[index_local] = kMADTBlock->List[index_local].LAPIC.ProcessorID;
+ kcout << "SMP: APIC ID: " << number(kAPICLocales[index_local]) << endl;
++kSMPCount;
break;
}
case 0x05: {
- madt_address = kMADTBlock->List[index].LAPIC_ADDRESS_OVERRIDE.Address;
+ kAPICAddresses[index_address].mAddress = kMADTBlock->List[index_address].LAPIC_ADDRESS_OVERRIDE.Address;
+ kAPICAddresses[index_address].mUsed = NO;
+
kcout << "SMP: APIC address: " << number(madt_address) << endl;
break;
}
}
++index;
+ ++index_address;
+ ++index_local;
}
kcout << "SMP: number of cores: " << number(kSMPCount) << endl;
diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
index b6ac0f3b..16571373 100644
--- a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
@@ -93,8 +93,28 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
rtl_kernel_main(0, nullptr, nullptr, 0);
- if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
- Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+ auto id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
+ while (YES);
+ }, "SMP Process #1");
+
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
+
+ id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
+ while (YES);
+ }, "SMP Process #2");
+
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
+
+ id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
+ while (YES);
+ }, "SMP Process #3");
+
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
+ Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
+
+ Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
Kernel::HAL::Register64 idt_reg;
idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable;