/******************************************************************************
 *
 * Module Name: exdump - Interpreter debug output routines
 *
 *****************************************************************************/

/*
 * Copyright (C) 2000 - 2005, R. Byron Moore
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#include <acpi/acpi.h>
#include <acpi/acinterp.h>
#include <acpi/amlcode.h>
#include <acpi/acnamesp.h>
#include <acpi/acparser.h>

#define _COMPONENT          ACPI_EXECUTER
ACPI_MODULE_NAME("exdump")

/*
 * The following routines are used for debug output only
 */
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
/* Local prototypes */
#ifdef ACPI_FUTURE_USAGE
static void acpi_ex_out_string(char *title, char *value);

static void acpi_ex_out_pointer(char *title, void *value);

static void acpi_ex_out_integer(char *title, u32 value);

static void acpi_ex_out_address(char *title, acpi_physical_address value);

static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc);

static void
acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index);
#endif				/* ACPI_FUTURE_USAGE */

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_operand
 *
 * PARAMETERS:  *obj_desc       - Pointer to entry to be dumped
 *              Depth           - Current nesting depth
 *
 * RETURN:      None
 *
 * DESCRIPTION: Dump an operand object
 *
 ******************************************************************************/

void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
{
	u32 length;
	u32 index;

	ACPI_FUNCTION_NAME("ex_dump_operand")

	    if (!
		((ACPI_LV_EXEC & acpi_dbg_level)
		 && (_COMPONENT & acpi_dbg_layer))) {
		return;
	}

	if (!obj_desc) {
		/* This could be a null element of a package */

		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n"));
		return;
	}

	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: ",
				  obj_desc));
		ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC);
		return;
	}

	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
				  "%p is not a node or operand object: [%s]\n",
				  obj_desc,
				  acpi_ut_get_descriptor_name(obj_desc)));
		ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object));
		return;
	}

	/* obj_desc is a valid object */

	if (depth > 0) {
		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p ",
				  depth, " ", depth, obj_desc));
	} else {
		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p ", obj_desc));
	}

	/* Decode object type */

	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
	case ACPI_TYPE_LOCAL_REFERENCE:

		switch (obj_desc->reference.opcode) {
		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_REF_OF_OP:

			acpi_os_printf("Reference: (ref_of) %p\n",
				       obj_desc->reference.object);
			break;

		case AML_ARG_OP:

			acpi_os_printf("Reference: Arg%d",
				       obj_desc->reference.offset);

			if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
				/* Value is an Integer */

				acpi_os_printf(" value is [%8.8X%8.8x]",
					       ACPI_FORMAT_UINT64(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_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {

				/* Value is an Integer */

				acpi_os_printf(" value is [%8.8X%8.8x]",
					       ACPI_FORMAT_UINT64(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.integer);
			break;

		default:

			/* Unknown opcode */

			acpi_os_printf("Unknown Reference 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 (index = 0; index < length; index++) {
				acpi_os_printf(" %02x",
					       obj_desc->buffer.pointer[index]);
			}
			acpi_os_printf("\n");
		}
		break;

	case ACPI_TYPE_INTEGER:

		acpi_os_printf("Integer %8.8X%8.8X\n",
			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
		break;

	case ACPI_TYPE_PACKAGE:

		acpi_os_printf("Package [Len %X] element_array %p\n",
			       obj_desc->package.count,
			       obj_desc->package.elements);

		/*
		 * If elements exist, package element 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) {
			for (index = 0; index < obj_desc->package.count;
			     index++) {
				acpi_ex_dump_operand(obj_desc->package.
						     elements[index],
						     depth + 1);
			}
		}
		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_FORMAT_UINT64(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);

		acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
		acpi_os_printf("\n");
		break;

	case ACPI_TYPE_LOCAL_BANK_FIELD:

		acpi_os_printf("bank_field\n");
		break;

	case ACPI_TYPE_LOCAL_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_ex_dump_operand(obj_desc->field.region_obj, depth + 1);
		break;

	case ACPI_TYPE_LOCAL_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_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj)
			!= ACPI_TYPE_BUFFER) {
			acpi_os_printf("*not a Buffer* \n");
		} else {
			acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj,
					     depth + 1);
		}
		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:

		acpi_os_printf("Mutex\n");
		break;

	case ACPI_TYPE_DEVICE:

		acpi_os_printf("Device\n");
		break;

	case ACPI_TYPE_POWER:

		acpi_os_printf("Power\n");
		break;

	case ACPI_TYPE_PROCESSOR:

		acpi_os_printf("Processor\n");
		break;

	case ACPI_TYPE_THERMAL:

		acpi_os_printf("Thermal\n");
		break;

	default:
		/* Unknown Type */

		acpi_os_printf("Unknown Type %X\n",
			       ACPI_GET_OBJECT_TYPE(obj_desc));
		break;
	}

	return;
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_operands
 *
 * PARAMETERS:  Operands            - Operand list
 *              interpreter_mode    - Load or Exec
 *              Ident               - Identification
 *              num_levels          - # of stack entries to dump above line
 *              Note                - Output notation
 *              module_name         - Caller's module name
 *              line_number         - Caller's invocation line number
 *
 * DESCRIPTION: Dump the object stack
 *
 ******************************************************************************/

void
acpi_ex_dump_operands(union acpi_operand_object **operands,
		      acpi_interpreter_mode interpreter_mode,
		      char *ident,
		      u32 num_levels,
		      char *note, char *module_name, u32 line_number)
{
	acpi_native_uint i;

	ACPI_FUNCTION_NAME("ex_dump_operands");

	if (!ident) {
		ident = "?";
	}

	if (!note) {
		note = "?";
	}

	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
			  "************* Operand Stack Contents (Opcode [%s], %d Operands)\n",
			  ident, num_levels));

	if (num_levels == 0) {
		num_levels = 1;
	}

	/* Dump the operand stack starting at the top */

	for (i = 0; num_levels > 0; i--, num_levels--) {
		acpi_ex_dump_operand(operands[i], 0);
	}

	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
			  "************* Operand Stack dump from %s(%d), %s\n",
			  module_name, line_number, note));
	return;
}

