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
Notes: sideshowbarker 2024-07-19 07:46:58 +09:00
7 changed files with 30 additions and 59 deletions

View File

@ -29,26 +29,13 @@
namespace Kernel {
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()
: IRQHandler(9)
, StaticParser()
{
klog() << "ACPI: Dynamic Parsing Enabled, Can parse AML";
}
DynamicParser::DynamicParser(PhysicalAddress rsdp)
: IRQHandler(9)
, StaticParser(rsdp)

View File

@ -35,12 +35,13 @@
namespace Kernel {
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(File& dsdt_file) override;
virtual void enable_aml_interpretation(u8* physical_dsdt, u32 dsdt_payload_legnth) override;

View File

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

View File

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

View File

@ -36,24 +36,6 @@
namespace Kernel {
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()
{
locate_main_system_description_table();

View File

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

View File

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