Kernel: Add better conversion for AML Alias, Name and Reference

This commit is contained in:
Bananymous 2024-08-15 20:47:49 +03:00
parent 1cfe3dd4da
commit cf970d5914
3 changed files with 31 additions and 19 deletions

View File

@ -16,13 +16,27 @@ namespace Kernel::ACPI::AML
, target(target) , target(target)
{} {}
BAN::RefPtr<AML::Node> named_target() override { return target; }
bool is_scope() const override { return target->is_scope(); } bool is_scope() const override { return target->is_scope(); }
BAN::RefPtr<AML::Node> convert(uint8_t) override { return {}; } BAN::RefPtr<AML::Node> convert(uint8_t mask) override
{
ASSERT(target);
return target->convert(mask);
}
BAN::RefPtr<Node> copy() override { return target->copy(); } BAN::RefPtr<Node> copy() override
{
ASSERT(target);
return target->copy();
}
BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> node) override { ASSERT(target); return target->store(node); } BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> node) override
{
ASSERT(target);
return target->store(node);
}
static ParseResult parse(ParseContext& context) static ParseResult parse(ParseContext& context)
{ {
@ -45,7 +59,7 @@ namespace Kernel::ACPI::AML
return ParseResult::Success; return ParseResult::Success;
} }
auto alias = MUST(BAN::RefPtr<Alias>::create(alias_string.value().path.back(), source_object)); auto alias = MUST(BAN::RefPtr<Alias>::create(alias_string.value().path.back(), source_object->named_target()));
if (!Namespace::root_namespace()->add_named_object(context, alias_string.value(), alias)) if (!Namespace::root_namespace()->add_named_object(context, alias_string.value(), alias))
return ParseResult::Success; return ParseResult::Success;

View File

@ -12,6 +12,8 @@ namespace Kernel::ACPI::AML
NameSeg name; NameSeg name;
NamedObject(Node::Type type, NameSeg name) : Node(type), name(name) {} NamedObject(Node::Type type, NameSeg name) : Node(type), name(name) {}
[[nodiscard]] virtual BAN::RefPtr<AML::Node> named_target() { return this; }
}; };
struct Name final : public AML::NamedObject struct Name final : public AML::NamedObject
@ -22,15 +24,19 @@ namespace Kernel::ACPI::AML
: NamedObject(Node::Type::Name, name), object(BAN::move(object)) : NamedObject(Node::Type::Name, name), object(BAN::move(object))
{} {}
BAN::RefPtr<AML::Node> convert(uint8_t) override { return {}; } BAN::RefPtr<AML::Node> named_target() override { return object; }
BAN::RefPtr<AML::Node> convert(uint8_t mask) override
{
ASSERT(object);
return object->convert(mask);
}
BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> node) override BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> node) override
{ {
ASSERT(object); ASSERT(object);
if (object->type == AML::Node::Type::Reference) ASSERT(object->type != AML::Node::Type::Reference);
return object->store(node); return object->store(node);
object = node;
return node;
} }
static ParseResult parse(ParseContext& context); static ParseResult parse(ParseContext& context);

View File

@ -23,21 +23,13 @@ namespace Kernel::ACPI::AML
BAN::RefPtr<AML::Node> convert(uint8_t mask) override BAN::RefPtr<AML::Node> convert(uint8_t mask) override
{ {
if (!node) ASSERT(node);
{
AML_ERROR("Trying to convert null Reference");
return {};
}
return node->convert(mask); return node->convert(mask);
} }
BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> value) override BAN::RefPtr<AML::Node> store(BAN::RefPtr<AML::Node> value) override
{ {
if (!node) ASSERT(node);
{
AML_ERROR("Storing to null Reference");
return {};
}
return node->store(value); return node->store(value);
} }