Kernel: Implement AML NotOp

This commit is contained in:
Bananymous 2024-11-22 22:22:44 +02:00
parent 30ceaa6bef
commit d2e1d8ec13
1 changed files with 42 additions and 2 deletions

View File

@ -44,8 +44,48 @@ namespace Kernel::ACPI::AML
return ParseResult(source_node); return ParseResult(source_node);
} }
case AML::Byte::NotOp: case AML::Byte::NotOp:
AML_TODO("NotOp", context.aml_data[0]); {
auto source_result = AML::parse_object(context);
if (!source_result.success())
return ParseResult::Failure; return ParseResult::Failure;
auto source_conv = source_result.node() ? source_result.node()->convert(AML::Node::ConvInteger) : BAN::RefPtr<AML::Node>();
if (!source_conv)
{
AML_ERROR("NotOp source not an integer, type {}",
static_cast<uint8_t>(source_result.node()->type)
);
if (source_result.node())
source_result.node()->debug_print(1);
AML_DEBUG_PRINTLN("");
return ParseResult::Failure;
}
const auto source_value = static_cast<AML::Integer*>(source_conv.ptr())->value;
BAN::RefPtr<AML::Node> target_node;
if (context.aml_data[0] == 0x00)
context.aml_data = context.aml_data.slice(1);
else
{
auto target_result = AML::parse_object(context);
if (!target_result.success())
return ParseResult::Failure;
target_node = target_result.node();
if (!target_node)
{
AML_ERROR("NotOp target invalid");
return ParseResult::Failure;
}
}
auto result_node = MUST(BAN::RefPtr<AML::Integer>::create(~source_value));
if (target_node && !target_node->store(result_node))
{
AML_ERROR("NotOp failed to store result");
return ParseResult::Failure;
}
return ParseResult(result_node);
}
case AML::Byte::LNotOp: case AML::Byte::LNotOp:
{ {
context.aml_data = context.aml_data.slice(1); context.aml_data = context.aml_data.slice(1);