exdump.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 925 行 · 第 1/2 页

C
925
字号
/****************************************************************************** * * Module Name: exdump - Interpreter debug output routines *              $Revision: 147 $ * *****************************************************************************//* *  Copyright (C) 2000 - 2002, R. Byron Moore * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "acpi.h"#include "acinterp.h"#include "amlcode.h"#include "acnamesp.h"#include "actables.h"#include "acparser.h"#define _COMPONENT          ACPI_EXECUTER	 ACPI_MODULE_NAME    ("exdump")/* * The following routines are used for debug output only */#if defined(ACPI_DEBUG) || defined(ENABLE_DEBUGGER)/***************************************************************************** * * FUNCTION:    Acpi_ex_show_hex_value * * PARAMETERS:  Byte_count          - Number of bytes to print (1, 2, or 4) *              *Aml_start            - Address in AML stream of bytes to print *              Interpreter_mode    - Current running mode (load1/Load2/Exec) *              Lead_space          - # of spaces to print ahead of value *                                    0 => none ahead but one behind * * DESCRIPTION: Print Byte_count byte(s) starting at Aml_start as a single *              value, in hex.  If Byte_count > 1 or the value printed is > 9, also *              print in decimal. * ****************************************************************************/voidacpi_ex_show_hex_value (	u32                     byte_count,	u8                      *aml_start,	u32                     lead_space){	u32                     value;                  /*  Value retrieved from AML stream */	u32                     show_decimal_value;	u32                     length;                 /*  Length of printed field */	u8                      *current_aml_ptr = NULL; /* Pointer to current byte of AML value    */	ACPI_FUNCTION_TRACE ("Ex_show_hex_value");	if (!((ACPI_LV_LOAD & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) {		return;	}	if (!aml_start) {		ACPI_REPORT_ERROR (("Ex_show_hex_value: null pointer\n"));		return;	}	/*	 * AML numbers are always stored little-endian,	 * even if the processor is big-endian.	 */	for (current_aml_ptr = aml_start + byte_count,			value = 0;			current_aml_ptr > aml_start; ) {		value = (value << 8) + (u32)* --current_aml_ptr;	}	length = lead_space * byte_count + 2;	if (byte_count > 1) {		length += (byte_count - 1);	}	show_decimal_value = (byte_count > 1 || value > 9);	if (show_decimal_value) {		length += 3 + acpi_ex_digits_needed (value, 10);	}	for (length = lead_space; length; --length ) {		acpi_os_printf (" ");	}	while (byte_count--) {		acpi_os_printf ("%02x", *aml_start++);		if (byte_count) {			acpi_os_printf (" ");		}	}	if (show_decimal_value) {		acpi_os_printf (" [%d]", value);	}	if (0 == lead_space) {		acpi_os_printf (" ");	}	acpi_os_printf ("\n");	return_VOID;}/***************************************************************************** * * FUNCTION:    Acpi_ex_dump_operand * * PARAMETERS:  *Obj_desc         - Pointer to entry to be dumped * * RETURN:      Status * * DESCRIPTION: Dump an operand object * ****************************************************************************/acpi_statusacpi_ex_dump_operand (	acpi_operand_object     *obj_desc){	u8                      *buf = NULL;	u32                     length;	u32                     i;	ACPI_FUNCTION_NAME ("Ex_dump_operand")	if (!((ACPI_LV_EXEC & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) {		return (AE_OK);	}	if (!obj_desc) {		/*		 * This usually indicates that something serious is wrong --		 * since most (if not all)		 * code that dumps the stack expects something to be there!		 */		acpi_os_printf ("Null stack entry ptr\n");		return (AE_OK);	}	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) {		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p NS Node: ", obj_desc));		ACPI_DUMP_ENTRY (obj_desc, ACPI_LV_EXEC);		return (AE_OK);	}	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_INTERNAL) {		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is not a local object\n", obj_desc));		ACPI_DUMP_BUFFER (obj_desc, sizeof (acpi_operand_object));		return (AE_OK);	}	/*  Obj_desc is a valid object */	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", obj_desc));	switch (obj_desc->common.type) {	case INTERNAL_TYPE_REFERENCE:		switch (obj_desc->reference.opcode) {		case AML_ZERO_OP:			acpi_os_printf ("Reference: Zero\n");			break;		case AML_ONE_OP:			acpi_os_printf ("Reference: One\n");			break;		case AML_ONES_OP:			acpi_os_printf ("Reference: Ones\n");			break;		case AML_REVISION_OP:			acpi_os_printf ("Reference: Revision\n");			break;		case AML_DEBUG_OP:			acpi_os_printf ("Reference: Debug\n");			break;		case AML_NAME_OP:			ACPI_DUMP_PATHNAME (obj_desc->reference.object, "Reference: Name: ",					  ACPI_LV_INFO, _COMPONENT);			ACPI_DUMP_ENTRY (obj_desc->reference.object, ACPI_LV_INFO);			break;		case AML_INDEX_OP:			acpi_os_printf ("Reference: Index %p\n",					 obj_desc->reference.object);			break;		case AML_ARG_OP:			acpi_os_printf ("Reference: Arg%d",					 obj_desc->reference.offset);			if (ACPI_TYPE_INTEGER == obj_desc->common.type) {				/* Value is a Number */				acpi_os_printf (" value is [%8.8X%8.8x]",						 ACPI_HIDWORD(obj_desc->integer.value),						 ACPI_LODWORD(obj_desc->integer.value));			}			acpi_os_printf ("\n");			break;		case AML_LOCAL_OP:			acpi_os_printf ("Reference: Local%d",					 obj_desc->reference.offset);			if (ACPI_TYPE_INTEGER == obj_desc->common.type) {				/* Value is a Number */				acpi_os_printf (" value is [%8.8X%8.8x]",						 ACPI_HIDWORD(obj_desc->integer.value),						 ACPI_LODWORD(obj_desc->integer.value));			}			acpi_os_printf ("\n");			break;		case AML_INT_NAMEPATH_OP:			acpi_os_printf ("Reference.Node->Name %X\n",					 obj_desc->reference.node->name);			break;		default:			/*  unknown opcode  */			acpi_os_printf ("Unknown opcode=%X\n",				obj_desc->reference.opcode);			break;		}		break;	case ACPI_TYPE_BUFFER:		acpi_os_printf ("Buffer len %X @ %p \n",				 obj_desc->buffer.length,				 obj_desc->buffer.pointer);		length = obj_desc->buffer.length;		if (length > 64) {			length = 64;		}		/* Debug only -- dump the buffer contents */		if (obj_desc->buffer.pointer) {			acpi_os_printf ("Buffer Contents: ");			for (buf = obj_desc->buffer.pointer; length--; ++buf) {				acpi_os_printf (" %02x", *buf);			}			acpi_os_printf ("\n");		}		break;	case ACPI_TYPE_INTEGER:		acpi_os_printf ("Integer %8.8X%8.8X\n",				 ACPI_HIDWORD (obj_desc->integer.value),				 ACPI_LODWORD (obj_desc->integer.value));		break;	case INTERNAL_TYPE_IF:		acpi_os_printf ("If [Integer] %8.8X%8.8X\n",				 ACPI_HIDWORD (obj_desc->integer.value),				 ACPI_LODWORD (obj_desc->integer.value));		break;	case INTERNAL_TYPE_WHILE:		acpi_os_printf ("While [Integer] %8.8X%8.8X\n",				 ACPI_HIDWORD (obj_desc->integer.value),				 ACPI_LODWORD (obj_desc->integer.value));		break;	case ACPI_TYPE_PACKAGE:		acpi_os_printf ("Package count %X @ %p\n",				 obj_desc->package.count, obj_desc->package.elements);		/*		 * If elements exist, package vector pointer is valid,		 * and debug_level exceeds 1, dump package's elements.		 */		if (obj_desc->package.count &&			obj_desc->package.elements &&			acpi_dbg_level > 1) {			acpi_operand_object**element;			u16                 element_index;			for (element_index = 0, element = obj_desc->package.elements;				  element_index < obj_desc->package.count;				  ++element_index, ++element) {				acpi_ex_dump_operand (*element);			}		}		acpi_os_printf ("\n");		break;	case ACPI_TYPE_REGION:		acpi_os_printf ("Region %s (%X)",			acpi_ut_get_region_name (obj_desc->region.space_id),			obj_desc->region.space_id);		/*		 * If the address and length have not been evaluated,		 * don't print them.		 */		if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) {			acpi_os_printf ("\n");		}		else {			acpi_os_printf (" base %8.8X%8.8X Length %X\n",				ACPI_HIDWORD (obj_desc->region.address),				ACPI_LODWORD (obj_desc->region.address),				obj_desc->region.length);		}		break;	case ACPI_TYPE_STRING:		acpi_os_printf ("String length %X @ %p \"",				 obj_desc->string.length, obj_desc->string.pointer);		for (i = 0; i < obj_desc->string.length; i++) {			acpi_os_printf ("%c",					 obj_desc->string.pointer[i]);		}		acpi_os_printf ("\"\n");		break;	case INTERNAL_TYPE_BANK_FIELD:		acpi_os_printf ("Bank_field\n");		break;	case INTERNAL_TYPE_REGION_FIELD:		acpi_os_printf (			"Region_field: Bits=%X Acc_width=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n",			obj_desc->field.bit_length, obj_desc->field.access_byte_width,			obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK,			obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK,			obj_desc->field.base_byte_offset, obj_desc->field.start_field_bit_offset);		ACPI_DUMP_STACK_ENTRY (obj_desc->field.region_obj);		break;	case INTERNAL_TYPE_INDEX_FIELD:		acpi_os_printf ("Index_field\n");		break;	case ACPI_TYPE_BUFFER_FIELD:		acpi_os_printf (			"Buffer_field: %X bits at byte %X bit %X of \n",			obj_desc->buffer_field.bit_length, obj_desc->buffer_field.base_byte_offset,			obj_desc->buffer_field.start_field_bit_offset);		if (!obj_desc->buffer_field.buffer_obj)		{			ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL* \n"));		}		else if (ACPI_TYPE_BUFFER !=				  obj_desc->buffer_field.buffer_obj->common.type)		{			acpi_os_printf ("*not a Buffer* \n");		}		else		{			ACPI_DUMP_STACK_ENTRY (obj_desc->buffer_field.buffer_obj);		}		break;	case ACPI_TYPE_EVENT:		acpi_os_printf ("Event\n");		break;	case ACPI_TYPE_METHOD:		acpi_os_printf (			"Method(%X) @ %p:%X\n",			obj_desc->method.param_count,			obj_desc->method.aml_start, obj_desc->method.aml_length);		break;	case ACPI_TYPE_MUTEX:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?