ACPICA: Fixes for acpiExec namespace init file
authorBob Moore <robert.moore@intel.com>
Fri, 27 Mar 2020 22:21:09 +0000 (15:21 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Apr 2020 08:36:39 +0000 (10:36 +0200)
[ Upstream commit 9a1ae80412dcaa67a29eecf19de44f32b5f1c357 ]

This is the result of squashing the following ACPICA commit ID's:
6803997e5b4f3635cea6610b51ff69e29d251de3
f31cdf8bfda22fe265c1a176d0e33d311c82a7f7

This change fixes several problems with the support for the
acpi_exec namespace init file (-fi option). Specifically, it
fixes AE_ALREADY_EXISTS errors, as well as various seg faults.

Link: https://github.com/acpica/acpica/commit/f31cdf8b
Link: https://github.com/acpica/acpica/commit/6803997e
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Erik Kaneda <erik.kaneda@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/dbinput.c
drivers/acpi/acpica/dswexec.c
drivers/acpi/acpica/dswload.c
drivers/acpi/acpica/dswload2.c
drivers/acpi/acpica/nsnames.c
drivers/acpi/acpica/utdelete.c

index 7da1864798a0e7fa679c611a68eb7ae75cb6a80b..ecaa28733dc610da69f13b07a0f50267ef2f5fa5 100644 (file)
@@ -256,6 +256,8 @@ u32
 acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
                              char *full_path, u32 path_size, u8 no_trailing);
 
+void acpi_ns_normalize_pathname(char *original_path);
+
 char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
                                      u8 no_trailing);
 
index 55a7e10998d87ed44f5716ab0fdc2d1b6538afe0..1ef053585bbb8c386f70e76c90351605ac02448d 100644 (file)
@@ -464,16 +464,14 @@ char *acpi_db_get_next_token(char *string,
                return (NULL);
        }
 
-       /* Remove any spaces at the beginning */
+       /* Remove any spaces at the beginning, ignore blank lines */
 
