Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a616dc2f authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki
Browse files

ACPICA: Dispatcher: Add trace support for interpreter

ACPICA commit 71299ec8b49054daace0df50268e8e055654ca37

This patch adds trace point at the following point:
 1. Begin/end of a control method execution;
 2. Begin/end of an opcode execution.

The trace point feature can be enabled by defining ACPI_DEBUG_OUTPUT
and specifying a debug level that includes ACPI_LV_TRACDE_POINT and the
debug layers that include ACPI_PARSER and ACPI_DISPACTCHER.

In order to make aml_op_name of union acpi_parse_object usable for tracer, it is
enabled for ACPI_DEBUG_OUTPUT in this patch. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/71299ec8


Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 0bac4295
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -715,7 +715,7 @@ union acpi_parse_value {
	union acpi_parse_object *arg;	/* arguments and contained ops */
};

#ifdef ACPI_DISASSEMBLER
#if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT)
#define ACPI_DISASM_ONLY_MEMBERS(a)     a;
#else
#define ACPI_DISASM_ONLY_MEMBERS(a)
+24 −0
Original line number Diff line number Diff line
@@ -127,6 +127,8 @@ acpi_ds_dump_method_stack(acpi_status status,
	struct acpi_thread_state *thread;
	struct acpi_walk_state *next_walk_state;
	struct acpi_namespace_node *previous_method = NULL;
	union acpi_operand_object *method_desc;
	char *pathname = NULL;

	ACPI_FUNCTION_TRACE(ds_dump_method_stack);

@@ -170,6 +172,28 @@ acpi_ds_dump_method_stack(acpi_status status,
	/* Walk list of linked walk states */

	while (next_walk_state) {
		method_desc = next_walk_state->method_desc;
		if (method_desc && method_desc->method.node) {
			pathname = acpi_ns_get_normalized_pathname((struct
								    acpi_namespace_node
								    *)
								   method_desc->
								   method.node,
								   TRUE);
		}
		if (pathname) {
			ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
					  "End method [0x%p:%s] execution.\n",
					  method_desc->method.aml_start,
					  pathname));
			ACPI_FREE(pathname);
			pathname = NULL;
		} else {
			ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
					  "End method [0x%p] execution.\n",
					  method_desc->method.aml_start));
		}

		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
				  "    Method [%4.4s] executing: ",
				  acpi_ut_get_node_name(next_walk_state->
+31 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
			       struct acpi_walk_state *walk_state)
{
	acpi_status status = AE_OK;
	char *pathname = NULL;

	ACPI_FUNCTION_TRACE_PTR(ds_begin_method_execution, method_node);

@@ -334,6 +335,18 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
		return_ACPI_STATUS(AE_NULL_ENTRY);
	}

	pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
	if (pathname) {
		ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
				  "Begin method [0x%p:%s] execution.\n",
				  obj_desc->method.aml_start, pathname));
		ACPI_FREE(pathname);
	} else {
		ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
				  "Begin method [0x%p] execution.\n",
				  obj_desc->method.aml_start));
	}

	/* Prevent wraparound of thread count */

	if (obj_desc->method.thread_count == ACPI_UINT8_MAX) {
@@ -695,6 +708,7 @@ void
acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
				 struct acpi_walk_state *walk_state)
{
	char *pathname = NULL;

	ACPI_FUNCTION_TRACE_PTR(ds_terminate_control_method, walk_state);

@@ -832,5 +846,22 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
		}
	}

	if (method_desc->method.node) {
		pathname = acpi_ns_get_normalized_pathname((struct
							    acpi_namespace_node
							    *)method_desc->
							   method.node, TRUE);
	}
	if (pathname) {
		ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
				  "End method [0x%p:%s] execution.\n",
				  method_desc->method.aml_start, pathname));
		ACPI_FREE(pathname);
	} else {
		ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
				  "End method [0x%p] execution.\n",
				  method_desc->method.aml_start));
	}

	return_VOID;
}
+15 −0
Original line number Diff line number Diff line
@@ -497,6 +497,21 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
						  walk_state->op_info->name, op,
						  op->common.aml));
			}

			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));
			}
		}

		/*
+4 −0
Original line number Diff line number Diff line
@@ -147,6 +147,10 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
		return_ACPI_STATUS(AE_OK);	/* OK for now */
	}

	ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
			  "End opcode: %s[0x%p].\n",
			  op->common.aml_op_name, op->common.aml));

	/* Delete this op and the subtree below it if asked to */

	if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) !=
Loading