Kernel: Rewrite the AML conversion API

This doesn't currently make the interpreter any better, but it will make
further implementation easier to be spec (or hardware...) compliant
This commit is contained in:
2024-08-15 02:13:41 +03:00
parent 44d5c8c4b4
commit 3f5ee6f414
37 changed files with 564 additions and 416 deletions

View File

@@ -5,7 +5,7 @@
namespace Kernel::ACPI::AML
{
struct Register : public AML::Node
struct Register final : public AML::Node
{
BAN::RefPtr<AML::Node> value;
@@ -17,30 +17,22 @@ namespace Kernel::ACPI::AML
, value(value)
{}
BAN::RefPtr<AML::Buffer> as_buffer() override;
BAN::RefPtr<AML::Integer> as_integer() override;
BAN::RefPtr<AML::String> as_string() override;
BAN::RefPtr<AML::Node> evaluate() override
BAN::RefPtr<AML::Node> convert(uint8_t mask) override
{
if (value)
return value->evaluate();
return {};
if (!value)
{
AML_ERROR("Trying to convert null Register");
return {};
}
return value->convert(mask);
}
bool store(BAN::RefPtr<AML::Node> source) override
BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> source) override
{
if (value && value->type == AML::Node::Type::Reference)
return value->store(source);
auto evaluated = source->evaluate();
if (!evaluated)
{
AML_ERROR("Failed to evaluate source for store");
return false;
}
value = evaluated->copy();
return true;
value = source->copy();
return value;
}
void debug_print(int indent) const override