-       if (*string == ' ') {
-               while (*string && (*string == ' ')) {
-                       string++;
-               }
+       while (*string && isspace(*string)) {
+               string++;
+       }
 
-               if (!(*string)) {
-                       return (NULL);
-               }
+       if (!(*string)) {
+               return (NULL);
        }
 
        switch (*string) {
@@ -551,7 +549,7 @@ char *acpi_db_get_next_token(char *string,
 
                /* Find end of token */
 
-               while (*string && (*string != ' ')) {
+               while (*string && !isspace(*string)) {
                        string++;
                }
                break;
index d75aae3045958dfa0f96048fe38f36a08fe3fab9..a68237b97c4c8596877eb4c27d5fab10bb39a3c6 100644 (file)
@@ -16,6 +16,9 @@
 #include "acinterp.h"
 #include "acnamesp.h"
 #include "acdebug.h"
+#ifdef ACPI_EXEC_APP
+#include "aecommon.h"
+#endif
 
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dswexec")
@@ -329,6 +332,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
        u32 op_class;
        union acpi_parse_object *next_op;
        union acpi_parse_object *first_arg;
+#ifdef ACPI_EXEC_APP
+       char *namepath;
+       union acpi_operand_object *obj_desc;
+#endif
 
        ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state);
 
@@ -537,6 +544,32 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
                        status =
                            acpi_ds_eval_buffer_field_operands(walk_state, op);
+                       if (ACPI_FAILURE(status)) {
+                               break;
+                       }
+#ifdef ACPI_EXEC_APP
+                       /*
+                        * acpi_exec support for namespace initialization file (initialize
+                        * buffer_fields in this code.)
+                        */
+                       namepath =
+                           acpi_ns_get_external_pathname(op->common.node);
+                       status = ae_lookup_init_file_entry(namepath, &obj_desc);
+                       if (ACPI_SUCCESS(status)) {
+                               status =
+                                   acpi_ex_write_data_to_field(obj_desc,
+                                                               op->common.
+                                                               node->object,
+                                                               NULL);
+                               if ACPI_FAILURE
+                                       (status) {
+                                       ACPI_EXCEPTION((AE_INFO, status,
+                                                       "While writing to buffer field"));
+                                       }
+                       }
+                       ACPI_FREE(namepath);
+                       status = AE_OK;
+#endif
                        break;
 
                case AML_TYPE_CREATE_OBJECT:
index 4bcf15bf03ded4874b052d269485c394a71978c2..6cf93fae4d07f29b46359b085b173c2f6d0c0cc4 100644 (file)
@@ -14,7 +14,6 @@
 #include "acdispat.h"
 #include "acinterp.h"
 #include "acnamesp.h"
-
 #ifdef ACPI_ASL_COMPILER
 #include "acdisasm.h"
 #endif
@@ -399,7 +398,6 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
        union acpi_parse_object *op;
        acpi_object_type object_type;
        acpi_status status = AE_OK;
-
 #ifdef ACPI_ASL_COMPILER
        u8 param_count;
 #endif
index 935a8e2623e4bfd89b2afb747a9c9346ae699029..15d92bf15f0b6794c3dfd60625831b944b5f2336 100644 (file)
@@ -15,6 +15,9 @@
 #include "acinterp.h"
 #include "acnamesp.h"
 #include "acevents.h"
+#ifdef ACPI_EXEC_APP
+#include "aecommon.h"
+#endif
 
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dswload2")
@@ -373,6 +376,10 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
        struct acpi_namespace_node *new_node;
        u32 i;
        u8 region_space;
+#ifdef ACPI_EXEC_APP
+       union acpi_operand_object *obj_desc;
+       char *namepath;
+#endif
 
        ACPI_FUNCTION_TRACE(ds_load2_end_op);
 
@@ -466,6 +473,11 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                 * be evaluated later during the execution phase
                 */
                status = acpi_ds_create_buffer_field(op, walk_state);
+               if (ACPI_FAILURE(status)) {
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "CreateBufferField failure"));
+                       goto cleanup;
+                       }
                break;
 
        case AML_TYPE_NAMED_FIELD:
@@ -604,6 +616,29 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                case AML_NAME_OP:
 
                        status = acpi_ds_create_node(walk_state, node, op);
+                       if (ACPI_FAILURE(status)) {
+                               goto cleanup;
+                       }
+#ifdef ACPI_EXEC_APP
+                       /*
+                        * acpi_exec support for namespace initialization file (initialize
+                        * Name opcodes in this code.)
+                        */
+                       namepath = acpi_ns_get_external_pathname(node);
+                       status = ae_lookup_init_file_entry(namepath, &obj_desc);
+                       if (ACPI_SUCCESS(status)) {
+
+                               /* Detach any existing object, attach new object */
+
+                               if (node->object) {
+                                       acpi_ns_detach_object(node);
+                               }
+                               acpi_ns_attach_object(node, obj_desc,
+                                                     obj_desc->common.type);
+                       }
+                       ACPI_FREE(namepath);
+                       status = AE_OK;
+#endif
                        break;
 
                case AML_METHOD_OP:
index 370bbc8677453715ff56d459a02e37713ffddb81..c717fff7d9b572beb2cb42b50f15dfcff72af57d 100644 (file)
@@ -13,9 +13,6 @@
 #define _COMPONENT          ACPI_NAMESPACE
 ACPI_MODULE_NAME("nsnames")
 
-/* Local Prototypes */
-static void acpi_ns_normalize_pathname(char *original_path);
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_get_external_pathname
@@ -30,7 +27,6 @@ static void acpi_ns_normalize_pathname(char *original_path);
  *              for error and debug statements.
  *
  ******************************************************************************/
-
 char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
 {
        char *name_buffer;
@@ -411,7 +407,7 @@ cleanup:
  *
  ******************************************************************************/
 
-static void acpi_ns_normalize_pathname(char *original_path)
+void acpi_ns_normalize_pathname(char *original_path)
 {
        char *input_path = original_path;
        char *new_path_buffer;
index eee263cb7beb00989e79c4abd662c3bc7a90f3a0..c365faf4e6cd414a51c6b9caa8a42c0e85bd82eb 100644 (file)
@@ -452,13 +452,13 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
  *
  * FUNCTION:    acpi_ut_update_object_reference
  *
- * PARAMETERS:  object              - Increment ref count for this object
- *                                    and all sub-objects
+ * PARAMETERS:  object              - Increment or decrement the ref count for
+ *                                    this object and all sub-objects
  *              action              - Either REF_INCREMENT or REF_DECREMENT
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Increment the object reference count
+ * DESCRIPTION: Increment or decrement the object reference count
  *
  * Object references are incremented when:
  * 1) An object is attached to a Node (namespace object)
@@ -492,7 +492,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
                }
 
                /*
-                * All sub-objects must have their reference count incremented
+                * All sub-objects must have their reference count updated
                 * also. Different object types have different subobjects.
                 */
                switch (object->common.type) {
@@ -559,6 +559,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
                                        break;
                                }
                        }
+
                        next_object = NULL;
                        break;