Kernel: Rewrite whole AML parser

Now AML parsing is actually done while respecting namespaces and
scopes. I implemented the minimal functionality to parse qemu's AML.

Next step is to implement AML interpreting and then we can drop lai
as a dependency.
This commit is contained in:
2024-04-09 01:16:07 +03:00
parent 090a294017
commit b16e65168f
38 changed files with 1891 additions and 2412 deletions

View File

@@ -0,0 +1,69 @@
#pragma once
#include <BAN/ByteSpan.h>
#include <BAN/Optional.h>
#include <BAN/RefPtr.h>
#include <BAN/Vector.h>
namespace Kernel::ACPI::AML
{
struct Node : public BAN::RefCounted<Node>
{
enum class Type
{
Buffer,
Device,
FieldElement,
IndexFieldElement,
Integer,
Method,
Mutex,
Name,
OpRegion,
Package,
Processor,
Scope,
String,
};
const Type type;
Node(Type type) : type(type) {}
virtual ~Node() = default;
virtual bool is_scope() const { return false; }
virtual BAN::Optional<uint64_t> as_integer() const { return {}; }
virtual void debug_print(int indent) const = 0;
};
struct ParseContext;
struct ParseResult
{
static ParseResult Failure;
static ParseResult Success;
enum class Result
{
Success,
Failure,
};
ParseResult(Result success) : m_result(success) {}
ParseResult(BAN::RefPtr<Node> node) : m_result(Result::Success), m_node(BAN::move(node)) { ASSERT(m_node); }
bool success() const { return m_result == Result::Success; }
BAN::RefPtr<Node> node()
{
ASSERT(m_node);
return m_node;
}
private:
Result m_result = Result::Failure;
BAN::RefPtr<Node> m_node;
};
ParseResult parse_object(ParseContext& context);
}