#ifdef ACPI_FUTURE_USAGE
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_out* functions
 *
 * PARAMETERS:  Title               - Descriptive text
 *              Value               - Value to be displayed
 *
 * DESCRIPTION: Object dump output formatting functions.  These functions
 *              reduce the number of format strings required and keeps them
 *              all in one place for easy modification.
 *
 ******************************************************************************/

static void acpi_ex_out_string(char *title, char *value)
{
	acpi_os_printf("%20s : %s\n", title, value);
}

static void acpi_ex_out_pointer(char *title, void *value)
{
	acpi_os_printf("%20s : %p\n", title, value);
}

static void acpi_ex_out_integer(char *title, u32 value)
{
	acpi_os_printf("%20s : %.2X\n", title, value);
}

static void acpi_ex_out_address(char *title, acpi_physical_address value)
{

#if ACPI_MACHINE_WIDTH == 16
	acpi_os_printf("%20s : %p\n", title, value);
#else
	acpi_os_printf("%20s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
#endif
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_node
 *
 * PARAMETERS:  *Node               - Descriptor to dump
 *              Flags               - Force display if TRUE
 *
 * DESCRIPTION: Dumps the members of the given.Node
 *
 ******************************************************************************/

void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
{

	ACPI_FUNCTION_ENTRY();

	if (!flags) {
		if (!
		    ((ACPI_LV_OBJECTS & acpi_dbg_level)
		     && (_COMPONENT & acpi_dbg_layer))) {
			return;
		}
	}

	acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node));
	acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type));
	acpi_ex_out_integer("Flags", node->flags);
	acpi_ex_out_integer("Owner Id", node->owner_id);
	acpi_ex_out_integer("Reference Count", node->reference_count);
	acpi_ex_out_pointer("Attached Object",
			    acpi_ns_get_attached_object(node));
	acpi_ex_out_pointer("child_list", node->child);
	acpi_ex_out_pointer("next_peer", node->peer);
	acpi_ex_out_pointer("Parent", acpi_ns_get_parent_node(node));
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_reference
 *
 * PARAMETERS:  Object              - Descriptor to dump
 *
 * DESCRIPTION: Dumps a reference object
 *
 ******************************************************************************/

