From 026f80a95bb28e9d692fc44203c5a9b1336ce394 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 10 Sep 2021 16:45:12 +0300 Subject: [PATCH] Kernel/ACPI: Simplify parser initialization Let's remove the DynamicParser class, as it really did nothing yet in the Kernel. Instead, when we add support for AML parsing, we can figure out how to do it properly without the need of a derived class that just complicates everything for no good reason. --- Kernel/ACPI/Definitions.h | 2 -- Kernel/ACPI/DynamicParser.cpp | 58 ------------------------------ Kernel/ACPI/DynamicParser.h | 43 ---------------------- Kernel/ACPI/Initialize.cpp | 18 ++++++---- Kernel/ACPI/Parser.cpp | 68 ++++++++++++++--------------------- Kernel/ACPI/Parser.h | 43 ++++++++++------------ Kernel/CMakeLists.txt | 1 - Kernel/CommandLine.cpp | 2 +- Kernel/init.cpp | 2 +- 9 files changed, 59 insertions(+), 178 deletions(-) delete mode 100644 Kernel/ACPI/DynamicParser.cpp delete mode 100644 Kernel/ACPI/DynamicParser.h 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