Skip to content

Commit

Permalink
ACPICA: Executer: Add OSL trace hook support
Browse files Browse the repository at this point in the history
ACPICA commit e8e4a9b19d0b72a7b165398bdc961fc2f6f502ec

This patch adds OSL trace hook support.

OSPMs are encouraged to use acpi_os_trace_point() with
ACPI_USE_SYSTEM_TRACER defined to implement platform specific trace
facility. Lv Zheng.

Link: acpica/acpica@e8e4a9b1
Signed-off-by: Lv Zheng <[email protected]>
Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
  • Loading branch information
Lv Zheng authored and rafaeljw committed Jul 23, 2015
1 parent ab6c573 commit bab0482
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 38 deletions.
4 changes: 4 additions & 0 deletions drivers/acpi/acpica/acinterp.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ void
acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
struct acpi_walk_state *walk_state);

void
acpi_ex_trace_point(acpi_trace_event_type type,
u8 begin, u8 *aml, char *pathname);

/*
* exfield - ACPI AML (p-code) execution - field manipulation
*/
Expand Down
125 changes: 88 additions & 37 deletions drivers/acpi/acpica/exdebug.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ ACPI_MODULE_NAME("exdebug")

static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;

/* Local prototypes */

#ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
#endif

#ifndef ACPI_NO_ERROR_MESSAGES
/*******************************************************************************
*
Expand Down Expand Up @@ -363,6 +369,78 @@ static u8 acpi_ex_interpreter_trace_enabled(char *name)
return (TRUE);
}

/*******************************************************************************
*
* FUNCTION: acpi_ex_get_trace_event_name
*
* PARAMETERS: type - Trace event type
*
* RETURN: Trace event name.
*
* DESCRIPTION: Used to obtain the full trace event name.
*
******************************************************************************/

#ifdef ACPI_DEBUG_OUTPUT

static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
{
switch (type) {
case ACPI_TRACE_AML_METHOD:

return "Method";

case ACPI_TRACE_AML_OPCODE:

return "Opcode";

case ACPI_TRACE_AML_REGION:

return "Region";

default:

return "";
}
}

#endif

/*******************************************************************************
*
* FUNCTION: acpi_ex_trace_point
*
* PARAMETERS: type - Trace event type
* begin - TRUE if before execution
* aml - Executed AML address
* pathname - Object path
*
* RETURN: None
*
* DESCRIPTION: Internal interpreter execution trace.
*
******************************************************************************/

void
acpi_ex_trace_point(acpi_trace_event_type type,
u8 begin, u8 *aml, char *pathname)
{

ACPI_FUNCTION_NAME(ex_trace_point);

if (pathname) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p:%s] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml, pathname));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml));
}
}

/*******************************************************************************
*
* FUNCTION: acpi_ex_start_trace_method
Expand Down Expand Up @@ -417,16 +495,9 @@ acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,

exit:
if (enabled) {
if (pathname) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"Begin method [0x%p:%s] execution.\n",
obj_desc->method.aml_start,
pathname));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"Begin method [0x%p] execution.\n",
obj_desc->method.aml_start));
}
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}
if (pathname) {
ACPI_FREE(pathname);
Expand Down Expand Up @@ -473,16 +544,9 @@ acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);

if (enabled) {
if (pathname) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"End method [0x%p:%s] execution.\n",
obj_desc->method.aml_start,
pathname));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"End method [0x%p] execution.\n",
obj_desc->method.aml_start));
}
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}

status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
Expand Down Expand Up @@ -535,20 +599,8 @@ acpi_ex_start_trace_opcode(union acpi_parse_object *op,
ACPI_FUNCTION_NAME(ex_start_trace_opcode);

if (acpi_ex_interpreter_trace_enabled(NULL)) {
if (walk_state->op_info) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"Begin opcode: %s[0x%p] Class=0x%02x, Type=0x%02x, Flags=0x%04x.\n",
op->common.aml_op_name,
op->common.aml,
walk_state->op_info->class,
walk_state->op_info->type,
walk_state->op_info->flags));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"Begin opcode: %s[0x%p].\n",
op->common.aml_op_name,
op->common.aml));
}
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
op->common.aml, op->common.aml_op_name);
}
}

Expand All @@ -574,8 +626,7 @@ acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
ACPI_FUNCTION_NAME(ex_stop_trace_opcode);

if (acpi_ex_interpreter_trace_enabled(NULL)) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"End opcode: %s[0x%p].\n",
op->common.aml_op_name, op->common.aml));
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
op->common.aml, op->common.aml_op_name);
}
}
31 changes: 30 additions & 1 deletion drivers/acpi/acpica/utdebug.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

#include <acpi/acpi.h>
#include "accommon.h"
#include "acinterp.h"

#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME("utdebug")
Expand Down Expand Up @@ -560,8 +561,37 @@ acpi_ut_ptr_exit(u32 line_number,
}
}

/*******************************************************************************
*
* FUNCTION: acpi_trace_point
*
* PARAMETERS: type - Trace event type
* begin - TRUE if before execution
* aml - Executed AML address
* pathname - Object path
* pointer - Pointer to the related object
*
* RETURN: None
*
* DESCRIPTION: Interpreter execution trace.
*
******************************************************************************/

