Kernel: Fix ACPI namespace lookup for multi segment names
This commit is contained in:
parent
ca9361abc1
commit
32f980e259
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue