]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ACPICA: iASL: Enhance error detection
authorBob Moore <robert.moore@intel.com>
Mon, 5 Nov 2018 17:43:54 +0000 (09:43 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 8 Nov 2018 17:41:47 +0000 (18:41 +0100)
Enhance error detection by validating that all name_seg elements
within a name_path actually exist. The previous behavior was spotty
at best, and such errors could be improperly ignored at compile
time (never at runtime, however). There are two new error messages.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/dswload2.c
drivers/acpi/acpica/nsaccess.c
drivers/acpi/acpica/psloop.c
drivers/acpi/acpica/psobject.c

index bbb3b4d1e796cef48aad9362ca7d3022d3acab17..9bd25f36c6080395ce13b685ca9d3164841f5bad 100644 (file)
@@ -34,6 +34,7 @@
 #define ACPI_NS_TEMPORARY           0x0040
 #define ACPI_NS_OVERRIDE_IF_FOUND   0x0080
 #define ACPI_NS_EARLY_INIT          0x0100
+#define ACPI_NS_PREFIX_MUST_EXIST   0x0200
 
 /* Flags for acpi_ns_walk_namespace */
 
index b4685bb5f071eb48ce2597b4b8bca59521877704..fa38bb3009d53b340bc408f6ebb6658c6a874d35 100644 (file)
@@ -296,6 +296,14 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
                }
 #endif
 
+               /*
+                * For name creation opcodes, the full namepath prefix must
+                * exist, except for the final (new) nameseg.
+                */
+               if (walk_state->op_info->flags & AML_NAMED) {
+                       flags |= ACPI_NS_PREFIX_MUST_EXIST;
+               }
+
                /* Add new entry or lookup existing entry */
 
                status =
index e3f10afde5ffae47deb166544cf8f5ded393f726..75192b958544e0b5ef385cd64df27b2d7646d0ed 100644 (file)
@@ -267,6 +267,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
        acpi_object_type this_search_type;
        u32 search_parent_flag = ACPI_NS_SEARCH_PARENT;
        u32 local_flags;
+       acpi_interpreter_mode local_interpreter_mode;
 
        ACPI_FUNCTION_TRACE(ns_lookup);
 
@@ -506,6 +507,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
         */
        this_search_type = ACPI_TYPE_ANY;
        current_node = this_node;
+
        while (num_segments && current_node) {
                num_segments--;
                if (!num_segments) {
@@ -536,6 +538,16 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
                        }
                }
 
+               /* Handle opcodes that create a new name_seg via a full name_path */
+
+               local_interpreter_mode = interpreter_mode;
+               if ((flags & ACPI_NS_PREFIX_MUST_EXIST) && (num_segments > 0)) {
+
+                       /* Every element of the path must exist (except for the final name_seg) */
+
+                       local_interpreter_mode = ACPI_IMODE_EXECUTE;
+               }
+
                /* Extract one ACPI name from the front of the pathname */
 
                ACPI_MOVE_32_TO_32(&simple_name, path);
@@ -544,12 +556,19 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
 
                status =
                    acpi_ns_search_and_enter(simple_name, walk_state,
-                                            current_node, interpreter_mode,
+                                            current_node,
+                                            local_interpreter_mode,
                                             this_search_type, local_flags,
                                             &this_node);
                if (ACPI_FAILURE(status)) {
                        if (status == AE_NOT_FOUND) {
-
+#if !defined ACPI_ASL_COMPILER /* Note: iASL reports this error by itself, not needed here */
+                               if (flags & ACPI_NS_PREFIX_MUST_EXIST) {
+                                       acpi_os_printf(ACPI_MSG_BIOS_ERROR
+                                                      "Object does not exist: %4.4s\n",
+                                                      &simple_name);
+                               }
+#endif
                                /* Name not found in ACPI namespace */
 
                                ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
index 0fa01c9e353e45b444a342ea43cd4c0072c7dc75..60ece8e48667b70116c3a009a52ec3e42d42d0fb 100644 (file)
@@ -508,7 +508,8 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
                                 */
                                if ((walk_state->
                                     parse_flags & ACPI_PARSE_MODULE_LEVEL)
-                                   && status == AE_ALREADY_EXISTS) {
+                                   && ((status == AE_ALREADY_EXISTS)
+                                       || (status == AE_NOT_FOUND))) {
                                        status = AE_OK;
                                }
                                if (status == AE_CTRL_PARSE_CONTINUE) {
@@ -537,10 +538,7 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
                                         * 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)));
+                                       ACPI_INFO(("Skipping parse of AML opcode: %s (0x%4.4X)", acpi_ps_get_opcode_name(walk_state->opcode), walk_state->opcode));
 
                                        /*
                                         * Determine the opcode length before skipping the opcode.
index 3138e7a00da815dc44f882b4be35f97b3250e82b..e1fd819a2955e8152d4cf3d878823a6fde7d40fb 100644 (file)
@@ -600,8 +600,7 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
                         * because there could be correct AML beyond the parts that caused
                         * the runtime error.
                         */
-                       ACPI_ERROR((AE_INFO,
-                                   "Ignore error and continue table load"));
+                       ACPI_INFO(("Ignoring error and continuing table load"));
                        return_ACPI_STATUS(AE_OK);
                }
                return_ACPI_STATUS(status);