summaryrefslogtreecommitdiffhomepage
path: root/Private/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@el-mahrouss-logic.com>2024-03-29 23:10:36 +0100
committerAmlal El Mahrouss <amlal@el-mahrouss-logic.com>2024-03-29 23:14:16 +0100
commit995e1580f9291c5b8e95687c59b95e561c0c4569 (patch)
tree50616d08887f2ca193683ff188ca952a0bb0ce3e /Private/HALKit
parent43ae417266c3127bbae35527c95c26e01ed50bd9 (diff)
Kernel: See below.
- Fix ACPI. - Parsing SDT correctly now. - Fix ke_runtime_check line endings. - Update Kernel heap magic and add padding to header. - Document Code Manager add limit for process teams. - Add execute_from_image for Code Manager. - Add loop for scheduler inside RuntimeMain. - Set SMP core to 4 for testing purposes. - Check for ACPI 2.x+ Signed-off-by: Amlal El Mahrouss <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'Private/HALKit')
-rw-r--r--Private/HALKit/AMD64/HalACPIFactoryInterface.cxx64
-rw-r--r--Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp31
-rw-r--r--Private/HALKit/AMD64/HalKernelMain.cxx8
3 files changed, 58 insertions, 45 deletions
diff --git a/Private/HALKit/AMD64/HalACPIFactoryInterface.cxx b/Private/HALKit/AMD64/HalACPIFactoryInterface.cxx
index 83642206..4d1844d9 100644
--- a/Private/HALKit/AMD64/HalACPIFactoryInterface.cxx
+++ b/Private/HALKit/AMD64/HalACPIFactoryInterface.cxx
@@ -9,15 +9,42 @@
#include <NewKit/String.hpp>
namespace NewOS {
-ACPIFactoryInterface::ACPIFactoryInterface(voidPtr rsdPtr) : m_Rsdp(rsdPtr), m_Entries(0) {
+
+/// Custom to the virtual machine, you'll need to parse the MADT instead.
+
+void rt_shutdown_acpi_qemu_20(void) { HAL::Out16(0xb004, 0x2000); }
+
+void rt_shutdown_acpi_qemu_30_plus(void) { HAL::Out16(0x604, 0x2000); }
+
+void rt_shutdown_acpi_virtualbox(void) { HAL::Out16(0x4004, 0x3400); }
+
+/// You have to parse the MADT!
+
+ACPIFactoryInterface::ACPIFactoryInterface(voidPtr rsdPtr)
+ : m_Rsdp(rsdPtr), m_Entries(0) {
volatile RSDP *_rsdPtr = reinterpret_cast<volatile RSDP *>(this->m_Rsdp);
MUST_PASS(_rsdPtr);
MUST_PASS(_rsdPtr->Revision >= 2);
}
-Void ACPIFactoryInterface::Shutdown() {}
-Void ACPIFactoryInterface::Reboot() {}
+Void ACPIFactoryInterface::Shutdown() {
+#ifdef __DEBUG__
+ rt_shutdown_acpi_qemu_30_plus();
+#else
+
+#endif
+}
+
+/// @brief Reboot (shutdowns on qemu.)
+/// @return
+Void ACPIFactoryInterface::Reboot() {
+#ifdef __DEBUG__
+ rt_shutdown_acpi_qemu_30_plus();
+#else
+
+#endif
+}
/// @brief Finds a descriptor table inside ACPI XSDT.
ErrorOr<voidPtr> ACPIFactoryInterface::Find(const char *signature) {
@@ -29,19 +56,26 @@ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const char *signature) {
RSDP *rsdPtr = reinterpret_cast<RSDP *>(this->m_Rsdp);
- auto xsdt = rsdPtr->XsdtAddress;
- SizeT num = (rsdPtr->Length + sizeof(SDT)) / 8;
+ if (rsdPtr->Revision <= 1) {
+ return ErrorOr<voidPtr>{-4};
+ }
+
+ SDT* xsdt = (SDT*)(rsdPtr->XsdtAddress >> (rsdPtr->XsdtAddress & 0xfff));
+ SizeT num = (xsdt->Length + sizeof(SDT)) / 8;
+
+ kcout << "ACPI: Number of entries: " << number(num) << endl;
constexpr short ACPI_SIGNATURE_LENGTH = 4;
for (Size index = 0; index < num; ++index) {
- SDT *sdt = reinterpret_cast<SDT *>(xsdt + sizeof(SDT) + index * 8);
+ SDT *sdt = (SDT*)*((UInt64*)(UInt64)xsdt + sizeof(SDT) + (index * 8));
- if (!Checksum(sdt->Signature, ACPI_SIGNATURE_LENGTH)) ke_stop(RUNTIME_CHECK_ACPI);
+ for (int signature_index = 0; signature_index < 4; signature_index++){
+ if (sdt->Signature[signature_index] != signature[signature_index])
+ break;
- if (StringBuilder::Equals(const_cast<const char *>(sdt->Signature),
- signature))
- return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>(sdt));
+ if (signature_index == 3) return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>((SDT*)sdt));;
+ }
}
return ErrorOr<voidPtr>{-1};
@@ -63,14 +97,4 @@ bool ACPIFactoryInterface::Checksum(const char *checksum, SSizeT len) {
return chr == 0;
}
-
-/// Custom to the virtual machine, you'll need to parse the MADT instead.
-
-void rt_shutdown_acpi_qemu_20(void) { HAL::Out16(0xb004, 0x2000); }
-
-void rt_shutdown_acpi_qemu_30_plus(void) { HAL::Out16(0x604, 0x2000); }
-
-void rt_shutdown_acpi_virtualbox(void) { HAL::Out16(0x4004, 0x3400); }
-
-/// You have to parse the MADT!
} // namespace NewOS
diff --git a/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index bbd3c6ea..f31e67c2 100644
--- a/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -43,11 +43,7 @@ STATIC voidPtr kApicMadt = nullptr;
STATIC const char* kApicSignature = "APIC";
/// @brief Multiple APIC descriptor table.
-struct MadtType final {
- char fMag[4];
- Int32 fLength;
- char fRev;
-
+struct MadtType final : public SDT {
struct MadtAddress final {
UInt32 fPhysicalAddress;
UInt32 fFlags; // 1 = Dual Legacy PICs installed
@@ -91,36 +87,21 @@ struct MadtLocalApicAddressOverride final {
///////////////////////////////////////////////////////////////////////////////////////
-STATIC MadtType kApicMadtList[256];
-
-MadtType* _hal_system_find_core(MadtType* madt) {
- madt = madt + sizeof(MadtType);
-
- if (rt_string_cmp(madt->fMag, kApicSignature,
- rt_string_len(kApicSignature)) == 0)
- return madt;
-
- return nullptr;
-}
+STATIC MadtType* kApicInfoBlock = nullptr;
///////////////////////////////////////////////////////////////////////////////////////
void hal_system_get_cores(voidPtr rsdPtr) {
+ kcout << "NewKernel.exe: Constructing ACPIFactoryInterface...\r\n";
+
auto acpi = ACPIFactoryInterface(rsdPtr);
kApicMadt = acpi.Find(kApicSignature).Leak().Leak();
MUST_PASS(kApicMadt); // MADT must exist.
- SizeT counter = 0UL;
- MadtType* offset = _hal_system_find_core((MadtType*)kApicMadt);
- //! now find core addresses.
- while (offset != nullptr) {
- // calls rt_copy_memory in NewC++
- kApicMadtList[counter] = *offset;
- offset = _hal_system_find_core(offset);
+ kcout << "NewKernel.exe: Successfuly fetched the MADT!\r\n";
- ++counter;
- }
+ kApicInfoBlock = (MadtType*)kApicMadt;
}
} // namespace NewOS::HAL
diff --git a/Private/HALKit/AMD64/HalKernelMain.cxx b/Private/HALKit/AMD64/HalKernelMain.cxx
index 029bca3c..f6b8e957 100644
--- a/Private/HALKit/AMD64/HalKernelMain.cxx
+++ b/Private/HALKit/AMD64/HalKernelMain.cxx
@@ -19,6 +19,12 @@
EXTERN_C NewOS::VoidPtr kInterruptVectorTable[];
EXTERN_C void RuntimeMain();
+namespace NewOS::HAL {
+/// @brief Gets the system cores using the MADT.
+/// @param rsdPtr the RSD PTR.
+extern void hal_system_get_cores(NewOS::voidPtr rsdPtr);
+} // namespace NewOS::HAL
+
EXTERN_C void hal_init_platform(
NewOS::HEL::HandoverInformationHeader* HandoverHeader) {
kHandoverHeader = HandoverHeader;
@@ -64,6 +70,8 @@ EXTERN_C void hal_init_platform(
NewOS::HAL::Detail::_ke_power_on_self_test();
+ NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
+
/// END POST
ToolboxInitRsrc();