From 60a05412c9613026576efd591b711b7f1949fc1e Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 25 Jun 2024 23:24:51 +0300 Subject: [PATCH] Kernel: ACPI implement SizeOf --- kernel/include/kernel/ACPI/AML/SizeOf.h | 54 +++++++++++++++++++++++++ kernel/kernel/ACPI/AML/Node.cpp | 3 ++ 2 files changed, 57 insertions(+) create mode 100644 kernel/include/kernel/ACPI/AML/SizeOf.h diff --git a/kernel/include/kernel/ACPI/AML/SizeOf.h b/kernel/include/kernel/ACPI/AML/SizeOf.h new file mode 100644 index 00000000..1187b980 --- /dev/null +++ b/kernel/include/kernel/ACPI/AML/SizeOf.h @@ -0,0 +1,54 @@ +#pragma once + + +#include +#include +#include +#include +#include + +namespace Kernel::ACPI::AML +{ + + struct SizeOf + { + static ParseResult parse(ParseContext& context) + { + ASSERT(context.aml_data.size() >= 1); + ASSERT(static_cast(context.aml_data[0]) == Byte::SizeOfOp); + context.aml_data = context.aml_data.slice(1); + + auto object_result = AML::parse_object(context); + if (!object_result.success()) + return ParseResult::Failure; + auto object = object_result.node()->evaluate(); + if (object && object->type == AML::Node::Type::Reference) + object = static_cast(object.ptr())->node->evaluate(); + if (!object) + { + AML_ERROR("SizeOf object is null"); + return ParseResult::Failure; + } + + uint64_t size = 0; + switch (object->type) + { + case AML::Node::Type::Buffer: + size = static_cast(object.ptr())->buffer.size(); + break; + case AML::Node::Type::String: + size = static_cast(object.ptr())->string.size(); + break; + case AML::Node::Type::Package: + size = static_cast(object.ptr())->elements.size(); + break; + default: + AML_ERROR("SizeOf object is not a buffer, string or package ({})", static_cast(object->type)); + return ParseResult::Failure; + } + + return ParseResult(MUST(BAN::RefPtr::create(size))); + } + }; + +} diff --git a/kernel/kernel/ACPI/AML/Node.cpp b/kernel/kernel/ACPI/AML/Node.cpp index a0facd1b..04e1758d 100644 --- a/kernel/kernel/ACPI/AML/Node.cpp +++ b/kernel/kernel/ACPI/AML/Node.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -176,6 +177,8 @@ namespace Kernel::ACPI return AML::Index::parse(context); case AML::Byte::NotifyOp: return AML::Notify::parse(context); + case AML::Byte::SizeOfOp: + return AML::SizeOf::parse(context); case AML::Byte::NoopOp: context.aml_data = context.aml_data.slice(1); return ParseResult::Success;