diff --git a/Kernel/ACPI/Definitions.h b/Kernel/ACPI/Definitions.h index 2defd3d49c..ee46562144 100644 --- a/Kernel/ACPI/Definitions.h +++ b/Kernel/ACPI/Definitions.h @@ -324,8 +324,6 @@ struct [[gnu::packed]] MCFG { }; } -class StaticParser; -class DynamicParser; class Parser; namespace StaticParsing { diff --git a/Kernel/ACPI/DynamicParser.cpp b/Kernel/ACPI/DynamicParser.cpp deleted file mode 100644 index 1a08a7f798..0000000000 --- a/Kernel/ACPI/DynamicParser.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2020, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include - -namespace Kernel::ACPI { - -UNMAP_AFTER_INIT DynamicParser::DynamicParser(PhysicalAddress rsdp) - : IRQHandler(9) - , Parser(rsdp) -{ - dmesgln("ACPI: Dynamic Parsing Enabled, Can parse AML"); -} - -bool DynamicParser::handle_irq(const RegisterState&) -{ - // FIXME: Implement IRQ handling of ACPI signals! - VERIFY_NOT_REACHED(); -} - -void DynamicParser::enable_aml_interpretation() -{ - // FIXME: Implement AML Interpretation - VERIFY_NOT_REACHED(); -} -void DynamicParser::enable_aml_interpretation(File&) -{ - // FIXME: Implement AML Interpretation - VERIFY_NOT_REACHED(); -} -void DynamicParser::enable_aml_interpretation(u8*, u32) -{ - // FIXME: Implement AML Interpretation - VERIFY_NOT_REACHED(); -} -void DynamicParser::disable_aml_interpretation() -{ - // FIXME: Implement AML Interpretation - VERIFY_NOT_REACHED(); -} -void DynamicParser::try_acpi_shutdown() -{ - // FIXME: Implement AML Interpretation to perform ACPI shutdown - VERIFY_NOT_REACHED(); -} - -void DynamicParser::build_namespace() -{ - // FIXME: Implement AML Interpretation to build the ACPI namespace - VERIFY_NOT_REACHED(); -} - -} diff --git a/Kernel/ACPI/DynamicParser.h b/Kernel/ACPI/DynamicParser.h deleted file mode 100644 index 7f9158a85b..0000000000 --- a/Kernel/ACPI/DynamicParser.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace Kernel::ACPI { - -class DynamicParser final - : public IRQHandler - , public Parser { - friend class Parser; - -public: - virtual void enable_aml_interpretation() override; - virtual void enable_aml_interpretation(File& dsdt_file) override; - virtual void enable_aml_interpretation(u8* physical_dsdt, u32 dsdt_payload_legnth) override; - virtual void disable_aml_interpretation() override; - virtual void try_acpi_shutdown() override; - virtual bool can_shutdown() override { return true; } - virtual StringView purpose() const override { return "ACPI Parser"; } - -protected: - explicit DynamicParser(PhysicalAddress rsdp); - -private: - void build_namespace(); - // ^IRQHandler - virtual bool handle_irq(const RegisterState&) override; - - OwnPtr m_acpi_namespace; -}; - -} diff --git a/Kernel/ACPI/Initialize.cpp b/Kernel/ACPI/Initialize.cpp index dd1d0e11fd..0ec9d0d5d1 100644 --- a/Kernel/ACPI/Initialize.cpp +++ b/Kernel/ACPI/Initialize.cpp @@ -1,12 +1,13 @@ /* - * Copyright (c) 2020, Liav A. + * Copyright (c) 2020-2021, Liav A. * Copyright (c) 2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include +#include #include namespace Kernel::ACPI { @@ -21,10 +22,15 @@ UNMAP_AFTER_INIT void initialize() if (!rsdp.has_value()) return; - if (feature_level == AcpiFeatureLevel::Enabled) - Parser::initialize(rsdp.value()); - else - Parser::initialize(rsdp.value()); + auto facp = StaticParsing::find_table(rsdp.value(), "FACP"); + if (!facp.has_value()) + return; + auto facp_table = Memory::map_typed(facp.value()); + u8 irq_line = facp_table->sci_int; + + Parser::must_initialize(rsdp.value(), facp.value(), irq_line); + if (kernel_command_line().acpi_feature_level() == AcpiFeatureLevel::Enabled) + Parser::the()->enable_aml_parsing(); } bool is_enabled() diff --git a/Kernel/ACPI/Parser.cpp b/Kernel/ACPI/Parser.cpp index 624ce602ef..bf50541952 100644 --- a/Kernel/ACPI/Parser.cpp +++ b/Kernel/ACPI/Parser.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Liav A. + * Copyright (c) 2020-2021, Liav A. * Copyright (c) 2020-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause @@ -26,6 +26,13 @@ Parser* Parser::the() return s_acpi_parser; } +void Parser::must_initialize(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number) +{ + VERIFY(!s_acpi_parser); + s_acpi_parser = new (nothrow) Parser(rsdp, fadt, irq_number); + VERIFY(s_acpi_parser); +} + UNMAP_AFTER_INIT NonnullRefPtr ACPISysFSComponent::create(String name, PhysicalAddress paddr, size_t table_size) { return adopt_ref(*new (nothrow) ACPISysFSComponent(name, paddr, table_size)); @@ -96,12 +103,6 @@ void Parser::enumerate_static_tables(Function search_table_in_xsdt(PhysicalAddress xsdt, const StringView& signature); static Optional search_table_in_rsdt(PhysicalAddress rsdt, const StringView& signature); @@ -111,8 +112,7 @@ UNMAP_AFTER_INIT void Parser::locate_static_data() { locate_main_system_description_table(); initialize_main_system_description_table(); - init_fadt(); - init_facs(); + process_fadt_data(); } UNMAP_AFTER_INIT Optional Parser::find_table(const StringView& signature) @@ -129,24 +129,26 @@ UNMAP_AFTER_INIT Optional Parser::find_table(const StringView& return {}; } -UNMAP_AFTER_INIT void Parser::init_facs() +bool Parser::handle_irq(const RegisterState&) { - if (auto facs = find_table("FACS"); facs.has_value()) - m_facs = facs.value(); + TODO(); } -UNMAP_AFTER_INIT void Parser::init_fadt() +UNMAP_AFTER_INIT void Parser::enable_aml_parsing() +{ + // FIXME: When enabled, do other things to "parse AML". + m_can_process_bytecode = true; +} + +UNMAP_AFTER_INIT void Parser::process_fadt_data() { dmesgln("ACPI: Initializing Fixed ACPI data"); - dmesgln("ACPI: Searching for the Fixed ACPI Data Table"); - m_fadt = find_table("FACP").value(); - auto sdt = Memory::map_typed(m_fadt); + VERIFY(!m_fadt.is_null()); + dbgln_if(ACPI_DEBUG, "ACPI: FADT @ {}", m_fadt); - dbgln_if(ACPI_DEBUG, "ACPI: FADT @ V{}, {}", &sdt, m_fadt); - - auto* header = &sdt.ptr()->h; - dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)header->revision, (size_t)header->length); + auto sdt = Memory::map_typed(m_fadt); + dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)sdt->h.revision, (size_t)sdt->h.length); dmesgln("ACPI: DSDT {}", PhysicalAddress(sdt->dsdt_ptr)); m_x86_specific_flags.cmos_rtc_not_present = (sdt->ia_pc_boot_arch_flags & (u8)FADTFlags::IA_PC_Flags::CMOS_RTC_Not_Present); @@ -350,8 +352,10 @@ UNMAP_AFTER_INIT void Parser::locate_main_system_description_table() } } -UNMAP_AFTER_INIT Parser::Parser(PhysicalAddress rsdp) - : m_rsdp(rsdp) +UNMAP_AFTER_INIT Parser::Parser(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number) + : IRQHandler(irq_number) + , m_rsdp(rsdp) + , m_fadt(fadt) { dmesgln("ACPI: Using RSDP @ {}", rsdp); locate_static_data(); @@ -433,24 +437,4 @@ UNMAP_AFTER_INIT static Optional search_table_in_rsdt(PhysicalA return {}; } -void Parser::enable_aml_interpretation() -{ - VERIFY_NOT_REACHED(); -} - -void Parser::enable_aml_interpretation(File&) -{ - VERIFY_NOT_REACHED(); -} - -void Parser::enable_aml_interpretation(u8*, u32) -{ - VERIFY_NOT_REACHED(); -} - -void Parser::disable_aml_interpretation() -{ - VERIFY_NOT_REACHED(); -} - } diff --git a/Kernel/ACPI/Parser.h b/Kernel/ACPI/Parser.h index 190489bab5..80b32217a1 100644 --- a/Kernel/ACPI/Parser.h +++ b/Kernel/ACPI/Parser.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Liav A. + * Copyright (c) 2020-2021, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -38,22 +40,23 @@ protected: size_t m_length; }; -class Parser { +class Parser final : public IRQHandler { public: static Parser* the(); - template - static void initialize(PhysicalAddress rsdp) - { - set_the(*new ParserType(rsdp)); - } + static void must_initialize(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number); - virtual Optional find_table(const StringView& signature); + virtual StringView purpose() const override { return "ACPI Parser"; } + virtual bool handle_irq(const RegisterState&) override; - virtual void try_acpi_reboot(); - virtual bool can_reboot(); - virtual void try_acpi_shutdown(); - virtual bool can_shutdown() { return false; } + Optional find_table(const StringView& signature); + + void try_acpi_reboot(); + bool can_reboot(); + void try_acpi_shutdown(); + bool can_shutdown() { return false; } + + void enable_aml_parsing(); PhysicalAddress rsdp() const { return m_rsdp; } PhysicalAddress main_system_description_table() const { return m_main_system_description_table; } @@ -69,25 +72,17 @@ public: const FADTFlags::HardwareFeatures& hardware_features() const { return m_hardware_flags; } const FADTFlags::x86_Specific_Flags& x86_specific_flags() const { return m_x86_specific_flags; } - virtual void enable_aml_interpretation(); - virtual void enable_aml_interpretation(File&); - virtual void enable_aml_interpretation(u8*, u32); - virtual void disable_aml_interpretation(); - -protected: - explicit Parser(PhysicalAddress rsdp); - virtual ~Parser() = default; + ~Parser() {}; private: - static void set_the(Parser&); + Parser(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number); void locate_static_data(); void locate_main_system_description_table(); void initialize_main_system_description_table(); size_t get_table_size(PhysicalAddress); u8 get_table_revision(PhysicalAddress); - void init_fadt(); - void init_facs(); + void process_fadt_data(); bool validate_reset_register(); void access_generic_address(const Structures::GenericAddressStructure&, u32 value); @@ -97,9 +92,9 @@ private: Vector m_sdt_pointers; PhysicalAddress m_fadt; - PhysicalAddress m_facs; bool m_xsdt_supported { false }; + bool m_can_process_bytecode { false }; FADTFlags::HardwareFeatures m_hardware_flags; FADTFlags::x86_Specific_Flags m_x86_specific_flags; }; diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 22b4a5fb23..b9abbe5a35 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -19,7 +19,6 @@ set(KERNEL_HEAP_SOURCES ) set(KERNEL_SOURCES - ACPI/DynamicParser.cpp ACPI/Initialize.cpp ACPI/MultiProcessorParser.cpp ACPI/Parser.cpp diff --git a/Kernel/CommandLine.cpp b/Kernel/CommandLine.cpp index 8e73d808ef..154311450a 100644 --- a/Kernel/CommandLine.cpp +++ b/Kernel/CommandLine.cpp @@ -137,7 +137,7 @@ UNMAP_AFTER_INIT StringView CommandLine::root_device() const UNMAP_AFTER_INIT AcpiFeatureLevel CommandLine::acpi_feature_level() const { - auto value = kernel_command_line().lookup("acpi"sv).value_or("on"sv); + auto value = kernel_command_line().lookup("acpi"sv).value_or("limited"sv); if (value == "limited"sv) return AcpiFeatureLevel::Limited; if (value == "off"sv) diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 7024175fb3..d4650b153e 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -5,9 +5,9 @@ */ #include -#include #include #include +#include #include #include #include