summaryrefslogtreecommitdiffhomepage
path: root/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 20:39:06 +0100
committerAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 20:39:06 +0100
commitf99e383775fa43c5c1354067962b1590ff2abdae (patch)
treef83a9b232c0424963fc9989b517e53f903ee036f /Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
parent0ca5d0d92ee326f3deda797403c27090bd0784ab (diff)
NewBoot: Will work on AHCI instead, ATA is not getting any further in
the future. Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp')
-rw-r--r--Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
new file mode 100644
index 00000000..1e53140f
--- /dev/null
+++ b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -0,0 +1,127 @@
+/*
+ * ========================================================
+ *
+ * HCore
+ * Copyright Mahrouss Logic, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#include <HALKit/AMD64/ACPI/ACPIManager.hpp>
+#include <HALKit/AMD64/Processor.hpp>
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+//! NOTE: fGSI stands 'Field Global System Interrupt'
+
+namespace HCore::HAL {
+constexpr Int32 kThreadAPIC = 0;
+constexpr Int32 kThreadLAPIC = 1;
+constexpr Int32 kThreadIOAPIC = 2;
+constexpr Int32 kThreadAPIC64 = 3;
+constexpr Int32 kThreadBoot = 4;
+
+/*
+ *
+ * this is used to store info about the current running thread
+ * we use this struct to determine if we can use it, or mark it as used or on
+ * sleep.
+ *
+ */
+
+struct ProcessorInfoAMD64 final {
+ Int32 ThreadType;
+ UIntPtr JumpAddress;
+
+ struct {
+ UInt32 Code;
+ UInt32 Data;
+ UInt32 BSS;
+ } Selector;
+};
+
+static voidPtr kApicMadt = nullptr;
+static const char* kApicSignature = "APIC";
+
+struct Madt final {
+ char fMag[4];
+ Int32 fLength;
+ char fRev;
+
+ struct MadtAddress final {
+ UInt32 fPhysicalAddress;
+ UInt32 fFlags; // 1 = Dual Legacy PICs installed
+
+ Char fType;
+ Char fRecLen; // record length
+ };
+};
+
+struct MadtProcessorLocalApic final {
+ Char fProcessorId;
+ Char fApicId;
+ UInt32 fFlags;
+};
+
+struct MadtIOApic final {
+ Char fApicId;
+ Char fReserved;
+ UInt32 fAddress;
+ UInt32 fSystemInterruptBase;
+};
+
+struct MadtInterruptSource final {
+ Char fBusSource;
+ Char fIrqSource;
+ UInt32 fGSI;
+ UInt16 fFlags;
+};
+
+struct MadtInterruptNmi final {
+ Char fNmiSource;
+ Char fReserved;
+ UInt16 fFlags;
+ UInt32 fGSI;
+};
+
+struct MadtLocalApicAddressOverride final {
+ UInt16 fResvered;
+ UIntPtr fAddress;
+};
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+static Madt kApicMadtList[256];
+
+Madt* system_find_core(Madt* madt) {
+ madt = madt + sizeof(Madt);
+
+ if (string_compare(madt->fMag, kApicSignature,
+ string_length(kApicSignature)) == 0)
+ return madt;
+
+ return nullptr;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void system_get_cores(voidPtr rsdPtr) {
+ auto acpi = ACPIManager(rsdPtr);
+ kApicMadt = acpi.Find(kApicSignature).Leak().Leak();
+
+ MUST_PASS(kApicMadt); // MADT must exist.
+
+ SizeT counter = 0UL;
+ Madt* offset = system_find_core((Madt*)kApicMadt);
+ //! now find core addresses.
+ while (offset != nullptr) {
+ // calls rt_copy_memory in NewC++
+ kApicMadtList[counter] = *offset;
+ offset = system_find_core(offset);
+
+ ++counter;
+ }
+}
+} // namespace HCore::HAL
+
+///////////////////////////////////////////////////////////////////////////////////////