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:
parent
85c0557839
commit
e983c745f7
7 changed files with 30 additions and 59 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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*)
|
||||||
|
|
|
@ -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&);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue