Kernel: Implement poweroff with my AML interpreter
This can succesfully poweroff qemu!
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user