diff --git a/kernel/include/kernel/ACPI/AML/Sleep.h b/kernel/include/kernel/ACPI/AML/Sleep.h new file mode 100644 index 00000000..599a99d1 --- /dev/null +++ b/kernel/include/kernel/ACPI/AML/Sleep.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace Kernel::ACPI::AML +{ + + struct Sleep + { + static ParseResult parse(ParseContext& context) + { + ASSERT(context.aml_data.size() >= 2); + ASSERT(static_cast(context.aml_data[0]) == AML::Byte::ExtOpPrefix); + ASSERT(static_cast(context.aml_data[1]) == AML::ExtOp::SleepOp); + context.aml_data = context.aml_data.slice(2); + + auto sleep_time_result = AML::parse_object(context); + if (!sleep_time_result.success()) + return ParseResult::Failure; + auto sleep_time = sleep_time_result.node() ? sleep_time_result.node()->as_integer() : BAN::Optional(); + if (!sleep_time.has_value()) + { + AML_ERROR("Sleep time cannot be evaluated to an integer"); + return ParseResult::Failure; + } + +#if AML_DEBUG_LEVEL >= 2 + AML_DEBUG_PRINTLN("Sleeping for {} ms", sleep_time.value()); +#endif + + SystemTimer::get().sleep(sleep_time.value()); + return ParseResult::Success; + } + }; + +} diff --git a/kernel/kernel/ACPI/AML/Node.cpp b/kernel/kernel/ACPI/AML/Node.cpp index 632283dd..ccf5474f 100644 --- a/kernel/kernel/ACPI/AML/Node.cpp +++ b/kernel/kernel/ACPI/AML/Node.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,8 @@ namespace Kernel::ACPI return AML::ThermalZone::parse(context); case AML::ExtOp::CondRefOfOp: return AML::Reference::parse(context); + case AML::ExtOp::SleepOp: + return AML::Sleep::parse(context); default: break; }