Kernel: Implement poweroff with my AML interpreter

This can succesfully poweroff qemu!
This commit is contained in:
2024-04-10 04:32:35 +03:00
parent 5be38d0702
commit 7a2be05c69
4 changed files with 101 additions and 0 deletions

View File

@@ -22,6 +22,10 @@ namespace Kernel::ACPI
// 2: SAPIC
BAN::ErrorOr<void> enter_acpi_mode(uint8_t mode);
// This function will power off the system
// This function will return only if there was an error
void poweroff();
private:
ACPI() = default;
BAN::ErrorOr<void> initialize_impl();

View File

@@ -22,6 +22,13 @@ namespace Kernel::ACPI::AML
: NamedObject(Node::Type::Name, name), object(BAN::move(object))
{}
BAN::RefPtr<AML::Node> evaluate() override
{
if (!object)
return {};
return object->evaluate();
}
static ParseResult parse(ParseContext& context);
virtual void debug_print(int indent) const override;
};

View File

@@ -14,6 +14,25 @@ namespace Kernel::ACPI::AML
Package() : Node(Node::Type::Package) {}
BAN::RefPtr<AML::Node> evaluate() override
{
BAN::Vector<BAN::RefPtr<AML::Node>> evaluated_elements;
for (auto& element : elements)
{
auto evaluated = element->evaluate();
if (!evaluated)
{
AML_ERROR("Failed to evaluate element in package");
return {};
}
evaluated_elements.push_back(evaluated);
}
auto package = MUST(BAN::RefPtr<Package>::create());
package->elements = BAN::move(evaluated_elements);
return package;
}
static ParseResult parse(AML::ParseContext& context)
{
ASSERT(context.aml_data.size() >= 1);