ACPICA: Debugger: Fix runtime stub issues of ACPI_DEBUGGER_EXEC using different stub...
authorLv Zheng <lv.zheng@intel.com>
Thu, 3 Dec 2015 02:42:53 +0000 (10:42 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 14 Dec 2015 23:17:44 +0000 (00:17 +0100)
ACPICA commit 11522d6b894054fc4d62dd4f9863ec151296b386

The ACPI_DEBUGGER_EXEC is a problem now when the debugger code is compiled
but runtime disabled. They actually will get executed in this situation.
Although such executions are harmless if we can correctly make
acpi_db_single_step() a runtime stub, users may still do not want to see the
debugger print messages logged into OSPMs' kernel logs when a debugger
driver is not loaded to enable the debugger during runtime.

This patch fixes this issue by introducing new stub mechanism instead of
ACPI_DEBUGGER_EXEC. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/11522d6b
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/acdebug.h
drivers/acpi/acpica/acmacros.h
drivers/acpi/acpica/dbdisply.c
drivers/acpi/acpica/dbxface.c
drivers/acpi/acpica/dscontrol.c
drivers/acpi/acpica/dsutils.c
drivers/acpi/acpica/dswexec.c
include/acpi/acpixf.h

index 86474d8..dcaa15d 100644 (file)
@@ -80,9 +80,15 @@ struct acpi_db_execute_walk {
 /*
  * dbxface - external debugger interfaces
  */
-acpi_status
-acpi_db_single_step(struct acpi_walk_state *walk_state,
-                   union acpi_parse_object *op, u32 op_type);
+ACPI_DBR_DEPENDENT_RETURN_OK(acpi_status
+                            acpi_db_single_step(struct acpi_walk_state
+                                                *walk_state,
+                                                union acpi_parse_object *op,
+                                                u32 op_type))
+ ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                               acpi_db_signal_break_point(struct
+                                                          acpi_walk_state
+                                                          *walk_state))
 
 /*
  * dbcmds - debug commands and output routines
@@ -182,11 +188,15 @@ void acpi_db_display_method_info(union acpi_parse_object *op);
 
 void acpi_db_decode_and_display_object(char *target, char *output_type);
 
-void
-acpi_db_display_result_object(union acpi_operand_object *obj_desc,
-                             struct acpi_walk_state *walk_state);
+ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                              acpi_db_display_result_object(union
+                                                            acpi_operand_object
+                                                            *obj_desc,
+                                                            struct
+                                                            acpi_walk_state
+                                                            *walk_state))
 
-acpi_status acpi_db_display_all_methods(char *display_count_arg);
+ acpi_status acpi_db_display_all_methods(char *display_count_arg);
 
 void acpi_db_display_arguments(void);
 
@@ -198,9 +208,13 @@ void acpi_db_display_calling_tree(void);
 
 void acpi_db_display_object_type(char *object_arg);
 
-void
-acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
-                               struct acpi_walk_state *walk_state);
+ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                              acpi_db_display_argument_object(union
+                                                              acpi_operand_object
+                                                              *obj_desc,
+                                                              struct
+                                                              acpi_walk_state
+                                                              *walk_state))
 
 /*
  * dbexec - debugger control method execution
index e85366c..bad5bca 100644 (file)
 #define ACPI_HW_OPTIONAL_FUNCTION(addr)     NULL
 #endif
 
-/*
- * Some code only gets executed when the debugger is built in.
- * Note that this is entirely independent of whether the
- * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
- */
-#ifdef ACPI_DEBUGGER
-#define ACPI_DEBUGGER_EXEC(a)           a
-#else
-#define ACPI_DEBUGGER_EXEC(a)
-#endif
-
 /*
  * Macros used for ACPICA utilities only
  */
index 672977e..c42ce8a 100644 (file)
@@ -679,6 +679,12 @@ acpi_db_display_result_object(union acpi_operand_object *obj_desc,
                              struct acpi_walk_state *walk_state)
 {
 
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
        /* Only display if single stepping */
 
        if (!acpi_gbl_cm_single_step) {
@@ -708,6 +714,12 @@ acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
                                struct acpi_walk_state *walk_state)
 {
 
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
        if (!acpi_gbl_cm_single_step) {
                return;
        }
index d95e91f..d7ff58e 100644 (file)
@@ -117,6 +117,36 @@ error_exit:
        return (status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_db_signal_break_point
+ *
+ * PARAMETERS:  walk_state      - Current walk
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Called for AML_BREAK_POINT_OP
+ *
+ ******************************************************************************/
+
+void acpi_db_signal_break_point(struct acpi_walk_state *walk_state)
+{
+
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
+       /*
+        * Set the single-step flag. This will cause the debugger (if present)
+        * to break to the console within the AML debugger at the start of the
+        * next AML instruction.
+        */
+       acpi_gbl_cm_single_step = TRUE;
+       acpi_os_printf("**break** Executed AML BreakPoint opcode\n");
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_db_single_step
index 435fc16..06a6f7f 100644 (file)
@@ -47,6 +47,7 @@
 #include "amlcode.h"
 #include "acdispat.h"
 #include "acinterp.h"
+#include "acdebug.h"
 
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dscontrol")
@@ -348,14 +349,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
 
        case AML_BREAK_POINT_OP:
 
-               /*
-                * Set the single-step flag. This will cause the debugger (if present)
-                * to break to the console within the AML debugger at the start of the
-                * next AML instruction.
-                */
-               ACPI_DEBUGGER_EXEC(acpi_gbl_cm_single_step = TRUE);
-               ACPI_DEBUGGER_EXEC(acpi_os_printf
-                                  ("**break** Executed AML BreakPoint opcode\n"));
+               acpi_db_signal_break_point(walk_state);
 
                /* Call to the OSL in case OS wants a piece of the action */
 
index ebc577b..e4293a8 100644 (file)
@@ -605,8 +605,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
-               ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                  (obj_desc, walk_state));
+
+               acpi_db_display_argument_object(obj_desc, walk_state);
        } else {
                /* Check for null name case */
 
@@ -638,10 +638,11 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
                                          "Argument previously created, already stacked\n"));
 
-                       ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                          (walk_state->
-                                           operands[walk_state->num_operands -
-                                                    1], walk_state));
+                       acpi_db_display_argument_object(walk_state->
+                                                       operands[walk_state->
+                                                                num_operands -
+                                                                1],
+                                                       walk_state);
 
                        /*
                         * Use value that was already previously returned
@@ -685,8 +686,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        return_ACPI_STATUS(status);
                }
 
-               ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                  (obj_desc, walk_state));
+               acpi_db_display_argument_object(obj_desc, walk_state);
        }
 
        return_ACPI_STATUS(AE_OK);
index df54d46..9cc5761 100644 (file)
@@ -178,8 +178,7 @@ cleanup:
 
        /* Break to debugger to display result */
 
-       ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
-                          (local_obj_desc, walk_state));
+       acpi_db_display_result_object(local_obj_desc, walk_state);
 
        /*
         * Delete the predicate result object (we know that
@@ -386,11 +385,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
        /* Call debugger for single step support (DEBUG build only) */
 
