diff options
Diffstat (limited to 'dev/kernel/HALKit')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 52 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelPanic.cc | 10 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc | 16 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/PCI/DMA.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/ARM64/HalKernelPanic.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/POWER/AP.h | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/POWER/HalAP.cc | 40 | ||||
| -rw-r--r-- | dev/kernel/HALKit/POWER/HalApplicationProcessor.cc | 41 | ||||
| -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.h | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/RISCV/HalAP.cc | 40 | ||||
| -rw-r--r-- | dev/kernel/HALKit/RISCV/HalApplicationProcessor.cc | 45 |
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
|
