summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-25 08:37:12 +0200
committerAmlal <amlal@nekernel.org>2025-04-25 08:37:12 +0200
commit97f5407670a796ba41e107175f8242abba0c81cc (patch)
tree931e6e6dc703485129769b71f4dafa5e0bfcbb2a /dev/kernel/HALKit
parent2a34afdf04a5ec24d091469fa50a09882c898881 (diff)
dev, boot, kernel: improvements, and fixing the VEPM formatter.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/HALKit')
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc52
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelPanic.cc10
-rw-r--r--dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc16
-rw-r--r--dev/kernel/HALKit/AMD64/PCI/DMA.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc2
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc2
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelPanic.cc4
-rw-r--r--dev/kernel/HALKit/POWER/AP.h4
-rw-r--r--dev/kernel/HALKit/POWER/HalAP.cc40
-rw-r--r--dev/kernel/HALKit/POWER/HalApplicationProcessor.cc41
-rw-r--r--dev/kernel/HALKit/POWER/HalHardwareThread.cc (renamed from dev/kernel/HALKit/POWER/HalThread.cc)0
-rw-r--r--dev/kernel/HALKit/RISCV/AP.h4
-rw-r--r--dev/kernel/HALKit/RISCV/HalAP.cc40
-rw-r--r--dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc45
15 files changed, 140 insertions, 126 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 1f865057..fc50380a 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -36,15 +36,17 @@
namespace Kernel::HAL
{
- struct PROCESS_APIC_MADT;
- struct PROCESS_CONTROL_BLOCK;
+ struct HAL_APIC_MADT;
+ struct HAL_HARDWARE_THREAD;
- struct PROCESS_CONTROL_BLOCK final
+ struct HAL_HARDWARE_THREAD final
{
- HAL::StackFramePtr mFrame;
+ HAL::StackFramePtr mFramePtr;
+ ProcessID mProcessID{0};
+ UInt8 mCoreID{0};
};
- STATIC PROCESS_APIC_MADT* kMADTBlock = nullptr;
+ STATIC HAL_APIC_MADT* kMADTBlock = nullptr;
STATIC Bool kSMPAware = false;
STATIC Int64 kSMPCount = 0;
@@ -55,7 +57,7 @@ namespace Kernel::HAL
STATIC VoidPtr kRawMADT = nullptr;
/// @brief Multiple APIC Descriptor Table.
- struct PROCESS_APIC_MADT final SDT_OBJECT
+ struct HAL_APIC_MADT final SDT_OBJECT
{
UInt32 Address; // Madt address
UInt8 Flags; // Madt flags
@@ -65,8 +67,8 @@ namespace Kernel::HAL
UInt8 Type;
UInt8 Len;
- union {
- struct
+ union APIC {
+ struct IOAPIC
{
UInt8 IoID;
UInt8 Zero;
@@ -74,7 +76,7 @@ namespace Kernel::HAL
UInt32 GISBase;
} IOAPIC;
- struct
+ struct LAPIC_NMI
{
UInt8 Source;
UInt8 IRQSource;
@@ -82,27 +84,27 @@ namespace Kernel::HAL
UInt16 Flags;
} LApicNMI;
- struct
+ struct LAPIC
{
UInt8 ProcessorID;
UInt16 Flags;
UInt8 LINT;
} LAPIC;
- struct
+ struct LAPIC_OVERRIDE
{
UInt16 Reserved;
UInt64 Address;
} LApicOverride;
- struct
+ struct LAPIC_X2
{
UInt16 Reserved;
UInt32 x2APICID;
UInt32 Flags;
UInt32 AcpiID;
- } LApic;
- };
+ } LocalApicX2;
+ } Apic;
} List[1]; // Records List
};
@@ -145,12 +147,13 @@ namespace Kernel::HAL
}
}
- STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+ STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid)
{
const auto process_index = pid % kSchedProcessLimitPerTeam;
- return kProcessBlocks[process_index].mFrame;
+
+ return kHWThread[process_index].mFramePtr;
}
EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid)
@@ -159,11 +162,12 @@ namespace Kernel::HAL
const auto process_index = pid % kSchedProcessLimitPerTeam;
- kProcessBlocks[process_index].mFrame = stack_frame;
+ kHWThread[process_index].mFramePtr = stack_frame;
+ kHWThread[process_index].mProcessID = pid;
- auto first_id = kAPICLocales[0];
+ kHWThread[process_index].mCoreID = kAPICLocales[0];
- hal_send_sipi(kApicBaseAddress, first_id, (UInt8)(((UIntPtr)stack_frame->BP) >> 12));
+ hal_send_sipi(kApicBaseAddress, kHWThread[process_index].mCoreID, (UInt8)(((UIntPtr)stack_frame->BP) >> 12));
return YES;
}
@@ -205,7 +209,7 @@ namespace Kernel::HAL
auto hw_and_pow_int = PowerFactoryInterface(vendor_ptr);
kRawMADT = hw_and_pow_int.Find(kAPIC_Signature).Leak().Leak();
- kMADTBlock = reinterpret_cast<PROCESS_APIC_MADT*>(kRawMADT);
+ kMADTBlock = reinterpret_cast<HAL_APIC_MADT*>(kRawMADT);
kSMPAware = NO;
if (kMADTBlock)
@@ -229,11 +233,11 @@ namespace Kernel::HAL
switch (kMADTBlock->List[index].Type)
{
case 0x00: {
- if (kMADTBlock->List[kSMPCount].LAPIC.ProcessorID < 1)
+ if (kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID < 1)
break;
- kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].LAPIC.ProcessorID;
- (void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl);
+ kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID;
+ (Void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl);
++kSMPCount;
break;
@@ -245,7 +249,7 @@ namespace Kernel::HAL
++index;
}
- (void)(kout << "SMP: Number of APs: " << number(kSMPCount) << kendl);
+ (Void)(kout << "SMP: Number of APs: " << number(kSMPCount) << kendl);
// Kernel is now SMP aware.
// That means that the scheduler is now available (on MP Kernels)
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 7dce21d1..4c873554 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -148,7 +148,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip)
kIsScheduling = NO;
- (void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
+ (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
Kernel::kout << "Kernel: SIGTRAP\r";
process.Leak().Signal.SignalArg = rip;
diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
index 2641f058..9c8a235a 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
@@ -33,9 +33,9 @@ namespace Kernel
/***********************************************************************************/
Void ke_panic(const Kernel::Int32& id, const Char* message)
{
- (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);
+ (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);
RecoveryFactory::Recover();
}
@@ -52,8 +52,8 @@ namespace Kernel
{
if (!expr)
{
- (void)(kout << "Kernel_Panic_File: " << file << kendl);
- (void)(kout << "Kernel_Panic_Line: " << line << kendl);
+ (Void)(kout << "Kernel_Panic_File: " << file << kendl);
+ (Void)(kout << "Kernel_Panic_Line: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}
diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
index c6c24be1..08caed82 100644
--- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
@@ -41,14 +41,14 @@ namespace Kernel::HAL
/***********************************************************************************/
STATIC Void mmi_page_status(Detail::PTE* pte)
{
- (void)(kout << (pte->Present ? "Present" : "Not Present") << kendl);
- (void)(kout << (pte->Wr ? "W/R" : "Not W/R") << kendl);
- (void)(kout << (pte->Nx ? "NX" : "Not NX") << kendl);
- (void)(kout << (pte->User ? "User" : "Not User") << kendl);
- (void)(kout << (pte->Pcd ? "Not Cached" : "Cached") << kendl);
- (void)(kout << (pte->Accessed ? "Accessed" : "Not Accessed") << kendl);
- (void)(kout << hex_number(pte->PhysicalAddress) << kendl);
- (void)(kout << (pte->ProtectionKey ? "Protected" : "Not Protected/PKU Disabled") << kendl);
+ (Void)(kout << (pte->Present ? "Present" : "Not Present") << kendl);
+ (Void)(kout << (pte->Wr ? "W/R" : "Not W/R") << kendl);
+ (Void)(kout << (pte->Nx ? "NX" : "Not NX") << kendl);
+ (Void)(kout << (pte->User ? "User" : "Not User") << kendl);
+ (Void)(kout << (pte->Pcd ? "Not Cached" : "Cached") << kendl);
+ (Void)(kout << (pte->Accessed ? "Accessed" : "Not Accessed") << kendl);
+ (Void)(kout << hex_number(pte->PhysicalAddress) << kendl);
+ (Void)(kout << (pte->ProtectionKey ? "Protected" : "Not Protected/PKU Disabled") << kendl);
}
/***********************************************************************************/
diff --git a/dev/kernel/HALKit/AMD64/PCI/DMA.cc b/dev/kernel/HALKit/AMD64/PCI/DMA.cc
index 4a63625e..b16039d4 100644
--- a/dev/kernel/HALKit/AMD64/PCI/DMA.cc
+++ b/dev/kernel/HALKit/AMD64/PCI/DMA.cc
@@ -38,7 +38,7 @@ namespace Kernel
if (!this->fAddress)
return false;
- (void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
+ (Void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
ke_dma_write<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset, bit);
@@ -52,7 +52,7 @@ namespace Kernel
if (!this->fAddress)
return ~0;
- (void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
+ (Void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
return (UIntPtr)ke_dma_read<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset);
}
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
index 257dd5c8..cd25ab7f 100644
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
@@ -108,7 +108,7 @@ ATAInit_Retry:
kATADiskModel[40] = '\0';
- (void)(kout << "Drive Model: " << kATADiskModel << kendl);
+ (Void)(kout << "Drive Model: " << kATADiskModel << kendl);
return true;
}
diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
index 1553b2ed..7d985a44 100644
--- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
@@ -93,7 +93,7 @@ namespace Kernel
const UInt16 kInterruptScheduler = 0x20;
- (void)(kout << "Handling interrupt for AP: " << interrupt << kendl);
+ (Void)(kout << "Handling interrupt for AP: " << interrupt << kendl);
switch (interrupt)
{
diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
index 1c88ccc6..ad966991 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
@@ -71,8 +71,8 @@ namespace Kernel
{
if (!expr)
{
- (void)(kout << "FAILED: FILE: " << file << kendl);
- (void)(kout << "FAILED: LINE: " << line << kendl);
+ (Void)(kout << "FAILED: FILE: " << file << kendl);
+ (Void)(kout << "FAILED: LINE: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}
diff --git a/dev/kernel/HALKit/POWER/AP.h b/dev/kernel/HALKit/POWER/AP.h
index c990b950..4558804b 100644
--- a/dev/kernel/HALKit/POWER/AP.h
+++ b/dev/kernel/HALKit/POWER/AP.h
@@ -26,7 +26,9 @@ namespace Kernel
typedef struct HAL_HARDWARE_THREAD
{
Kernel::UIntPtr fStartAddress;
- Kernel::UInt8 fPrivleged : 1;
+ Kernel::UIntPtr fStackPtr;
+ Kernel::UIntPtr fFramePtr;
+ Kernel::UInt8 fPrivileged : 1;
Kernel::UInt32 fPageMemoryFlags;
hal_ap_kind fIdentNumber;
} HAL_HARDWARE_THREAD;
diff --git a/dev/kernel/HALKit/POWER/HalAP.cc b/dev/kernel/HALKit/POWER/HalAP.cc
deleted file mode 100644
index 781b34a6..00000000
--- a/dev/kernel/HALKit/POWER/HalAP.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#include <HALKit/POWER/Processor.h>
-#include <KernelKit/DebugOutput.h>
-#include <HALKit/POWER/AP.h>
-
-using namespace Kernel;
-
-namespace Kernel::Detail
-{
- STATIC void mp_hang_fn(void)
- {
- while (YES)
- ;
- }
-} // namespace Kernel::Detail
-
-/// @brief wakes up thread.
-/// wakes up thread from hang.
-void mp_wakeup_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
-
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
-}
-
-/// @brief makes thread sleep.
-/// hooks and hangs thread to prevent code from executing.
-void mp_hang_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
-
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
-}
diff --git a/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc
new file mode 100644
index 00000000..ca2153e3
--- /dev/null
+++ b/dev/kernel/HALKit/POWER/HalApplicationProcessor.cc
@@ -0,0 +1,41 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <HALKit/POWER/Processor.h>
+#include <KernelKit/DebugOutput.h>
+#include <HALKit/POWER/AP.h>
+
+namespace Kernel::Detail
+{
+ STATIC void mp_hang_fn(void)
+ {
+ while (YES)
+ ;
+ }
+} // namespace Kernel::Detail
+
+namespace Kernel
+{
+ /// @brief wakes up thread.
+ /// wakes up thread from hang.
+ void mp_wakeup_thread(HAL::StackFramePtr stack)
+ {
+ if (!stack)
+ return;
+
+ hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
+ }
+
+ /// @brief makes thread sleep.
+ /// hooks and hangs thread to prevent code from executing.
+ void mp_hang_thread(HAL::StackFramePtr stack)
+ {
+ if (!stack)
+ return;
+
+ hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
+ }
+} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/HALKit/POWER/HalThread.cc b/dev/kernel/HALKit/POWER/HalHardwareThread.cc
index 40bb7d8a..40bb7d8a 100644
--- a/dev/kernel/HALKit/POWER/HalThread.cc
+++ b/dev/kernel/HALKit/POWER/HalHardwareThread.cc
diff --git a/dev/kernel/HALKit/RISCV/AP.h b/dev/kernel/HALKit/RISCV/AP.h
index 0a8546e9..e55e3462 100644
--- a/dev/kernel/HALKit/RISCV/AP.h
+++ b/dev/kernel/HALKit/RISCV/AP.h
@@ -22,7 +22,9 @@ namespace Kernel
typedef struct HAL_HARDWARE_THREAD
{
Kernel::UIntPtr fStartAddress;
- Kernel::UInt8 fPrivleged : 1;
+ Kernel::UIntPtr fStackPtr;
+ Kernel::UIntPtr fFramePtr;
+ Kernel::UInt8 fPrivileged : 1;
Kernel::UInt32 fPageMemoryFlags;
hal_ap_kind fIdentNumber;
} HAL_HARDWARE_THREAD;
diff --git a/dev/kernel/HALKit/RISCV/HalAP.cc b/dev/kernel/HALKit/RISCV/HalAP.cc
deleted file mode 100644
index 72a3cf13..00000000
--- a/dev/kernel/HALKit/RISCV/HalAP.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#include <HALKit/RISCV/Processor.h>
-#include <KernelKit/DebugOutput.h>
-#include <HALKit/RISCV/AP.h>
-
-using namespace Kernel;
-
-namespace Kernel::Detail
-{
- STATIC void mp_hang_fn(void)
- {
- while (YES)
- ;
- }
-} // namespace Kernel::Detail
-
-/// @brief wakes up thread.
-/// wakes up thread from hang.
-void mp_wakeup_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
-
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
-}
-
-/// @brief makes thread sleep.
-/// hooks and hangs thread to prevent code from executing.
-void mp_hang_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
-
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
-}
diff --git a/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc
new file mode 100644
index 00000000..1967a649
--- /dev/null
+++ b/dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc
@@ -0,0 +1,45 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <HALKit/RISCV/Processor.h>
+#include <KernelKit/DebugOutput.h>
+#include <HALKit/RISCV/AP.h>
+
+using namespace Kernel;
+
+namespace Kernel
+{
+ namespace Detail
+ {
+ STATIC void mp_hang_fn(void)
+ {
+ while (YES)
+ ;
+ }
+
+ } // namespace Detail
+
+ /// @brief wakes up thread.
+ /// wakes up thread from hang.
+ void mp_wakeup_thread(HAL::StackFramePtr stack)
+ {
+ if (!stack)
+ return;
+
+ hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
+ }
+
+ /// @brief makes thread sleep.
+ /// hooks and hangs thread to prevent code from executing.
+ void mp_hang_thread(HAL::StackFramePtr stack)
+ {
+ if (!stack)
+ return;
+
+ hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
+ }
+
+} // namespace Kernel