summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-09-07 23:29:48 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-09-07 23:29:48 +0200
commitd3f87b1b84d355ad72366ced5d7e5a43207226c0 (patch)
treeae1f85714d2fc4deb77edfbb391344118180a715 /dev/kernel/HALKit
parent12d192e44e4269b8398021adbf524e0e7c8cf308 (diff)
feat: kernel: startup sequence fix, and new mgmt.hefs manual.
wip: LaunchKit for the `ne_launch` program. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit')
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc13
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc31
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc14
3 files changed, 15 insertions, 43 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index df5386e4..e3e08830 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -88,7 +88,7 @@ struct LAPIC final {
/// @param target
/// @return
/***********************************************************************************/
-Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) {
+EXTERN_C Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) {
Kernel::ke_dma_write<UInt32>(target, APIC_ICR_HIGH, apic_id << 24);
Kernel::ke_dma_write<UInt32>(target, APIC_ICR_LOW, 0x00000600 | 0x00004000 | 0x00000000 | vector);
@@ -200,10 +200,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
UInt8 type = *entry_ptr;
UInt8 length = *(entry_ptr + 1);
- // Avoid infinite loop on bad APIC tables.
- if (length < 2) break;
-
- if (type == 0) {
+ if (type == 0 && length == sizeof(struct LAPIC)) {
volatile LAPIC* entry_struct = (volatile LAPIC*) entry_ptr;
if (entry_struct->Flags & 0x1) {
@@ -212,15 +209,15 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
++kSMPCount;
- kout << "Kind: LAPIC: ON\r";
+ kout << "AP: kind: LAPIC: ON.\r";
// 0x7c00, as recommended by the Intel SDM.
hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c);
} else {
- kout << "Kind: LAPIC: OFF\r";
+ kout << "AP: kind: LAPIC: OFF.\r";
}
} else {
- kout << "Kind: UNKNOWN: OFF\r";
+ kout << "AP: kind: UNKNOWN: OFF.\r";
}
entry_ptr += length;
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index cb5d4af8..95214353 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -32,8 +32,6 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
HAL::rt_sti();
- kHandoverHeader = handover_hdr;
-
FB::fb_clear_video();
fw_init_efi((EfiSystemTable*) handover_hdr->f_FirmwareCustomTables[1]);
@@ -41,8 +39,9 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey,
handover_hdr->f_HardwareTables.f_ImageHandle);
- kBitMapCursor = 0UL;
- kKernelVM = kHandoverHeader->f_PageStart;
+ kHandoverHeader = handover_hdr;
+
+ kKernelVM = kHandoverHeader->f_PageStart;
if (!kKernelVM) {
MUST_PASS(kKernelVM);
@@ -55,6 +54,7 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
/* INITIALIZE BIT MAP. */
/************************************** */
+ kBitMapCursor = 0UL;
kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
kKernelBitMpStart =
reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(kHandoverHeader->f_BitMapStart));
@@ -133,20 +133,14 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
return kEfiFail;
}
-EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
+EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
using namespace Kernel;
- for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) {
- HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard;
- HardwareThreadScheduler::The()[index].Leak()->ID() = index;
- HardwareThreadScheduler::The()[index].Leak()->Busy(NO);
- }
+ HAL::Register64 idt_reg;
+ idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable);
- for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count();
- ++index) {
- UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status =
- ProcessStatusKind::kInvalid;
- }
+ HAL::IDTLoader idt_loader;
+ idt_loader.Load(idt_reg);
HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -158,13 +152,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept {
NeFS::fs_init_nefs();
#endif
- HAL::Register64 idt_reg;
- idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable);
-
- HAL::IDTLoader idt_loader;
-
- idt_loader.Load(idt_reg);
-
while (YES)
;
}
diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
index 096df49e..29541d48 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
@@ -37,8 +37,6 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
FB::fb_clear_video();
- kBitMapCursor = 0UL;
-
#ifdef __NE_ARM64_EFI__
fw_init_efi((EfiSystemTable*) handover_hdr->f_FirmwareCustomTables[1]);
@@ -50,23 +48,13 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) {
/* INITIALIZE BIT MAP. */
/************************************** */
+ kBitMapCursor = 0UL;
kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
/// @note do initialize the interrupts after it.
- 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;
- }
-
Kernel::mp_init_cores();
while (YES)