|
@@ -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);
|
|
|
}
|