void
acpi_trace_point(acpi_trace_event_type type, u8 begin, u8 *aml, char *pathname)
{

ACPI_FUNCTION_ENTRY();

acpi_ex_trace_point(type, begin, aml, pathname);

#ifdef ACPI_USE_SYSTEM_TRACER
acpi_os_trace_point(type, begin, aml, pathname);
#endif
}

ACPI_EXPORT_SYMBOL(acpi_trace_point)
#endif
#ifdef ACPI_APPLICATION
/*******************************************************************************
*
Expand All @@ -575,7 +605,6 @@ acpi_ut_ptr_exit(u32 line_number,
* DESCRIPTION: Print error message to the console, used by applications.
*
******************************************************************************/

void ACPI_INTERNAL_VAR_XFACE acpi_log_error(const char *format, ...)
{
va_list args;
Expand Down
3 changes: 3 additions & 0 deletions include/acpi/acoutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,8 @@
#define ACPI_DUMP_PATHNAME(a, b, c, d) acpi_ns_dump_pathname(a, b, c, d)
#define ACPI_DUMP_BUFFER(a, b) acpi_ut_debug_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT)

#define ACPI_TRACE_POINT(a, b, c, d) acpi_trace_point (a, b, c, d)

#else /* ACPI_DEBUG_OUTPUT */
/*
* This is the non-debug case -- make everything go away,
Expand All @@ -468,6 +470,7 @@
#define ACPI_DUMP_PATHNAME(a, b, c, d)
#define ACPI_DUMP_BUFFER(a, b)
#define ACPI_IS_DEBUG_ENABLED(level, component) 0
#define ACPI_TRACE_POINT(a, b, c, d)

/* Return macros must have a return statement at the minimum */

Expand Down
6 changes: 6 additions & 0 deletions include/acpi/acpiosxf.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,4 +430,10 @@ long acpi_os_get_file_offset(ACPI_FILE file);
acpi_status acpi_os_set_file_offset(ACPI_FILE file, long offset, u8 from);
#endif

#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_trace_point
void
acpi_os_trace_point(acpi_trace_event_type type,
u8 begin, u8 *aml, char *pathname);
#endif

#endif /* __ACPIOSXF_H__ */
5 changes: 5 additions & 0 deletions include/acpi/acpixf.h
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,11 @@ ACPI_DBG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(6)
const char *module_name,
u32 component_id,
const char *format, ...))

ACPI_DBG_DEPENDENT_RETURN_VOID(void
acpi_trace_point(acpi_trace_event_type type,
u8 begin,
u8 *aml, char *pathname))
ACPI_APP_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(1)
void ACPI_INTERNAL_VAR_XFACE
acpi_log_error(const char *format, ...))
Expand Down
8 changes: 8 additions & 0 deletions include/acpi/actypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1247,6 +1247,14 @@ struct acpi_memory_list {
#endif
};

/* Definitions of trace event types */

typedef enum {
ACPI_TRACE_AML_METHOD,
ACPI_TRACE_AML_OPCODE,
ACPI_TRACE_AML_REGION
} acpi_trace_event_type;

/* Definitions of _OSI support */

#define ACPI_VENDOR_STRINGS 0x01
Expand Down

0 comments on commit bab0482

Please sign in to comment.