From 45b9dc8be942375ef03d7c2e9e055695d742d34f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 17 Apr 2024 02:19:35 +0300 Subject: [PATCH] Kernel: Make ACPI \\_OSI return true for Linux --- kernel/include/kernel/ACPI/AML/Method.h | 31 +++++++++++++++---------- kernel/kernel/ACPI/AML/Namespace.cpp | 17 ++++++++++---- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/kernel/include/kernel/ACPI/AML/Method.h b/kernel/include/kernel/ACPI/AML/Method.h index b043ee8a..258ab9c2 100644 --- a/kernel/include/kernel/ACPI/AML/Method.h +++ b/kernel/include/kernel/ACPI/AML/Method.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -16,6 +17,7 @@ namespace Kernel::ACPI::AML bool serialized; uint8_t sync_level; + BAN::Function(ParseContext&)> override_function; BAN::ConstByteSpan term_list; Method(AML::NameSeg name, uint8_t arg_count, bool serialized, uint8_t sync_level) @@ -117,21 +119,26 @@ namespace Kernel::ACPI::AML AML_DEBUG_PRINTLN("Evaluating {}", scope); #endif - BAN::Optional> return_value = BAN::RefPtr(); - while (context.aml_data.size() > 0) + + if (override_function) + return_value = override_function(context); + else { - auto parse_result = AML::parse_object(context); - if (parse_result.returned()) + while (context.aml_data.size() > 0) { - return_value = parse_result.node(); - break; - } - if (!parse_result.success()) - { - AML_ERROR("Method {} evaluate failed", scope); - return_value = {}; - break; + auto parse_result = AML::parse_object(context); + if (parse_result.returned()) + { + return_value = parse_result.node(); + break; + } + if (!parse_result.success()) + { + AML_ERROR("Method {} evaluate failed", scope); + return_value = {}; + break; + } } } diff --git a/kernel/kernel/ACPI/AML/Namespace.cpp b/kernel/kernel/ACPI/AML/Namespace.cpp index a86ffff2..47dba7d1 100644 --- a/kernel/kernel/ACPI/AML/Namespace.cpp +++ b/kernel/kernel/ACPI/AML/Namespace.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace Kernel::ACPI @@ -211,11 +212,19 @@ namespace Kernel::ACPI ADD_PREDEFIED_NAMESPACE("_TZ"sv); #undef ADD_PREDEFIED_NAMESPACE - // Add dummy \_OSI - MUST(s_osi_aml_data.push_back(static_cast(Byte::ReturnOp))); - MUST(s_osi_aml_data.push_back(static_cast(Byte::ZeroOp))); + // Add \_OSI that returns true for Linux compatibility auto osi = MUST(BAN::RefPtr::create(NameSeg("_OSI"sv), 1, false, 0)); - osi->term_list = s_osi_aml_data.span(); + osi->override_function = [](AML::ParseContext& context) -> BAN::RefPtr { + ASSERT(context.method_args[0]); + auto arg = context.method_args[0]->evaluate(); + if (!arg || arg->type != AML::Node::Type::String) + { + AML_ERROR("Invalid _OSI argument"); + return {}; + } + auto string = static_cast(arg.ptr()); + return string->string == "Linux" ? AML::Integer::Constants::Ones : AML::Integer::Constants::Zero; + }; ASSERT(s_root_namespace->add_named_object(context, AML::NameString("\\_OSI"), osi)); return s_root_namespace;