forked from mirrors/linux
		
	ACPICA: Debug output: Add option to display method/object evaluation
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>
This commit is contained in:
		
							parent
							
								
									73a049a90f
								
							
						
					
					
						commit
						4c1379d7bb
					
				
					 7 changed files with 68 additions and 3 deletions
				
			
		|  | @ -60,6 +60,8 @@ struct acpi_walk_state { | ||||||
| 	struct acpi_parse_state parser_state;	/* Current state of parser */ | 	struct acpi_parse_state parser_state;	/* Current state of parser */ | ||||||
| 	u32 prev_arg_types; | 	u32 prev_arg_types; | ||||||
| 	u32 arg_count;		/* push for fixed or var args */ | 	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 arguments[ACPI_METHOD_NUM_ARGS];	/* Control method arguments */ | ||||||
| 	struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS];	/* Control method locals */ | 	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 */ | 	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_parse_object *method_call_op;	/* method_call Op if running a method */ | ||||||
| 	union acpi_operand_object *method_desc;	/* Method descriptor 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 */ | 	union acpi_parse_object *op;	/* Current parser op */ | ||||||
| 	const struct acpi_opcode_info *op_info;	/* Info on current opcode */ | 	const struct acpi_opcode_info *op_info;	/* Info on current opcode */ | ||||||
| 	union acpi_parse_object *origin;	/* Start of walk [Obsolete] */ | 	union acpi_parse_object *origin;	/* Start of walk [Obsolete] */ | ||||||
|  |  | ||||||
|  | @ -532,6 +532,9 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | ||||||
| 		goto cleanup; | 		goto cleanup; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	next_walk_state->method_nesting_depth = | ||||||
|  | 	    this_walk_state->method_nesting_depth + 1; | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Delete the operands on the previous walkstate operand stack | 	 * Delete the operands on the previous walkstate operand stack | ||||||
| 	 * (they were copied to new objects) | 	 * (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", | 			  "**** Begin nested execution of [%4.4s] **** WalkState=%p\n", | ||||||
| 			  method_node->name.ascii, next_walk_state)); | 			  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 */ | 	/* Invoke an internal method if necessary */ | ||||||
| 
 | 
 | ||||||
| 	if (obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) { | 	if (obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) { | ||||||
|  |  | ||||||
|  | @ -104,6 +104,13 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) | ||||||
| 		return_ACPI_STATUS(AE_NO_MEMORY); | 		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 */ | 	/* Count the number of arguments being passed in */ | ||||||
| 
 | 
 | ||||||
| 	info->param_count = 0; | 	info->param_count = 0; | ||||||
|  | @ -289,6 +296,12 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) | ||||||
| 			  info->relative_pathname)); | 			  info->relative_pathname)); | ||||||
| 
 | 
 | ||||||
| cleanup: | 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 | 	 * Namespace was unlocked by the handling acpi_ns* function, so we | ||||||
| 	 * just free the pathname and return | 	 * just free the pathname and return | ||||||
|  |  | ||||||
|  | @ -107,8 +107,20 @@ acpi_ns_execute_table(u32 table_index, struct acpi_namespace_node *start_node) | ||||||
| 		goto cleanup; | 		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); | 	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: | cleanup: | ||||||
| 	if (info) { | 	if (info) { | ||||||
| 		ACPI_FREE(info->full_pathname); | 		ACPI_FREE(info->full_pathname); | ||||||
|  |  | ||||||
|  | @ -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", | 				  "Completed one call to walk loop, %s State=%p\n", | ||||||
| 				  acpi_format_exception(status), walk_state)); | 				  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) { | 		if (status == AE_CTRL_TRANSFER) { | ||||||
| 			/*
 | 			/*
 | ||||||
| 			 * A method call was detected. | 			 * A method call was detected. | ||||||
|  |  | ||||||
|  | @ -147,6 +147,9 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | ||||||
| 		goto cleanup; | 		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) { | 	if (info->obj_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) { | ||||||
| 		walk_state->parse_flags |= ACPI_PARSE_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; | 		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) { | 	if (info->obj_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) { | ||||||
| 		walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL; | 		walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -73,7 +73,8 @@ | ||||||
| #define ACPI_LV_RESOURCES           0x00010000 | #define ACPI_LV_RESOURCES           0x00010000 | ||||||
| #define ACPI_LV_USER_REQUESTS       0x00020000 | #define ACPI_LV_USER_REQUESTS       0x00020000 | ||||||
| #define ACPI_LV_PACKAGE             0x00040000 | #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] */ | /* Trace verbosity level 2 [Function tracing and memory allocation] */ | ||||||
| 
 | 
 | ||||||
|  | @ -141,6 +142,7 @@ | ||||||
| #define ACPI_DB_INTERRUPTS          ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS) | #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_USER_REQUESTS       ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS) | ||||||
| #define ACPI_DB_PACKAGE             ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE) | #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_MUTEX               ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX) | ||||||
| #define ACPI_DB_EVENTS              ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS) | #define ACPI_DB_EVENTS              ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS) | ||||||
| 
 | 
 | ||||||
|  | @ -148,7 +150,7 @@ | ||||||
| 
 | 
 | ||||||
| /* Defaults for debug_level, debug and normal */ | /* 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_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) | #define ACPI_DEBUG_ALL              (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bob Moore
						Bob Moore