ACPICA: Debug output: Add option to display method/object evaluation
authorBob Moore <robert.moore@intel.com>
Thu, 13 Dec 2018 20:30:33 +0000 (12:30 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 13 Dec 2018 21:40:51 +0000 (22:40 +0100)
Adds entry/exit messages for all objects that are evaluated.
Works for the kernel-level code as well as acpiexec. The "-eo"
flag enables acpiexec to display these messages.

The messages are very useful when debugging the flow of table
initialization.

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/acstruct.h
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/nseval.c
drivers/acpi/acpica/nsparse.c
drivers/acpi/acpica/psparse.c
drivers/acpi/acpica/psxface.c
include/acpi/acoutput.h

index acf2715..14be329 100644 (file)
@@ -60,6 +60,8 @@ struct acpi_walk_state {
        struct acpi_parse_state parser_state;   /* Current state of parser */
        u32 prev_arg_types;
        u32 arg_count;          /* push for fixed or var args */
+       u16 method_nesting_depth;
+       u8 method_is_nested;
 
        struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS];     /* Control method arguments */
        struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS];     /* Control method locals */
@@ -74,7 +76,8 @@ struct acpi_walk_state {
        struct acpi_namespace_node *method_call_node;   /* Called method Node */
        union acpi_parse_object *method_call_op;        /* method_call Op if running a method */
        union acpi_operand_object *method_desc; /* Method descriptor if running a method */
-       struct acpi_namespace_node *method_node;        /* Method node if running a method. */
+       struct acpi_namespace_node *method_node;        /* Method node if running a method */
+       char *method_pathname;  /* Full pathname of running method */
        union acpi_parse_object *op;    /* Current parser op */
        const struct acpi_opcode_info *op_info; /* Info on current opcode */
        union acpi_parse_object *origin;        /* Start of walk [Obsolete] */
index dd4deb6..c1a4d02 100644 (file)
@@ -532,6 +532,9 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
                goto cleanup;
        }
 
+       next_walk_state->method_nesting_depth =
+           this_walk_state->method_nesting_depth + 1;
+
        /*
         * Delete the operands on the previous walkstate operand stack
         * (they were copied to new objects)
@@ -549,6 +552,17 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
                          "**** Begin nested execution of [%4.4s] **** WalkState=%p\n",
                          method_node->name.ascii, next_walk_state));
 
+       this_walk_state->method_pathname =
+           acpi_ns_get_normalized_pathname(method_node, TRUE);
+       this_walk_state->method_is_nested = TRUE;
+
+       /* Optional object evaluation log */
+
+       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                             "%-26s:  %*s%s\n", "   Nested method call",
+                             next_walk_state->method_nesting_depth * 3, " ",
+                             &this_walk_state->method_pathname[1]));
+
        /* Invoke an internal method if necessary */
 
        if (obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) {
index 64ba80e..6390b79 100644 (file)
@@ -104,6 +104,13 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
+       /* Optional object evaluation log */
+
+       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                             "%-26s:  %s (%s)\n", "   Enter evaluation",
+                             &info->full_pathname[1],
+                             acpi_ut_get_type_name(info->node->type)));
+
        /* Count the number of arguments being passed in */
 
        info->param_count = 0;
@@ -289,6 +296,12 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
                          info->relative_pathname));
 
 cleanup:
+       /* Optional object evaluation log */
+
+       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                             "%-26s:  %s\n", "   Exit evaluation",
+                             &info->full_pathname[1]));
+
        /*
         * Namespace was unlocked by the handling acpi_ns* function, so we
         * just free the pathname and return
index c9ef494..488ff39 100644 (file)
@@ -107,8 +107,20 @@ acpi_ns_execute_table(u32 table_index, struct acpi_namespace_node *start_node)
                goto cleanup;
        }
 
+       /* Optional object evaluation log */
+
+       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                             "%-26s:  (Definition Block level)\n",
+                             "Module-level evaluation"));
+
        status = acpi_ps_execute_table(info);
 
+       /* Optional object evaluation log */
+
+       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                             "%-26s:  (Definition Block level)\n",
+                             "Module-level complete"));
+
 cleanup:
        if (info) {
                ACPI_FREE(info->full_pathname);
index a16a6ea..6560347 100644 (file)
@@ -479,6 +479,21 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                                  "Completed one call to walk loop, %s State=%p\n",
                                  acpi_format_exception(status), walk_state));
 
+               if (walk_state->method_pathname && walk_state->method_is_nested) {
+
+                       /* Optional object evaluation log */
+
+                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_EVALUATION,
+                                             "%-26s:  %*s%s\n",
+                                             "   Exit nested method",
+                                             (walk_state->
+                                              method_nesting_depth + 1) * 3,
+                                             " ",
+                                             &walk_state->method_pathname[1]));
+
+                       ACPI_FREE(walk_state->method_pathname);
+                       walk_state->method_is_nested = FALSE;
+               }
                if (status == AE_CTRL_TRANSFER) {
                        /*
                         * A method call was detected.
index f26bcbb..5743b22 100644 (file)
@@ -147,6 +147,9 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
                goto cleanup;
        }
 
+       walk_state->method_pathname = info->full_pathname;
+       walk_state->method_is_nested = FALSE;
+
        if (info->obj_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) {
                walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL;
        }
@@ -267,6 +270,9 @@ acpi_status acpi_ps_execute_table(struct acpi_evaluate_info *info)
                goto cleanup;
        }
 
+       walk_state->method_pathname = info->full_pathname;
+       walk_state->method_is_nested = FALSE;
+
        if (info->obj_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) {
                walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL;
        }
index 3a26aa7..6db9a6d 100644 (file)
@@ -73,7 +73,8 @@
 #define ACPI_LV_RESOURCES           0x00010000
 #define ACPI_LV_USER_REQUESTS       0x00020000
 #define ACPI_LV_PACKAGE             0x00040000
-#define ACPI_LV_VERBOSITY1          0x0007FF40 | ACPI_LV_ALL_EXCEPTIONS
+#define ACPI_LV_EVALUATION          0x00080000
+#define ACPI_LV_VERBOSITY1          0x000FFF40 | ACPI_LV_ALL_EXCEPTIONS
 
 /* Trace verbosity level 2 [Function tracing and memory allocation] */
 
 #define ACPI_DB_INTERRUPTS          ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS)
 #define ACPI_DB_USER_REQUESTS       ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS)
 #define ACPI_DB_PACKAGE             ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE)
+#define ACPI_DB_EVALUATION          ACPI_DEBUG_LEVEL (ACPI_LV_EVALUATION)
 #define ACPI_DB_MUTEX               ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX)
 #define ACPI_DB_EVENTS              ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS)
 
 
 /* Defaults for debug_level, debug and normal */
 
-#define ACPI_DEBUG_DEFAULT          (ACPI_LV_INFO | ACPI_LV_REPAIR)
+#define ACPI_DEBUG_DEFAULT          (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_EVALUATION | ACPI_LV_REPAIR)
 #define ACPI_NORMAL_DEFAULT         (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR)
 #define ACPI_DEBUG_ALL              (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL)