OSDN Git Service

ACPICA: Disassembler: skip parsing of incorrect external declarations
authorErik Schmauss <erik.schmauss@intel.com>
Mon, 10 Jul 2017 07:24:09 +0000 (15:24 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 20 Jul 2017 14:38:26 +0000 (16:38 +0200)
ACPICA commit ed25461901d34120067b07ec280af30abc0458f1

Link: https://github.com/acpica/acpica/commit/ed254619
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/psobject.c

index ef6384e..0bef6df 100644 (file)
@@ -359,6 +359,32 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
                    acpi_ps_build_named_op(walk_state, aml_op_start, op,
                                           &named_op);
                acpi_ps_free_op(op);
+
+#ifdef ACPI_ASL_COMPILER
+               if (acpi_gbl_disasm_flag
+                   && walk_state->opcode == AML_EXTERNAL_OP
+                   && status == AE_NOT_FOUND) {
+                       /*
+                        * If parsing of AML_EXTERNAL_OP's name path fails, then skip
+                        * past this opcode and keep parsing. This is a much better
+                        * alternative than to abort the entire disassembler. At this
+                        * point, the parser_state is at the end of the namepath of the
+                        * external declaration opcode. Setting walk_state->Aml to
+                        * walk_state->parser_state.Aml + 2 moves increments the
+                        * walk_state->Aml past the object type and the paramcount of the
+                        * external opcode. For the error message, only print the AML
+                        * offset. We could attempt to print the name but this may cause
+                        * a segmentation fault when printing the namepath because the
+                        * AML may be incorrect.
+                        */
+                       acpi_os_printf
+                           ("// Invalid external declaration at AML offset 0x%x.\n",
+                            walk_state->aml -
+                            walk_state->parser_state.aml_start);
+                       walk_state->aml = walk_state->parser_state.aml + 2;
+                       return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
+               }
+#endif
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }