Skip to content

Commit 9bd5918

Browse files
committed
Merge tag 'acpi-4.18-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI fix from Rafael Wysocki: "Fix a recent ACPICA regression causing the AML parser to get confused and fail in some situations involving incorrect AML in an ACPI table (Erik Schmauss)" * tag 'acpi-4.18-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPICA: AML Parser: ignore dispatcher error status during table load
2 parents 99015e9 + 73c2a01 commit 9bd5918

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

drivers/acpi/acpica/psloop.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,18 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
497497
status =
498498
acpi_ps_create_op(walk_state, aml_op_start, &op);
499499
if (ACPI_FAILURE(status)) {
500+
/*
501+
* ACPI_PARSE_MODULE_LEVEL means that we are loading a table by
502+
* executing it as a control method. However, if we encounter
503+
* an error while loading the table, we need to keep trying to
504+
* load the table rather than aborting the table load. Set the
505+
* status to AE_OK to proceed with the table load.
506+
*/
507+
if ((walk_state->
508+
parse_flags & ACPI_PARSE_MODULE_LEVEL)
509+
&& status == AE_ALREADY_EXISTS) {
510+
status = AE_OK;
511+
}
500512
if (status == AE_CTRL_PARSE_CONTINUE) {
501513
continue;
502514
}
@@ -694,6 +706,20 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
694706
acpi_ps_next_parse_state(walk_state, op, status);
695707
if (status == AE_CTRL_PENDING) {
696708
status = AE_OK;
709+
} else
710+
if ((walk_state->
711+
parse_flags & ACPI_PARSE_MODULE_LEVEL)
712+
&& ACPI_FAILURE(status)) {
713+
/*
714+
* ACPI_PARSE_MODULE_LEVEL means that we are loading a table by
715+
* executing it as a control method. However, if we encounter
716+
* an error while loading the table, we need to keep trying to
717+
* load the table rather than aborting the table load. Set the
718+
* status to AE_OK to proceed with the table load. If we get a
719+
* failure at this point, it means that the dispatcher got an
720+
* error while processing Op (most likely an AML operand error.
721+
*/
722+
status = AE_OK;
697723
}
698724
}
699725

0 commit comments

Comments
 (0)