|
@@ -122,6 +122,9 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
|
|
(u32)(aml_offset +
|
|
|
sizeof(struct acpi_table_header)));
|
|
|
|
|
|
+ ACPI_ERROR((AE_INFO,
|
|
|
+ "Aborting disassembly, AML byte code is corrupt"));
|
|
|
+
|
|
|
/* Dump the context surrounding the invalid opcode */
|
|
|
|
|
|
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
|
|
@@ -130,6 +133,14 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
|
|
sizeof(struct acpi_table_header) -
|
|
|
16));
|
|
|
acpi_os_printf(" */\n");
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Just abort the disassembly, cannot continue because the
|
|
|
+ * parser is essentially lost. The disassembler can then
|
|
|
+ * randomly fail because an ill-constructed parse tree
|
|
|
+ * can result.
|
|
|
+ */
|
|
|
+ return_ACPI_STATUS(AE_AML_BAD_OPCODE);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -331,6 +342,9 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
|
|
if (status == AE_CTRL_PARSE_CONTINUE) {
|
|
|
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
|
|
}
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
|
|
|
/* Create Op structure and append to parent's argument list */
|
|
|
|