1 /*******************************************************************************
3 * Module Name: dmresrc.c - Resource Descriptor disassembly
6 ******************************************************************************/
8 /******************************************************************************
12 * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
13 * All rights reserved.
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights. You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code. No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
38 * The above copyright and patent license is granted only if the following
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision. In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change. Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee. Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution. In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
73 * 3.4. Intel retains all right, title, and interest in and to the Original
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
81 * 4. Disclaimer and Export Compliance
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government. In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
115 *****************************************************************************/
118 #include <contrib/dev/acpica/acpi.h>
119 #include <contrib/dev/acpica/amlcode.h>
120 #include <contrib/dev/acpica/acdisasm.h>
122 #ifdef ACPI_DISASSEMBLER
124 #define _COMPONENT ACPI_CA_DEBUGGER
125 ACPI_MODULE_NAME ("dbresrc")
128 /* Dispatch tables for Resource disassembly functions */
131 void (*ACPI_RESOURCE_HANDLER) (
132 AML_RESOURCE *Resource,
136 static ACPI_RESOURCE_HANDLER AcpiGbl_SmResourceDispatch [] =
138 NULL, /* 0x00, Reserved */
139 NULL, /* 0x01, Reserved */
140 NULL, /* 0x02, Reserved */
141 NULL, /* 0x03, Reserved */
142 AcpiDmIrqDescriptor, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
143 AcpiDmDmaDescriptor, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
144 AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
145 AcpiDmEndDependentDescriptor, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
146 AcpiDmIoDescriptor, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
147 AcpiDmFixedIoDescriptor, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
148 NULL, /* 0x0A, Reserved */
149 NULL, /* 0x0B, Reserved */
150 NULL, /* 0x0C, Reserved */
151 NULL, /* 0x0D, Reserved */
152 AcpiDmVendorSmallDescriptor, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
153 NULL /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
156 static ACPI_RESOURCE_HANDLER AcpiGbl_LgResourceDispatch [] =
158 NULL, /* 0x00, Reserved */
159 AcpiDmMemory24Descriptor, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
160 AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
161 NULL, /* 0x03, Reserved */
162 AcpiDmVendorLargeDescriptor, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
163 AcpiDmMemory32Descriptor, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
164 AcpiDmFixedMemory32Descriptor, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
165 AcpiDmDwordDescriptor, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
166 AcpiDmWordDescriptor, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
167 AcpiDmInterruptDescriptor, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
168 AcpiDmQwordDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
169 AcpiDmExtendedDescriptor /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
173 /* Local prototypes */
175 static ACPI_RESOURCE_HANDLER
176 AcpiDmGetResourceHandler (
180 /*******************************************************************************
182 * FUNCTION: AcpiDmDumpInteger*
184 * PARAMETERS: Value - Value to emit
185 * Name - Associated name (emitted as a comment)
189 * DESCRIPTION: Integer output helper functions
191 ******************************************************************************/
198 AcpiOsPrintf ("0x%2.2X, // %s\n", Value, Name);
202 AcpiDmDumpInteger16 (
206 AcpiOsPrintf ("0x%4.4X, // %s\n", Value, Name);
210 AcpiDmDumpInteger32 (
214 AcpiOsPrintf ("0x%8.8X, // %s\n", Value, Name);
218 AcpiDmDumpInteger64 (
222 AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n",
223 ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Value)), Name);
227 /*******************************************************************************
229 * FUNCTION: AcpiDmGetResourceHandler
231 * PARAMETERS: ResourceType - Byte 0 of a resource descriptor
233 * RETURN: Pointer to the resource conversion handler. NULL is returned
234 * if the ResourceType is invalid.
236 * DESCRIPTION: Return the handler associated with this resource type.
237 * May also be used to validate a ResourceType.
239 ******************************************************************************/
241 static ACPI_RESOURCE_HANDLER
242 AcpiDmGetResourceHandler (
245 ACPI_FUNCTION_ENTRY ();
248 /* Determine if this is a small or large resource */
250 if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
252 /* Large Resource Type -- bits 6:0 contain the name */
254 if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
259 return (AcpiGbl_LgResourceDispatch [
260 (ResourceType & ACPI_RESOURCE_NAME_LARGE_MASK)]);
264 /* Small Resource Type -- bits 6:3 contain the name */
266 return (AcpiGbl_SmResourceDispatch [
267 ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3)]);
272 /*******************************************************************************
274 * FUNCTION: AcpiDmBitList
276 * PARAMETERS: Mask - 16-bit value corresponding to 16 interrupt
281 * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels.
283 ******************************************************************************/
290 BOOLEAN Previous = FALSE;
293 /* Open the initializer list */
297 /* Examine each bit */
299 for (i = 0; i < 16; i++)
301 /* Only interested in bits that are set to 1 */
310 AcpiOsPrintf ("%d", i);
318 AcpiOsPrintf ("}\n");
322 /*******************************************************************************
324 * FUNCTION: AcpiDmResourceTemplate
326 * PARAMETERS: Info - Curent parse tree walk info
327 * ByteData - Pointer to the byte list data
328 * ByteCount - Length of the byte list
332 * DESCRIPTION: Dump the contents of a Resource Template containing a set of
333 * Resource Descriptors.
335 ******************************************************************************/
338 AcpiDmResourceTemplate (
339 ACPI_OP_WALK_INFO *Info,
343 ACPI_NATIVE_UINT CurrentByteOffset;
345 UINT32 ResourceLength;
346 void *DescriptorBody;
348 BOOLEAN DependentFns = FALSE;
349 ACPI_RESOURCE_HANDLER Handler;
354 for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount; )
356 /* Get the descriptor type and length */
358 DescriptorBody = &ByteData[CurrentByteOffset];
360 ResourceType = AcpiUtGetResourceType (DescriptorBody);
361 ResourceLength = AcpiUtGetResourceLength (DescriptorBody);
363 /* Point to next descriptor */
365 CurrentByteOffset += AcpiUtGetDescriptorLength (DescriptorBody);
367 /* Descriptor pre-processing */
369 switch (ResourceType)
371 case ACPI_RESOURCE_NAME_START_DEPENDENT:
373 /* Finish a previous StartDependentFns */
378 AcpiDmIndent (Level);
379 AcpiOsPrintf ("}\n");
383 case ACPI_RESOURCE_NAME_END_DEPENDENT:
386 DependentFns = FALSE;
389 case ACPI_RESOURCE_NAME_END_TAG:
391 /* Normal exit, the resource list is finished */
396 * Close an open StartDependentDescriptor. This indicates a
397 * missing EndDependentDescriptor.
400 DependentFns = FALSE;
402 /* Go ahead and insert EndDependentFn() */
404 AcpiDmEndDependentDescriptor (DescriptorBody, ResourceLength, Level);
406 AcpiDmIndent (Level);
408 "/*** Disassembler: inserted missing EndDependentFn () ***/\n");
416 /* Get the handler associated with this Descriptor Type */
418 Handler = AcpiDmGetResourceHandler (ResourceType);
422 * Invalid Descriptor Type.
424 * Since the entire resource buffer has been previously walked and
425 * validated, this is a very serious error indicating that someone
426 * overwrote the buffer.
428 AcpiOsPrintf ("/*** Unknown Resource type (%X) ***/\n", ResourceType);
432 /* Disassemble the resource structure */
434 Handler (DescriptorBody, ResourceLength, Level);
436 /* Descriptor post-processing */
438 if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT)
447 /*******************************************************************************
449 * FUNCTION: AcpiDmIsResourceTemplate
451 * PARAMETERS: Op - Buffer Op to be examined
453 * RETURN: TRUE if this Buffer Op contains a valid resource
456 * DESCRIPTION: Walk a byte list to determine if it consists of a valid set
457 * of resource descriptors. Nothing is output.
459 ******************************************************************************/
462 AcpiDmIsResourceTemplate (
463 ACPI_PARSE_OBJECT *Op)
467 ACPI_PARSE_OBJECT *NextOp;
468 ACPI_NATIVE_UINT CurrentByteOffset;
470 void *DescriptorBody;
473 /* This op must be a buffer */
475 if (Op->Common.AmlOpcode != AML_BUFFER_OP)
480 /* Get to the ByteData list */
482 NextOp = Op->Common.Value.Arg;
483 NextOp = NextOp->Common.Next;
489 /* Extract the data pointer and data length */
491 ByteCount = (UINT32) NextOp->Common.Value.Integer;
492 ByteData = NextOp->Named.Data;
495 * The absolute minimum resource template is an END_TAG (2 bytes),
496 * and the list must be terminated by a valid 2-byte END_TAG
498 if ((ByteCount < 2) ||
499 (ByteData[ByteCount - 2] != (ACPI_RESOURCE_NAME_END_TAG | 1)))
504 /* Walk the byte list, abort on any invalid descriptor ID or length */
506 for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;)
508 /* Get the descriptor type and length */
510 DescriptorBody = &ByteData[CurrentByteOffset];
511 ResourceType = AcpiUtGetResourceType (DescriptorBody);
513 /* Point to next descriptor */
515 CurrentByteOffset += AcpiUtGetDescriptorLength (DescriptorBody);
517 /* END_TAG terminates the descriptor list */
519 if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
522 * For the resource template to be valid, one END_TAG must appear
523 * at the very end of the ByteList, not before
525 if (CurrentByteOffset != ByteCount)
531 * All resource descriptor types and lengths are valid,
532 * this list appears to be a valid resource template
537 /* Validate the resource name (must be after check for END_TAG) */
539 if (!AcpiDmGetResourceHandler (ResourceType))
545 /* Did not find an END_TAG, something seriously wrong */