From 49b7467840c7e2139d5df4c95feb9d78ba3987db Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 17 Apr 2024 01:20:58 +0300 Subject: [PATCH] Kernel: Simplify AML method invocation API --- kernel/include/kernel/ACPI/AML/Method.h | 37 +++++++++++++++++++++---- kernel/kernel/ACPI/ACPI.cpp | 11 ++------ kernel/kernel/ACPI/AML/Node.cpp | 13 +++++++-- kernel/kernel/ACPI/AML/Scope.cpp | 12 ++------ 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/kernel/include/kernel/ACPI/AML/Method.h b/kernel/include/kernel/ACPI/AML/Method.h index 11967fa2..b043ee8a 100644 --- a/kernel/include/kernel/ACPI/AML/Method.h +++ b/kernel/include/kernel/ACPI/AML/Method.h @@ -11,9 +11,7 @@ namespace Kernel::ACPI::AML struct Method : public AML::Scope { - using Arguments = BAN::Array, 7>; - - Mutex mutex; + Kernel::Mutex mutex; uint8_t arg_count; bool serialized; uint8_t sync_level; @@ -64,7 +62,30 @@ namespace Kernel::ACPI::AML return ParseResult::Success; } - BAN::Optional> evaluate(Arguments args, BAN::Vector& current_sync_stack) + BAN::Optional> invoke( + BAN::RefPtr arg0 = {}, + BAN::RefPtr arg1 = {}, + BAN::RefPtr arg2 = {}, + BAN::RefPtr arg3 = {}, + BAN::RefPtr arg4 = {}, + BAN::RefPtr arg5 = {}, + BAN::RefPtr arg6 = {} + ) + { + BAN::Vector sync_stack; + return invoke_with_sync_stack(sync_stack, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } + + BAN::Optional> invoke_with_sync_stack( + BAN::Vector& current_sync_stack, + BAN::RefPtr arg0 = {}, + BAN::RefPtr arg1 = {}, + BAN::RefPtr arg2 = {}, + BAN::RefPtr arg3 = {}, + BAN::RefPtr arg4 = {}, + BAN::RefPtr arg5 = {}, + BAN::RefPtr arg6 = {} + ) { if (serialized && !current_sync_stack.empty() && sync_level < current_sync_stack.back()) { @@ -75,7 +96,13 @@ namespace Kernel::ACPI::AML ParseContext context; context.aml_data = term_list; context.scope = scope; - context.method_args = args; + context.method_args[0] = MUST(BAN::RefPtr::create(arg0)); + context.method_args[1] = MUST(BAN::RefPtr::create(arg1)); + context.method_args[2] = MUST(BAN::RefPtr::create(arg2)); + context.method_args[3] = MUST(BAN::RefPtr::create(arg3)); + context.method_args[4] = MUST(BAN::RefPtr::create(arg4)); + context.method_args[5] = MUST(BAN::RefPtr::create(arg5)); + context.method_args[6] = MUST(BAN::RefPtr::create(arg6)); context.sync_stack = BAN::move(current_sync_stack); for (auto& local : context.method_locals) local = MUST(BAN::RefPtr::create()); diff --git a/kernel/kernel/ACPI/ACPI.cpp b/kernel/kernel/ACPI/ACPI.cpp index 1326c1cd..571915b4 100644 --- a/kernel/kernel/ACPI/ACPI.cpp +++ b/kernel/kernel/ACPI/ACPI.cpp @@ -396,10 +396,7 @@ acpi_release_global_lock: return; } - AML::Method::Arguments args; - args[0] = MUST(BAN::RefPtr::create(MUST(BAN::RefPtr::create(5)))); - BAN::Vector sync_stack; - if (!method->evaluate(args, sync_stack).has_value()) + if (!method->invoke(MUST(BAN::RefPtr::create(5))).has_value()) { dwarnln("Failed to evaluate \\_PTS"); return; @@ -482,11 +479,7 @@ acpi_release_global_lock: dwarnln("Method \\_PIC has {} arguments, expected 1", method->arg_count); return BAN::Error::from_errno(EINVAL); } - - AML::Method::Arguments args; - args[0] = MUST(BAN::RefPtr::create(MUST(BAN::RefPtr::create(mode)))); - BAN::Vector sync_stack; - method->evaluate(args, sync_stack); + method->invoke(MUST(BAN::RefPtr::create(mode))); } dprintln("Devices are initialized"); diff --git a/kernel/kernel/ACPI/AML/Node.cpp b/kernel/kernel/ACPI/AML/Node.cpp index 300de514..227399e7 100644 --- a/kernel/kernel/ACPI/AML/Node.cpp +++ b/kernel/kernel/ACPI/AML/Node.cpp @@ -201,7 +201,7 @@ namespace Kernel::ACPI { auto* method = static_cast(aml_object.ptr()); - Method::Arguments args; + BAN::Array, 7> args; for (uint8_t i = 0; i < method->arg_count; i++) { auto arg = AML::parse_object(context); @@ -213,7 +213,16 @@ namespace Kernel::ACPI args[i] = MUST(BAN::RefPtr::create(arg.node())); } - auto result = method->evaluate(args, context.sync_stack); + auto result = method->invoke_with_sync_stack( + context.sync_stack, + args[0], + args[1], + args[2], + args[3], + args[4], + args[5], + args[6] + ); if (!result.has_value()) { AML_ERROR("Failed to evaluate {}", name_string.value()); diff --git a/kernel/kernel/ACPI/AML/Scope.cpp b/kernel/kernel/ACPI/AML/Scope.cpp index a53d4789..588b0882 100644 --- a/kernel/kernel/ACPI/AML/Scope.cpp +++ b/kernel/kernel/ACPI/AML/Scope.cpp @@ -78,8 +78,7 @@ namespace Kernel::ACPI return {}; } - BAN::Vector sync_stack; - auto result = method->evaluate({}, sync_stack); + auto result = method->invoke(); if (!result.has_value()) { AML_ERROR("Failed to evaluate method"); @@ -125,11 +124,7 @@ namespace Kernel::ACPI BAN::RefPtr embedded_controller = MUST(BAN::RefPtr::create(static_cast(AML::OpRegion::RegionSpace::EmbeddedController))); - Method::Arguments arguments; - arguments[0] = MUST(BAN::RefPtr::create(embedded_controller)); - arguments[1] = MUST(BAN::RefPtr::create(AML::Integer::Constants::One)); - BAN::Vector sync_stack; - if (!method->evaluate(arguments, sync_stack).has_value()) + if (!method->invoke(embedded_controller, AML::Integer::Constants::One).has_value()) { AML_ERROR("Failed to evaluate {}._REG(EmbeddedController, 1), ignoring device", scope->scope); return false; @@ -171,8 +166,7 @@ namespace Kernel::ACPI return false; } - BAN::Vector sync_stack; - auto result = method->evaluate({}, sync_stack); + auto result = method->invoke(); if (!result.has_value()) { AML_ERROR("Failed to evaluate {}._INI, ignoring device", scope->scope);