Commit 8a2a2501 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA: Debugger: Fix runtime stub issues of ACPI_DEBUGGER_EXEC using different stub mechanism

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/11522d6bSigned-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent f8d31489
...@@ -80,9 +80,15 @@ struct acpi_db_execute_walk { ...@@ -80,9 +80,15 @@ struct acpi_db_execute_walk {
/* /*
* dbxface - external debugger interfaces * dbxface - external debugger interfaces
*/ */
acpi_status ACPI_DBR_DEPENDENT_RETURN_OK(acpi_status
acpi_db_single_step(struct acpi_walk_state *walk_state, acpi_db_single_step(struct acpi_walk_state
union acpi_parse_object *op, u32 op_type); *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 * dbcmds - debug commands and output routines
...@@ -182,11 +188,15 @@ void acpi_db_display_method_info(union acpi_parse_object *op); ...@@ -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_decode_and_display_object(char *target, char *output_type);
void ACPI_DBR_DEPENDENT_RETURN_VOID(void
acpi_db_display_result_object(union acpi_operand_object *obj_desc, acpi_db_display_result_object(union
struct acpi_walk_state *walk_state); 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); void acpi_db_display_arguments(void);
...@@ -198,9 +208,13 @@ void acpi_db_display_calling_tree(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_object_type(char *object_arg);
void ACPI_DBR_DEPENDENT_RETURN_VOID(void
acpi_db_display_argument_object(union acpi_operand_object *obj_desc, acpi_db_display_argument_object(union
struct acpi_walk_state *walk_state); acpi_operand_object
*obj_desc,
struct
acpi_walk_state
*walk_state))
/* /*
* dbexec - debugger control method execution * dbexec - debugger control method execution
......
...@@ -400,17 +400,6 @@ ...@@ -400,17 +400,6 @@
#define ACPI_HW_OPTIONAL_FUNCTION(addr) NULL #define ACPI_HW_OPTIONAL_FUNCTION(addr) NULL
#endif #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 * Macros used for ACPICA utilities only
*/ */
......
...@@ -679,6 +679,12 @@ acpi_db_display_result_object(union acpi_operand_object *obj_desc, ...@@ -679,6 +679,12 @@ acpi_db_display_result_object(union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state) 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 */ /* Only display if single stepping */
if (!acpi_gbl_cm_single_step) { if (!acpi_gbl_cm_single_step) {
...@@ -708,6 +714,12 @@ acpi_db_display_argument_object(union acpi_operand_object *obj_desc, ...@@ -708,6 +714,12 @@ acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state) 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) { if (!acpi_gbl_cm_single_step) {
return; return;
} }
......
...@@ -117,6 +117,36 @@ acpi_db_start_command(struct acpi_walk_state *walk_state, ...@@ -117,6 +117,36 @@ acpi_db_start_command(struct acpi_walk_state *walk_state,
return (status); 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 * FUNCTION: acpi_db_single_step
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "amlcode.h" #include "amlcode.h"
#include "acdispat.h" #include "acdispat.h"
#include "acinterp.h" #include "acinterp.h"
#include "acdebug.h"
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME("dscontrol") ACPI_MODULE_NAME("dscontrol")
...@@ -348,14 +349,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -348,14 +349,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
case AML_BREAK_POINT_OP: case AML_BREAK_POINT_OP:
/* acpi_db_signal_break_point(walk_state);
* 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"));
/* Call to the OSL in case OS wants a piece of the action */ /* Call to the OSL in case OS wants a piece of the action */
......
...@@ -605,8 +605,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -605,8 +605,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(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 { } else {
/* Check for null name case */ /* Check for null name case */
...@@ -638,10 +638,11 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -638,10 +638,11 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Argument previously created, already stacked\n")); "Argument previously created, already stacked\n"));
ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object acpi_db_display_argument_object(walk_state->
(walk_state-> operands[walk_state->
operands[walk_state->num_operands - num_operands -
1], walk_state)); 1],
walk_state);
/* /*
* Use value that was already previously returned * Use value that was already previously returned
...@@ -685,8 +686,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -685,8 +686,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object acpi_db_display_argument_object(obj_desc, walk_state);
(obj_desc, walk_state));
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
......
...@@ -178,8 +178,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -178,8 +178,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
/* Break to debugger to display result */ /* Break to debugger to display result */
ACPI_DEBUGGER_EXEC(acpi_db_display_result_object acpi_db_display_result_object(local_obj_desc, walk_state);
(local_obj_desc, walk_state));
/* /*
* Delete the predicate result object (we know that * 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) ...@@ -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) */ /* Call debugger for single step support (DEBUG build only) */
ACPI_DEBUGGER_EXEC(status = status = acpi_db_single_step(walk_state, op, op_class);
acpi_db_single_step(walk_state, op, op_class)); if (ACPI_FAILURE(status)) {
ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status);
return_ACPI_STATUS(status);} }
) ;
/* Decode the Opcode Class */ /* Decode the Opcode Class */
...@@ -728,8 +726,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -728,8 +726,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
/* Break to debugger to display result */ /* Break to debugger to display result */
ACPI_DEBUGGER_EXEC(acpi_db_display_result_object acpi_db_display_result_object(walk_state->result_obj,
(walk_state->result_obj, walk_state)); walk_state);
/* /*
* Delete the result op if and only if: * Delete the result op if and only if:
......
...@@ -375,6 +375,29 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running); ...@@ -375,6 +375,29 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
#endif /* ACPI_APPLICATION */ #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 * ACPICA public interface prototypes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment