On Friday, July 20, 2018 1:33:00 AM CEST Erik Schmauss wrote: > The dispatcher and the executer process the parse nodes During table > load. Error status from the evaluation confuses the AML parser. This > results in the parser failing to complete parsing of the current > scope op which becomes problematic. For the incorrect AML below, _ADR > never gets created. > > definition_block(...) > { > Scope (\_SB) > { > Device (PCI0){...} > Name (OBJ1, 0x0) > OBJ1 = PCI0 + 5 // Results in an operand error. > } // \_SB not closed > > // parser looks for \_SB._SB.PCI0, results in AE_NOT_FOUND error > // Entire scope block gets skipped. > Scope (\_SB.PCI0) > { > Name (_ADR, 0x0) > } > } > > This patch fixes the above error by properly completing the initial > \_SB scope after an error by clearing errors that occur during table > load. In the above case, this means that OBJ1 = PIC0 + 5 is skipped. > > Fixes: 5088814a6e93 (ACPICA: AML parser: attempt to continue loading > table after error) > Link: https://bugzilla.kernel.org/show_bug.cgi?id=200363 > Tested-by: Bastien Nocera <hadess@xxxxxxxxxx> > Signed-off-by: Erik Schmauss <erik.schmauss@xxxxxxxxx> > --- > drivers/acpi/acpica/psloop.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c > index bc5f05906bd1..ee840be150b5 100644 > --- a/drivers/acpi/acpica/psloop.c > +++ b/drivers/acpi/acpica/psloop.c > @@ -497,6 +497,18 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state) > status = > acpi_ps_create_op(walk_state, aml_op_start, &op); > if (ACPI_FAILURE(status)) { > + /* > + * ACPI_PARSE_MODULE_LEVEL means that we are loading a table by > + * executing it as a control method. However, if we encounter > + * an error while loading the table, we need to keep trying to > + * load the table rather than aborting the table load. Set the > + * status to AE_OK to proceed with the table load. > + */ > + if ((walk_state-> > + parse_flags & ACPI_PARSE_MODULE_LEVEL) > + && status == AE_ALREADY_EXISTS) { > + status = AE_OK; > + } > if (status == AE_CTRL_PARSE_CONTINUE) { > continue; > } > @@ -694,6 +706,20 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state) > acpi_ps_next_parse_state(walk_state, op, status); > if (status == AE_CTRL_PENDING) { > status = AE_OK; > + } else > + if ((walk_state-> > + parse_flags & ACPI_PARSE_MODULE_LEVEL) > + && ACPI_FAILURE(status)) { > + /* > + * ACPI_PARSE_MODULE_LEVEL means that we are loading a table by > + * executing it as a control method. However, if we encounter > + * an error while loading the table, we need to keep trying to > + * load the table rather than aborting the table load. Set the > + * status to AE_OK to proceed with the table load. If we get a > + * failure at this point, it means that the dispatcher got an > + * error while processing Op (most likely an AML operand error. > + */ > + status = AE_OK; > } > } > > Applied, thanks! -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html