Kernel: Implement more AML method invocation stuff
Method invocation is starting to come together. This implemenetation can interpret some of the qemu's functions to enter ACPI mode. PCI config space access is currently the one thing is between entering ACPI mode.
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include <BAN/Optional.h>
|
||||
#include <BAN/RefPtr.h>
|
||||
#include <BAN/Vector.h>
|
||||
#include <kernel/ACPI/AML/Utils.h>
|
||||
|
||||
namespace Kernel::ACPI::AML
|
||||
{
|
||||
@@ -24,6 +25,7 @@ namespace Kernel::ACPI::AML
|
||||
OpRegion,
|
||||
Package,
|
||||
Processor,
|
||||
Register,
|
||||
String,
|
||||
};
|
||||
const Type type;
|
||||
@@ -32,7 +34,10 @@ namespace Kernel::ACPI::AML
|
||||
virtual ~Node() = default;
|
||||
|
||||
virtual bool is_scope() const { return false; }
|
||||
virtual BAN::Optional<uint64_t> as_integer() const { return {}; }
|
||||
|
||||
BAN::Optional<uint64_t> as_integer();
|
||||
virtual BAN::RefPtr<AML::Node> evaluate() { AML_TODO("evaluate, type {}", static_cast<uint8_t>(type)); return nullptr; }
|
||||
virtual bool store(BAN::RefPtr<AML::Node> source) { AML_TODO("store, type {}", static_cast<uint8_t>(type)); return false; }
|
||||
|
||||
virtual void debug_print(int indent) const = 0;
|
||||
};
|
||||
@@ -47,12 +52,25 @@ namespace Kernel::ACPI::AML
|
||||
{
|
||||
Success,
|
||||
Failure,
|
||||
Returned,
|
||||
};
|
||||
|
||||
ParseResult(Result success) : m_result(success) {}
|
||||
ParseResult(BAN::RefPtr<Node> node) : m_result(Result::Success), m_node(BAN::move(node)) { ASSERT(m_node); }
|
||||
ParseResult(Result success)
|
||||
: m_result(success)
|
||||
{}
|
||||
ParseResult(Result success, BAN::RefPtr<Node> node)
|
||||
: m_result(success)
|
||||
, m_node(BAN::move(node))
|
||||
{}
|
||||
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; }
|
||||
bool returned() const { return m_result == Result::Returned; }
|
||||
|
||||
BAN::RefPtr<Node> node()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user