-       ACPI_DEBUGGER_EXEC(status =
-                          acpi_db_single_step(walk_state, op, op_class));
-       ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) {
-                          return_ACPI_STATUS(status);}
-       ) ;
+       status = acpi_db_single_step(walk_state, op, op_class);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
 
        /* Decode the Opcode Class */
 
@@ -728,8 +726,8 @@ cleanup:
 
                /* Break to debugger to display result */
 
-               ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
-                                  (walk_state->result_obj, walk_state));
+               acpi_db_display_result_object(walk_state->result_obj,
+                                             walk_state);
 
                /*
                 * Delete the result op if and only if:
index 95ebae3..5dfab9c 100644 (file)
@@ -375,6 +375,29 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
 
 #endif                         /* ACPI_APPLICATION */
 
+/*
+ * Debugger prototypes
+ *
+ * All interfaces used by debugger will be configured
+ * out of the ACPICA build unless the ACPI_DEBUGGER
+ * flag is defined.
+ */
+#ifdef ACPI_DEBUGGER
+#define ACPI_DBR_DEPENDENT_RETURN_OK(prototype) \
+       ACPI_EXTERNAL_RETURN_OK(prototype)
+
+#define ACPI_DBR_DEPENDENT_RETURN_VOID(prototype) \
+       ACPI_EXTERNAL_RETURN_VOID(prototype)
+
+#else
+#define ACPI_DBR_DEPENDENT_RETURN_OK(prototype) \
+       static ACPI_INLINE prototype {return(AE_OK);}
+
+#define ACPI_DBR_DEPENDENT_RETURN_VOID(prototype) \
+       static ACPI_INLINE prototype {return;}
+
+#endif                         /* ACPI_DEBUGGER */
+
 /*****************************************************************************
  *
  * ACPICA public interface prototypes