static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
{
	struct acpi_buffer ret_buf;
	acpi_status status;

	if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) {
		acpi_os_printf("Named Object %p ", obj_desc->reference.node);
		ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
		status =
		    acpi_ns_handle_to_pathname(obj_desc->reference.node,
					       &ret_buf);
		if (ACPI_FAILURE(status)) {
			acpi_os_printf("Could not convert name to pathname\n");
		} else {
			acpi_os_printf("%s\n", (char *)ret_buf.pointer);
			ACPI_MEM_FREE(ret_buf.pointer);
		}
	} else if (obj_desc->reference.object) {
		acpi_os_printf("\nReferenced Object: %p\n",
			       obj_desc->reference.object);
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_package
 *
 * PARAMETERS:  Object              - Descriptor to dump
 *              Level               - Indentation Level
 *              Index               - Package index for this object
 *
 * DESCRIPTION: Dumps the elements of the package
 *
 ******************************************************************************/

static void
acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
{
	u32 i;

	/* Indentation and index output */

	if (level > 0) {
		for (i = 0; i < level; i++) {
			acpi_os_printf(" ");
		}

		acpi_os_printf("[%.2d] ", index);
	}

	acpi_os_printf("%p ", obj_desc);

	/* Null package elements are allowed */

	if (!obj_desc) {
		acpi_os_printf("[Null Object]\n");
		return;
	}

	/* Packages may only contain a few object types */

	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
	case ACPI_TYPE_INTEGER:

		acpi_os_printf("[Integer] = %8.8X%8.8X\n",
			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
		break;

	case ACPI_TYPE_STRING:

		acpi_os_printf("[String] Value: ");
		for (i = 0; i < obj_desc->string.length; i++) {
			acpi_os_printf("%c", obj_desc->string.pointer[i]);
		}
		acpi_os_printf("\n");
		break;

	case ACPI_TYPE_BUFFER:

		acpi_os_printf("[Buffer] Length %.2X = ",
			       obj_desc->buffer.length);
		if (obj_desc->buffer.length) {
			acpi_ut_dump_buffer((u8 *) obj_desc->buffer.pointer,
					    obj_desc->buffer.length,
					    DB_DWORD_DISPLAY, _COMPONENT);
		} else {
			acpi_os_printf("\n");
		}
		break;

	case ACPI_TYPE_PACKAGE:

		acpi_os_printf("[Package] Contains %d Elements: \n",
			       obj_desc->package.count);

		for (i = 0; i < obj_desc->package.count; i++) {
			acpi_ex_dump_package(obj_desc->package.elements[i],
					     level + 1, i);
		}
		break;

	case ACPI_TYPE_LOCAL_REFERENCE:

		acpi_os_printf("[Object Reference] ");
		acpi_ex_dump_reference(obj_desc);
		break;

	default:

		acpi_os_printf("[Unknown Type] %X\n",
			       ACPI_GET_OBJECT_TYPE(obj_desc));
		break;
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_dump_object_descriptor
 *
 * PARAMETERS:  Object              - Descriptor to dump
 *              Flags               - Force display if TRUE
 *
 * DESCRIPTION: Dumps the members of the object descriptor given.
 *
 ******************************************************************************/

void
acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
{
	ACPI_FUNCTION_TRACE("ex_dump_object_descriptor");

	if (!obj_desc) {
		return_VOID;
	}

	if (!flags) {
		if (!
		    ((ACPI_LV_OBJECTS & acpi_dbg_level)
		     && (_COMPONENT & acpi_dbg_layer))) {
			return_VOID;
		}
	}

	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
		acpi_ex_dump_node((struct acpi_namespace_node *)obj_desc,
				  flags);
		acpi_os_printf("\nAttached Object (%p):\n",
			       ((struct acpi_namespace_node *)obj_desc)->
			       object);
		acpi_ex_dump_object_descriptor(((struct acpi_namespace_node *)
						obj_desc)->object, flags);
		return_VOID;
	}

	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
		acpi_os_printf
		    ("ex_dump_object_descriptor: %p is not an ACPI operand object: [%s]\n",
		     obj_desc, acpi_ut_get_descriptor_name(obj_desc));
		return_VOID;
	}

	/* Common Fields */

	acpi_ex_out_string("Type", acpi_ut_get_object_type_name(obj_desc));
	acpi_ex_out_integer("Reference Count",
			    obj_desc->common.reference_count);
	acpi_ex_out_integer("Flags", obj_desc->common.flags);

	/* Object-specific Fields */

	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
	case ACPI_TYPE_INTEGER:

		acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
		break;

	case ACPI_TYPE_STRING:

		acpi_ex_out_integer("Length", obj_desc->string.length);

		acpi_os_printf("%20s : %p ", "Pointer",
			       obj_desc->string.pointer);
		acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
		acpi_os_printf("\n");
		break;

	case ACPI_TYPE_BUFFER:

		acpi_ex_out_integer("Length", obj_desc->buffer.length);
		acpi_ex_out_pointer("Pointer", obj_desc->buffer.pointer);
		ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
				 obj_desc->buffer.length);
		break;

	case ACPI_TYPE_PACKAGE:

		acpi_ex_out_integer("Flags", obj_desc->package.flags);
		acpi_ex_out_integer("Elements", obj_desc->package.count);
		acpi_ex_out_pointer("Element List", obj_desc->package.elements);

		/* Dump the package contents */

		acpi_os_printf("\nPackage Contents:\n");
		acpi_ex_dump_package(obj_desc, 0, 0);
		break;

	case ACPI_TYPE_DEVICE:

		acpi_ex_out_pointer("Handler", obj_desc->device.handler);
		acpi_ex_out_pointer("system_notify",
				    obj_desc->device.system_notify);
		acpi_ex_out_pointer("device_notify",
				    obj_desc->device.device_notify);
		break;

	case ACPI_TYPE_EVENT:

		acpi_ex_out_pointer("Semaphore", obj_desc->event.semaphore);
		break;

	case ACPI_TYPE_METHOD:

		acpi_ex_out_integer("param_count",
				    obj_desc->method.param_count);
		acpi_ex_out_integer("Concurrency",
				    obj_desc->method.concurrency);
		acpi_ex_out_pointer("Semaphore", obj_desc->method.semaphore);
		acpi_ex_out_integer("owner_id", obj_desc->method.owner_id);
		acpi_ex_out_integer("aml_length", obj_desc->method.aml_length);
		acpi_ex_out_pointer("aml_start", obj_desc->method.aml_start);
		break;

	case ACPI_TYPE_MUTEX:

		acpi_ex_out_integer("sync_level", obj_desc->mutex.sync_level);
		acpi_ex_out_pointer("owner_thread",
				    obj_desc->mutex.owner_thread);
		acpi_ex_out_integer("acquire_depth",
				    obj_desc->mutex.acquisition_depth);
		acpi_ex_out_pointer("Semaphore", obj_desc->mutex.semaphore);
		break;

	case ACPI_TYPE_REGION:

		acpi_ex_out_integer("space_id", obj_desc->region.space_id);
		acpi_ex_out_integer("Flags", obj_desc->region.flags);
		acpi_ex_out_address("Address", obj_desc->region.address);
		acpi_ex_out_integer("Length", obj_desc->region.length);
		acpi_ex_out_pointer("Handler", obj_desc->region.handler);
		acpi_ex_out_pointer("Next", obj_desc->region.next);
		break;

	case ACPI_TYPE_POWER:

		acpi_ex_out_integer("system_level",
				    obj_desc->power_resource.system_level);
		acpi_ex_out_integer("resource_order",
				    obj_desc->power_resource.resource_order);
		acpi_ex_out_pointer("system_notify",
				    obj_desc->power_resource.system_notify);
		acpi_ex_out_pointer("device_notify",
				    obj_desc->power_resource.device_notify);
		break;

	case ACPI_TYPE_PROCESSOR:

		acpi_ex_out_integer("Processor ID",
				    obj_desc->processor.proc_id);
		acpi_ex_out_integer("Length", obj_desc->processor.length);
		acpi_ex_out_address("Address",
				    (acpi_physical_address) obj_desc->processor.
				    address);
		acpi_ex_out_pointer("system_notify",
				    obj_desc->processor.system_notify);
		acpi_ex_out_pointer("device_notify",
				    obj_desc->processor.device_notify);
		acpi_ex_out_pointer("Handler", obj_desc->processor.handler);
		break;

	case ACPI_TYPE_THERMAL:

		acpi_ex_out_pointer("system_notify",
				    obj_desc->thermal_zone.system_notify);
		acpi_ex_out_pointer("device_notify",
				    obj_desc->thermal_zone.device_notify);
		acpi_ex_out_pointer("Handler", obj_desc->thermal_zone.handler);
		break;

	case ACPI_TYPE_BUFFER_FIELD:
	case ACPI_TYPE_LOCAL_REGION_FIELD:
	case ACPI_TYPE_LOCAL_BANK_FIELD:
	case ACPI_TYPE_LOCAL_INDEX_FIELD:

		acpi_ex_out_integer("field_flags",
				    obj_desc->common_field.field_flags);
		acpi_ex_out_integer("access_byte_width",
				    obj_desc->common_field.access_byte_width);
		acpi_ex_out_integer("bit_length",
				    obj_desc->common_field.bit_length);
		acpi_ex_out_integer("fld_bit_offset",
				    obj_desc->common_field.
				    start_field_bit_offset);
		acpi_ex_out_integer("base_byte_offset",
				    obj_desc->common_field.base_byte_offset);
		acpi_ex_out_pointer("parent_node", obj_desc->common_field.node);

		switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
		case ACPI_TYPE_BUFFER_FIELD:
			acpi_ex_out_pointer("buffer_obj",
					    obj_desc->buffer_field.buffer_obj);
			break;

		case ACPI_TYPE_LOCAL_REGION_FIELD:
			acpi_ex_out_pointer("region_obj",
					    obj_desc->field.region_obj);
			break;

		case ACPI_TYPE_LOCAL_BANK_FIELD:
			acpi_ex_out_integer("Value",
					    obj_desc->bank_field.value);
			acpi_ex_out_pointer("region_obj",
					    obj_desc->bank_field.region_obj);
			acpi_ex_out_pointer("bank_obj",
					    obj_desc->bank_field.bank_obj);
			break;

		case ACPI_TYPE_LOCAL_INDEX_FIELD:
			acpi_ex_out_integer("Value",
					    obj_desc->index_field.value);
			acpi_ex_out_pointer("Index",
					    obj_desc->index_field.index_obj);
			acpi_ex_out_pointer("Data",
					    obj_desc->index_field.data_obj);
			break;

		default:
			/* All object types covered above */
			break;
		}
		break;

	case ACPI_TYPE_LOCAL_REFERENCE:

		acpi_ex_out_integer("target_type",
				    obj_desc->reference.target_type);
		acpi_ex_out_string("Opcode",
				   (acpi_ps_get_opcode_info
				    (obj_desc->reference.opcode))->name);
		acpi_ex_out_integer("Offset", obj_desc->reference.offset);
		acpi_ex_out_pointer("obj_desc", obj_desc->reference.object);
		acpi_ex_out_pointer("Node", obj_desc->reference.node);
		acpi_ex_out_pointer("Where", obj_desc->reference.where);

		acpi_ex_dump_reference(obj_desc);
		break;

	case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:

		acpi_ex_out_integer("space_id",
				    obj_desc->address_space.space_id);
		acpi_ex_out_pointer("Next", obj_desc->address_space.next);
		acpi_ex_out_pointer("region_list",
				    obj_desc->address_space.region_list);
		acpi_ex_out_pointer("Node", obj_desc->address_space.node);
		acpi_ex_out_pointer("Context", obj_desc->address_space.context);
		break;

	case ACPI_TYPE_LOCAL_NOTIFY:

		acpi_ex_out_pointer("Node", obj_desc->notify.node);
		acpi_ex_out_pointer("Context", obj_desc->notify.context);
		break;

	case ACPI_TYPE_LOCAL_ALIAS:
	case ACPI_TYPE_LOCAL_METHOD_ALIAS:
	case ACPI_TYPE_LOCAL_EXTRA:
	case ACPI_TYPE_LOCAL_DATA:
	default:

		acpi_os_printf
		    ("ex_dump_object_descriptor: Display not implemented for object type %s\n",
		     acpi_ut_get_object_type_name(obj_desc));
		break;
	}

	return_VOID;
}

#endif				/*  ACPI_FUTURE_USAGE  */
#endif
