1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-23 13:17:36 +00:00

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.
This commit is contained in:
Liav A 2021-09-10 16:45:12 +03:00 committed by Andreas Kling
parent 6348b63476
commit 026f80a95b
9 changed files with 59 additions and 178 deletions

View file

@ -324,8 +324,6 @@ struct [[gnu::packed]] MCFG {
}; };
} }
class StaticParser;
class DynamicParser;
class Parser; class Parser;
namespace StaticParsing { namespace StaticParsing {

View file

@ -1,58 +0,0 @@
/*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/ACPI/DynamicParser.h>
#include <Kernel/ACPI/Parser.h>
#include <Kernel/Sections.h>
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();
}
}

View file

@ -1,43 +0,0 @@
/*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/RefPtr.h>
#include <Kernel/ACPI/Parser.h>
#include <Kernel/Interrupts/IRQHandler.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/PhysicalAddress.h>
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<Memory::Region> m_acpi_namespace;
};
}

View file

@ -1,12 +1,13 @@
/* /*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> * Copyright (c) 2020-2021, Liav A. <liavalb@hotmail.co.il>
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org> * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
#include <Kernel/ACPI/DynamicParser.h> #include <Kernel/ACPI/Parser.h>
#include <Kernel/CommandLine.h> #include <Kernel/CommandLine.h>
#include <Kernel/Memory/TypedMapping.h>
#include <Kernel/Sections.h> #include <Kernel/Sections.h>
namespace Kernel::ACPI { namespace Kernel::ACPI {
@ -21,10 +22,15 @@ UNMAP_AFTER_INIT void initialize()
if (!rsdp.has_value()) if (!rsdp.has_value())
return; return;
if (feature_level == AcpiFeatureLevel::Enabled) auto facp = StaticParsing::find_table(rsdp.value(), "FACP");
Parser::initialize<DynamicParser>(rsdp.value()); if (!facp.has_value())
else return;
Parser::initialize<Parser>(rsdp.value()); auto facp_table = Memory::map_typed<Structures::FADT>(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() bool is_enabled()

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> * Copyright (c) 2020-2021, Liav A. <liavalb@hotmail.co.il>
* Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
@ -26,6 +26,13 @@ Parser* Parser::the()
return s_acpi_parser; 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> ACPISysFSComponent::create(String name, PhysicalAddress paddr, size_t table_size) UNMAP_AFTER_INIT NonnullRefPtr<ACPISysFSComponent> ACPISysFSComponent::create(String name, PhysicalAddress paddr, size_t table_size)
{ {
return adopt_ref(*new (nothrow) ACPISysFSComponent(name, paddr, table_size)); return adopt_ref(*new (nothrow) ACPISysFSComponent(name, paddr, table_size));
@ -96,12 +103,6 @@ void Parser::enumerate_static_tables(Function<void(const StringView&, PhysicalAd
} }
} }
void Parser::set_the(Parser& parser)
{
VERIFY(!s_acpi_parser);
s_acpi_parser = &parser;
}
static bool match_table_signature(PhysicalAddress table_header, const StringView& signature); static bool match_table_signature(PhysicalAddress table_header, const StringView& signature);
static Optional<PhysicalAddress> search_table_in_xsdt(PhysicalAddress xsdt, const StringView& signature); static Optional<PhysicalAddress> search_table_in_xsdt(PhysicalAddress xsdt, const StringView& signature);
static Optional<PhysicalAddress> search_table_in_rsdt(PhysicalAddress rsdt, const StringView& signature); static Optional<PhysicalAddress> 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(); locate_main_system_description_table();
initialize_main_system_description_table(); initialize_main_system_description_table();
init_fadt(); process_fadt_data();
init_facs();
} }
UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(const StringView& signature) UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(const StringView& signature)
@ -129,24 +129,26 @@ UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(const StringView&
return {}; return {};
} }
UNMAP_AFTER_INIT void Parser::init_facs() bool Parser::handle_irq(const RegisterState&)
{ {
if (auto facs = find_table("FACS"); facs.has_value()) TODO();
m_facs = facs.value();
} }
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: Initializing Fixed ACPI data");
dmesgln("ACPI: Searching for the Fixed ACPI Data Table");
m_fadt = find_table("FACP").value(); VERIFY(!m_fadt.is_null());
auto sdt = Memory::map_typed<const volatile Structures::FADT>(m_fadt); dbgln_if(ACPI_DEBUG, "ACPI: FADT @ {}", m_fadt);
dbgln_if(ACPI_DEBUG, "ACPI: FADT @ V{}, {}", &sdt, m_fadt); auto sdt = Memory::map_typed<Structures::FADT>(m_fadt);
dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)sdt->h.revision, (size_t)sdt->h.length);
auto* header = &sdt.ptr()->h;
dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)header->revision, (size_t)header->length);
dmesgln("ACPI: DSDT {}", PhysicalAddress(sdt->dsdt_ptr)); 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); 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) UNMAP_AFTER_INIT Parser::Parser(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number)
: m_rsdp(rsdp) : IRQHandler(irq_number)
, m_rsdp(rsdp)
, m_fadt(fadt)
{ {
dmesgln("ACPI: Using RSDP @ {}", rsdp); dmesgln("ACPI: Using RSDP @ {}", rsdp);
locate_static_data(); locate_static_data();
@ -433,24 +437,4 @@ UNMAP_AFTER_INIT static Optional<PhysicalAddress> search_table_in_rsdt(PhysicalA
return {}; 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();
}
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> * Copyright (c) 2020-2021, Liav A. <liavalb@hotmail.co.il>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -9,7 +9,9 @@
#include <AK/Types.h> #include <AK/Types.h>
#include <Kernel/ACPI/Definitions.h> #include <Kernel/ACPI/Definitions.h>
#include <Kernel/ACPI/Initialize.h> #include <Kernel/ACPI/Initialize.h>
#include <Kernel/CommandLine.h>
#include <Kernel/FileSystem/SysFSComponent.h> #include <Kernel/FileSystem/SysFSComponent.h>
#include <Kernel/Interrupts/IRQHandler.h>
#include <Kernel/Memory/Region.h> #include <Kernel/Memory/Region.h>
#include <Kernel/PhysicalAddress.h> #include <Kernel/PhysicalAddress.h>
#include <Kernel/VirtualAddress.h> #include <Kernel/VirtualAddress.h>
@ -38,22 +40,23 @@ protected:
size_t m_length; size_t m_length;
}; };
class Parser { class Parser final : public IRQHandler {
public: public:
static Parser* the(); static Parser* the();
template<typename ParserType> static void must_initialize(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number);
static void initialize(PhysicalAddress rsdp)
{
set_the(*new ParserType(rsdp));
}
virtual Optional<PhysicalAddress> 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(); Optional<PhysicalAddress> find_table(const StringView& signature);
virtual bool can_reboot();
virtual void try_acpi_shutdown(); void try_acpi_reboot();
virtual bool can_shutdown() { return false; } bool can_reboot();
void try_acpi_shutdown();
bool can_shutdown() { return false; }
void enable_aml_parsing();
PhysicalAddress rsdp() const { return m_rsdp; } PhysicalAddress rsdp() const { return m_rsdp; }
PhysicalAddress main_system_description_table() const { return m_main_system_description_table; } 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::HardwareFeatures& hardware_features() const { return m_hardware_flags; }
const FADTFlags::x86_Specific_Flags& x86_specific_flags() const { return m_x86_specific_flags; } const FADTFlags::x86_Specific_Flags& x86_specific_flags() const { return m_x86_specific_flags; }
virtual void enable_aml_interpretation(); ~Parser() {};
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;
private: private:
static void set_the(Parser&); Parser(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_number);
void locate_static_data(); void locate_static_data();
void locate_main_system_description_table(); void locate_main_system_description_table();
void initialize_main_system_description_table(); void initialize_main_system_description_table();
size_t get_table_size(PhysicalAddress); size_t get_table_size(PhysicalAddress);
u8 get_table_revision(PhysicalAddress); u8 get_table_revision(PhysicalAddress);
void init_fadt(); void process_fadt_data();
void init_facs();
bool validate_reset_register(); bool validate_reset_register();
void access_generic_address(const Structures::GenericAddressStructure&, u32 value); void access_generic_address(const Structures::GenericAddressStructure&, u32 value);
@ -97,9 +92,9 @@ private:
Vector<PhysicalAddress> m_sdt_pointers; Vector<PhysicalAddress> m_sdt_pointers;
PhysicalAddress m_fadt; PhysicalAddress m_fadt;
PhysicalAddress m_facs;
bool m_xsdt_supported { false }; bool m_xsdt_supported { false };
bool m_can_process_bytecode { false };
FADTFlags::HardwareFeatures m_hardware_flags; FADTFlags::HardwareFeatures m_hardware_flags;
FADTFlags::x86_Specific_Flags m_x86_specific_flags; FADTFlags::x86_Specific_Flags m_x86_specific_flags;
}; };

View file

@ -19,7 +19,6 @@ set(KERNEL_HEAP_SOURCES
) )
set(KERNEL_SOURCES set(KERNEL_SOURCES
ACPI/DynamicParser.cpp
ACPI/Initialize.cpp ACPI/Initialize.cpp
ACPI/MultiProcessorParser.cpp ACPI/MultiProcessorParser.cpp
ACPI/Parser.cpp ACPI/Parser.cpp

View file

@ -137,7 +137,7 @@ UNMAP_AFTER_INIT StringView CommandLine::root_device() const
UNMAP_AFTER_INIT AcpiFeatureLevel CommandLine::acpi_feature_level() 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) if (value == "limited"sv)
return AcpiFeatureLevel::Limited; return AcpiFeatureLevel::Limited;
if (value == "off"sv) if (value == "off"sv)

View file

@ -5,9 +5,9 @@
*/ */
#include <AK/Types.h> #include <AK/Types.h>
#include <Kernel/ACPI/DynamicParser.h>
#include <Kernel/ACPI/Initialize.h> #include <Kernel/ACPI/Initialize.h>
#include <Kernel/ACPI/MultiProcessorParser.h> #include <Kernel/ACPI/MultiProcessorParser.h>
#include <Kernel/ACPI/Parser.h>
#include <Kernel/Arch/PC/BIOS.h> #include <Kernel/Arch/PC/BIOS.h>
#include <Kernel/Arch/x86/Processor.h> #include <Kernel/Arch/x86/Processor.h>
#include <Kernel/BootInfo.h> #include <Kernel/BootInfo.h>