diff --git a/kernel/include/kernel/ACPI/AML/Notify.h b/kernel/include/kernel/ACPI/AML/Notify.h new file mode 100644 index 00000000..044de607 --- /dev/null +++ b/kernel/include/kernel/ACPI/AML/Notify.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include +#include +#include + +namespace Kernel::ACPI::AML +{ + + struct Notify + { + static ParseResult parse(ParseContext& context) + { + ASSERT(context.aml_data.size() >= 1); + ASSERT(static_cast(context.aml_data[0]) == Byte::NotifyOp); + 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(); + if (!object) + { + AML_ERROR("Notify object is null"); + return ParseResult::Failure; + } + + auto value_result = AML::parse_object(context); + if (!value_result.success()) + return ParseResult::Failure; + auto value = value_result.node() ? value_result.node()->as_integer() : BAN::Optional(); + if (!value.has_value()) + { + AML_ERROR("Notify value is not an integer"); + return ParseResult::Failure; + } + + BAN::StringView object_type_sv; + BAN::StringView object_name_sv; + switch (object->type) + { + case AML::Node::Type::Device: + object_type_sv = "Device"sv; + object_name_sv = static_cast(object.ptr())->name.sv(); + break; + case AML::Node::Type::Processor: + object_type_sv = "Processor"sv; + object_name_sv = static_cast(object.ptr())->name.sv(); + break; + case AML::Node::Type::ThermalZone: + object_type_sv = "ThermalZone"sv; + object_name_sv = static_cast(object.ptr())->name.sv(); + break; + default: + object_type_sv = "Unknown"sv; + object_name_sv = "????"sv; + break; + } + + AML_TODO("Notify: {} {}: {2H}", object_type_sv, object_name_sv, value.value()); + return ParseResult::Success; + } + }; + +} diff --git a/kernel/kernel/ACPI/AML/Node.cpp b/kernel/kernel/ACPI/AML/Node.cpp index 640cb00a..a0facd1b 100644 --- a/kernel/kernel/ACPI/AML/Node.cpp +++ b/kernel/kernel/ACPI/AML/Node.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -173,6 +174,11 @@ namespace Kernel::ACPI return AML::Reference::parse(context); case AML::Byte::IndexOp: return AML::Index::parse(context); + case AML::Byte::NotifyOp: + return AML::Notify::parse(context); + case AML::Byte::NoopOp: + context.aml_data = context.aml_data.slice(1); + return ParseResult::Success; case AML::Byte::ReturnOp: { context.aml_data = context.aml_data.slice(1);