1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:27:43 +00:00

Kernel: Simplify ACPI initialization a bit

Construct the parser, no matter which kind, in ACPI::initialize().
This commit is contained in:
Andreas Kling 2020-04-09 14:10:44 +02:00
parent 85c0557839
commit e983c745f7
7 changed files with 30 additions and 59 deletions

View file

@ -29,26 +29,13 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
void DynamicParser::initialize(PhysicalAddress rsdp)
{
if (!StaticParser::is_initialized()) {
new DynamicParser(rsdp);
}
}
void DynamicParser::initialize_without_rsdp()
{
if (!StaticParser::is_initialized()) {
new DynamicParser();
}
}
DynamicParser::DynamicParser() DynamicParser::DynamicParser()
: IRQHandler(9) : IRQHandler(9)
, StaticParser()
{ {
klog() << "ACPI: Dynamic Parsing Enabled, Can parse AML"; klog() << "ACPI: Dynamic Parsing Enabled, Can parse AML";
} }
DynamicParser::DynamicParser(PhysicalAddress rsdp) DynamicParser::DynamicParser(PhysicalAddress rsdp)
: IRQHandler(9) : IRQHandler(9)
, StaticParser(rsdp) , StaticParser(rsdp)

View file

@ -35,12 +35,13 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
class DynamicParser final : public IRQHandler
, StaticParser {
public:
static void initialize(PhysicalAddress rsdp);
static void initialize_without_rsdp();
class DynamicParser final
: public IRQHandler
, public StaticParser {
friend class Parser;
public:
virtual void enable_aml_interpretation() override; virtual void enable_aml_interpretation() override;
virtual void enable_aml_interpretation(File& dsdt_file) 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 enable_aml_interpretation(u8* physical_dsdt, u32 dsdt_payload_legnth) override;

View file

@ -29,24 +29,19 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
static Parser* s_acpi_parser; static Parser* s_acpi_parser;
Parser& Parser::the() Parser& Parser::the()
{ {
ASSERT(s_acpi_parser != nullptr); ASSERT(s_acpi_parser);
return *s_acpi_parser; return *s_acpi_parser;
} }
void Parser::initialize_limited() void Parser::set_the(Parser& parser)
{ {
if (!Parser::is_initialized()) { ASSERT(!s_acpi_parser);
s_acpi_parser = new Parser(false); s_acpi_parser = &parser;
}
}
bool Parser::is_initialized()
{
return (s_acpi_parser != nullptr);
} }
Parser::Parser(bool usable) Parser::Parser(bool usable)
@ -56,7 +51,6 @@ Parser::Parser(bool usable)
} else { } else {
klog() << "ACPI: Limited Initialization. Vital functions are disabled by a request"; klog() << "ACPI: Limited Initialization. Vital functions are disabled by a request";
} }
s_acpi_parser = this;
} }
PhysicalAddress Parser::find_table(const char*) PhysicalAddress Parser::find_table(const char*)

View file

@ -35,12 +35,17 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
class Parser { class Parser {
public: public:
static Parser& the(); static Parser& the();
static bool is_initialized(); template<typename ParserType>
static void initialize_limited(); static void initialize()
{
set_the(*new ParserType);
}
virtual PhysicalAddress find_table(const char* sig); virtual PhysicalAddress find_table(const char* sig);
virtual void try_acpi_reboot(); virtual void try_acpi_reboot();
@ -58,8 +63,12 @@ public:
virtual bool is_operable(); virtual bool is_operable();
protected: protected:
explicit Parser(bool usable); explicit Parser(bool usable = false);
bool m_operable; bool m_operable;
private:
static void set_the(Parser&);
}; };
} }
} }

View file

@ -36,24 +36,6 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
void StaticParser::initialize(PhysicalAddress rsdp)
{
if (!Parser::is_initialized()) {
new StaticParser(rsdp);
}
}
void StaticParser::initialize_without_rsdp()
{
if (!Parser::is_initialized()) {
new StaticParser();
}
}
bool StaticParser::is_initialized()
{
return Parser::is_initialized();
}
void StaticParser::locate_static_data() void StaticParser::locate_static_data()
{ {
locate_main_system_description_table(); locate_main_system_description_table();

View file

@ -32,12 +32,10 @@
namespace Kernel { namespace Kernel {
namespace ACPI { namespace ACPI {
class StaticParser : Parser { class StaticParser : public Parser {
public: friend class Parser;
static void initialize(PhysicalAddress rsdp);
static void initialize_without_rsdp();
static bool is_initialized();
public:
virtual PhysicalAddress find_table(const char* sig) override; virtual PhysicalAddress find_table(const char* sig) override;
virtual void try_acpi_reboot() override; virtual void try_acpi_reboot() override;
virtual bool can_reboot() override; virtual bool can_reboot() override;

View file

@ -51,13 +51,13 @@ void initialize()
{ {
switch (determine_feature_level()) { switch (determine_feature_level()) {
case FeatureLevel::Enabled: case FeatureLevel::Enabled:
ACPI::DynamicParser::initialize_without_rsdp(); Parser::initialize<DynamicParser>();
break; break;
case FeatureLevel::Limited: case FeatureLevel::Limited:
ACPI::StaticParser::initialize_without_rsdp(); Parser::initialize<StaticParser>();
break; break;
case FeatureLevel::Disabled: case FeatureLevel::Disabled:
ACPI::Parser::initialize_limited(); Parser::initialize<Parser>();
break; break;
} }
} }