diff options
| author | Amlal El Mahrouss <amlal@el-mahrouss-logic.com> | 2024-03-29 23:10:36 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@el-mahrouss-logic.com> | 2024-03-29 23:14:16 +0100 |
| commit | 995e1580f9291c5b8e95687c59b95e561c0c4569 (patch) | |
| tree | 50616d08887f2ca193683ff188ca952a0bb0ce3e /Private/HALKit | |
| parent | 43ae417266c3127bbae35527c95c26e01ed50bd9 (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.cxx | 64 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 31 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalKernelMain.cxx | 8 |
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(); |
