summaryrefslogtreecommitdiffhomepage
path: root/HALKit/AMD64/CoreMultiProcessingAMD64.cpp
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-06 09:14:11 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-06 09:14:11 +0100
commit5339d016c07bf717ee388f4feb73544087324af0 (patch)
tree94be6f67ed626091f24aee24ec3b3be03d01e4e7 /HALKit/AMD64/CoreMultiProcessingAMD64.cpp
git: port from mercurial repo.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'HALKit/AMD64/CoreMultiProcessingAMD64.cpp')
-rw-r--r--HALKit/AMD64/CoreMultiProcessingAMD64.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/HALKit/AMD64/CoreMultiProcessingAMD64.cpp b/HALKit/AMD64/CoreMultiProcessingAMD64.cpp
new file mode 100644
index 00000000..59812227
--- /dev/null
+++ b/HALKit/AMD64/CoreMultiProcessingAMD64.cpp
@@ -0,0 +1,134 @@
+/*
+ * ========================================================
+ *
+ * hCore
+ * Copyright Mahrouss Logic, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#include <HALKit/AMD64/Processor.hpp>
+#include <HALKit/AMD64/ACPI/ACPIManager.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;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////