|
@@ -22,6 +22,7 @@
|
|
|
#include "acdispat.h"
|
|
|
#include "amlcode.h"
|
|
|
#include "acconvert.h"
|
|
|
+#include "acnamesp.h"
|
|
|
|
|
|
#define _COMPONENT ACPI_PARSER
|
|
|
ACPI_MODULE_NAME("psloop")
|
|
@@ -527,12 +528,18 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
- if (walk_state->opcode == AML_SCOPE_OP) {
|
|
|
+ if (acpi_ns_opens_scope
|
|
|
+ (acpi_ps_get_opcode_info
|
|
|
+ (walk_state->opcode)->object_type)) {
|
|
|
/*
|
|
|
- * If the scope op fails to parse, skip the body of the
|
|
|
- * scope op because the parse failure indicates that the
|
|
|
- * device may not exist.
|
|
|
+ * If the scope/device op fails to parse, skip the body of
|
|
|
+ * the scope op because the parse failure indicates that
|
|
|
+ * the device may not exist.
|
|
|
*/
|
|
|
+ ACPI_ERROR((AE_INFO,
|
|
|
+ "Skip parsing opcode %s",
|
|
|
+ acpi_ps_get_opcode_name
|
|
|
+ (walk_state->opcode)));
|
|
|
walk_state->parser_state.aml =
|
|
|
walk_state->aml + 1;
|
|
|
walk_state->parser_state.aml =
|
|
@@ -540,8 +547,6 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|
|
(&walk_state->parser_state);
|
|
|
walk_state->aml =
|
|
|
walk_state->parser_state.aml;
|
|
|
- ACPI_ERROR((AE_INFO,
|
|
|
- "Skipping Scope block"));
|
|
|
}
|
|
|
|
|
|
continue;
|
|
@@ -709,20 +714,20 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|
|
} else
|
|
|
if ((walk_state->
|
|
|
parse_flags & ACPI_PARSE_MODULE_LEVEL)
|
|
|
- && status != AE_CTRL_TRANSFER
|
|
|
- && ACPI_FAILURE(status)) {
|
|
|
+ && (ACPI_AML_EXCEPTION(status)
|
|
|
+ || status == AE_ALREADY_EXISTS
|
|
|
+ || status == AE_NOT_FOUND)) {
|
|
|
/*
|
|
|
- * ACPI_PARSE_MODULE_LEVEL flag means that we are currently
|
|
|
- * 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 (setting the status to AE_OK
|
|
|
- * continues 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) or a
|
|
|
- * control method was called from module level and the
|
|
|
- * dispatcher returned AE_CTRL_TRANSFER. In the latter case,
|
|
|
- * leave the status alone, there's nothing wrong with it.
|
|
|
+ * ACPI_PARSE_MODULE_LEVEL flag means that we
|
|
|
+ * are currently 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 (setting
|
|
|
+ * the status to AE_OK continues the table
|
|
|
+ * load). If we get a failure at this point, it
|
|
|
+ * means that the dispatcher got an error while
|
|
|
+ * trying to execute the Op.
|
|
|
*/
|
|
|
status = AE_OK;
|
|
|
}
|