Kernel: Fix ACPI namespace lookup for multi segment names

This commit is contained in:
Bananymous 2025-08-17 23:53:45 +03:00
parent ca9361abc1
commit 32f980e259
1 changed files with 16 additions and 19 deletions

View File

@ -438,7 +438,7 @@ namespace Kernel::ACPI::AML
{ {
dprintln_if(AML_DUMP_FUNCTION_CALLS, "find_named_object('{}', '{}')", scope, name_string); dprintln_if(AML_DUMP_FUNCTION_CALLS, "find_named_object('{}', '{}')", scope, name_string);
if (force_absolute || name_string.base != 0) if (force_absolute || name_string.base != 0 || name_string.parts.size() > 1)
{ {
// Absolute path // Absolute path
@ -460,23 +460,15 @@ namespace Kernel::ACPI::AML
// Relative path // Relative path
Scope path_guess; Scope path_guess;
TRY(path_guess.parts.reserve(scope.parts.size() + name_string.parts.size())); TRY(path_guess.parts.reserve(scope.parts.size() + 1));
const uint32_t name_seg = name_string.parts.front();
for (const auto& part : scope.parts) for (const auto& part : scope.parts)
TRY(path_guess.parts.push_back(part)); TRY(path_guess.parts.push_back(part));
for (const auto& part : name_string.parts) TRY(path_guess.parts.push_back(name_seg));
TRY(path_guess.parts.push_back(part));
auto it = m_named_objects.find(path_guess); for (;;)
if (it != m_named_objects.end()) {
return FindResult {
.path = BAN::move(path_guess),
.node = it->value,
};
}
for (size_t i = 0; i < scope.parts.size(); i++)
{ {
path_guess.parts.remove(scope.parts.size() - i - 1);
auto it = m_named_objects.find(path_guess); auto it = m_named_objects.find(path_guess);
if (it != m_named_objects.end()) { if (it != m_named_objects.end()) {
return FindResult { return FindResult {
@ -484,14 +476,19 @@ namespace Kernel::ACPI::AML
.node = it->value, .node = it->value,
}; };
} }
}
if (path_guess.parts.size() == 1) {
return FindResult { return FindResult {
.path = {}, .path = {},
.node = nullptr, .node = nullptr,
}; };
} }
path_guess.parts.pop_back();
path_guess.parts.back() = name_seg;
}
}
BAN::ErrorOr<Scope> Namespace::find_reference_scope(const Reference* reference) BAN::ErrorOr<Scope> Namespace::find_reference_scope(const Reference* reference)
{ {
for (const auto& [obj_path, obj_ref] : m_named_objects) for (const auto& [obj_path, obj_ref] : m_named_objects)