Import acpica-20050211 from Intel.
[dragonfly.git] / sys / contrib / dev / acpica-unix-20050211 / debugger / dbutils.c
1 /*******************************************************************************
2  *
3  * Module Name: dbutils - AML debugger utilities
4  *              $Revision: 69 $
5  *
6  ******************************************************************************/
7
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
13  * All rights reserved.
14  *
15  * 2. License
16  *
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
20  * property rights.
21  *
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
28  *
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;
37  *
38  * The above copyright and patent license is granted only if the following
39  * conditions are met:
40  *
41  * 3. Conditions
42  *
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.
54  *
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
65  * make.
66  *
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
71  * distribution.
72  *
73  * 3.4. Intel retains all right, title, and interest in and to the Original
74  * Intel Code.
75  *
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.
80  *
81  * 4. Disclaimer and Export Compliance
82  *
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
89  * PARTICULAR PURPOSE.
90  *
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
98  * LIMITED REMEDY.
99  *
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.
114  *
115  *****************************************************************************/
116
117
118 #include "acpi.h"
119 #include "acparser.h"
120 #include "amlcode.h"
121 #include "acnamesp.h"
122 #include "acdebug.h"
123 #include "acdispat.h"
124 #include "acdisasm.h"
125
126
127 #ifdef ACPI_DEBUGGER
128
129 #define _COMPONENT          ACPI_CA_DEBUGGER
130         ACPI_MODULE_NAME    ("dbutils")
131
132
133 /*******************************************************************************
134  *
135  * FUNCTION:    AcpiDbMatchArgument
136  *
137  * PARAMETERS:  UserArgument            - User command line
138  *              Arguments               - Array of commands to match against
139  *
140  * RETURN:      Index into command array or ACPI_TYPE_NOT_FOUND if not found
141  *
142  * DESCRIPTION: Search command array for a command match
143  *
144  ******************************************************************************/
145
146 ACPI_OBJECT_TYPE
147 AcpiDbMatchArgument (
148     char                    *UserArgument,
149     ARGUMENT_INFO           *Arguments)
150 {
151     UINT32                  i;
152
153
154     if (!UserArgument || UserArgument[0] == 0)
155     {
156         return (ACPI_TYPE_NOT_FOUND);
157     }
158
159     for (i = 0; Arguments[i].Name; i++)
160     {
161         if (ACPI_STRSTR (Arguments[i].Name, UserArgument) == Arguments[i].Name)
162         {
163             return (i);
164         }
165     }
166
167     /* Argument not recognized */
168
169     return (ACPI_TYPE_NOT_FOUND);
170 }
171
172
173 /*******************************************************************************
174  *
175  * FUNCTION:    AcpiDbSetOutputDestination
176  *
177  * PARAMETERS:  OutputFlags         - Current flags word
178  *
179  * RETURN:      None
180  *
181  * DESCRIPTION: Set the current destination for debugger output.  Alos sets
182  *              the debug output level accordingly.
183  *
184  ******************************************************************************/
185
186 void
187 AcpiDbSetOutputDestination (
188     UINT32                  OutputFlags)
189 {
190
191     AcpiGbl_DbOutputFlags = (UINT8) OutputFlags;
192
193     if ((OutputFlags & ACPI_DB_REDIRECTABLE_OUTPUT) && AcpiGbl_DbOutputToFile)
194     {
195         AcpiDbgLevel = AcpiGbl_DbDebugLevel;
196     }
197     else
198     {
199         AcpiDbgLevel = AcpiGbl_DbConsoleDebugLevel;
200     }
201 }
202
203
204 /*******************************************************************************
205  *
206  * FUNCTION:    AcpiDbDumpBuffer
207  *
208  * PARAMETERS:  Address             - Pointer to the buffer
209  *
210  * RETURN:      None
211  *
212  * DESCRIPTION: Print a portion of a buffer
213  *
214  ******************************************************************************/
215
216 void
217 AcpiDbDumpBuffer (
218     UINT32                  Address)
219 {
220
221     AcpiOsPrintf ("\nLocation %X:\n", Address);
222
223     AcpiDbgLevel |= ACPI_LV_TABLES;
224     AcpiUtDumpBuffer (ACPI_TO_POINTER (Address), 64, DB_BYTE_DISPLAY,
225             ACPI_UINT32_MAX);
226 }
227
228
229 /*******************************************************************************
230  *
231  * FUNCTION:    AcpiDbDumpObject
232  *
233  * PARAMETERS:  ObjDesc         - External ACPI object to dump
234  *              Level           - Nesting level.
235  *
236  * RETURN:      None
237  *
238  * DESCRIPTION: Dump the contents of an ACPI external object
239  *
240  ******************************************************************************/
241
242 void
243 AcpiDbDumpObject (
244     ACPI_OBJECT             *ObjDesc,
245     UINT32                  Level)
246 {
247     UINT32                  i;
248
249
250     if (!ObjDesc)
251     {
252         AcpiOsPrintf ("[Null Object]\n");
253         return;
254     }
255
256     for (i = 0; i < Level; i++)
257     {
258         AcpiOsPrintf ("  ");
259     }
260
261     switch (ObjDesc->Type)
262     {
263     case ACPI_TYPE_ANY:
264
265         AcpiOsPrintf ("[Object Reference] = ", ObjDesc->Reference.Handle);
266         AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
267         break;
268
269
270     case ACPI_TYPE_INTEGER:
271
272         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
273                     ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
274         break;
275
276
277     case ACPI_TYPE_STRING:
278
279         AcpiOsPrintf ("[String]  Value: ");
280         for (i = 0; i < ObjDesc->String.Length; i++)
281         {
282             AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
283         }
284         AcpiOsPrintf ("\n");
285         break;
286
287
288     case ACPI_TYPE_BUFFER:
289
290         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
291         if (ObjDesc->Buffer.Length)
292         {
293             AcpiUtDumpBuffer ((UINT8 *) ObjDesc->Buffer.Pointer,
294                     ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
295         }
296         else
297         {
298             AcpiOsPrintf ("\n");
299         }
300         break;
301
302
303     case ACPI_TYPE_PACKAGE:
304
305         AcpiOsPrintf ("[Package]  Contains %d Elements: \n",
306                 ObjDesc->Package.Count);
307
308         for (i = 0; i < ObjDesc->Package.Count; i++)
309         {
310             AcpiDbDumpObject (&ObjDesc->Package.Elements[i], Level+1);
311         }
312         break;
313
314
315     case ACPI_TYPE_LOCAL_REFERENCE:
316
317         AcpiOsPrintf ("[Object Reference] = ", ObjDesc->Reference.Handle);
318         AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
319         break;
320
321
322     case ACPI_TYPE_PROCESSOR:
323
324         AcpiOsPrintf ("[Processor]\n");
325         break;
326
327
328     case ACPI_TYPE_POWER:
329
330         AcpiOsPrintf ("[Power Resource]\n");
331         break;
332
333
334     default:
335
336         AcpiOsPrintf ("[Unknown Type] %X \n", ObjDesc->Type);
337         break;
338     }
339 }
340
341
342 /*******************************************************************************
343  *
344  * FUNCTION:    AcpiDbPrepNamestring
345  *
346  * PARAMETERS:  Name            - String to prepare
347  *
348  * RETURN:      None
349  *
350  * DESCRIPTION: Translate all forward slashes and dots to backslashes.
351  *
352  ******************************************************************************/
353
354 void
355 AcpiDbPrepNamestring (
356     char                    *Name)
357 {
358
359
360     if (!Name)
361     {
362         return;
363     }
364
365     ACPI_STRUPR (Name);
366
367     /* Convert a leading forward slash to a backslash */
368
369     if (*Name == '/')
370     {
371         *Name = '\\';
372     }
373
374     /* Ignore a leading backslash, this is the root prefix */
375
376     if (*Name == '\\')
377     {
378         Name++;
379     }
380
381     /* Convert all slash path separators to dots */
382
383     while (*Name)
384     {
385         if ((*Name == '/') ||
386             (*Name == '\\'))
387         {
388             *Name = '.';
389         }
390
391         Name++;
392     }
393 }
394
395
396 /*******************************************************************************
397  *
398  * FUNCTION:    AcpiDbSecondPassParse
399  *
400  * PARAMETERS:  Root            - Root of the parse tree
401  *
402  * RETURN:      Status
403  *
404  * DESCRIPTION: Second pass parse of the ACPI tables.  We need to wait until
405  *              second pass to parse the control methods
406  *
407  ******************************************************************************/
408
409 ACPI_STATUS
410 AcpiDbSecondPassParse (
411     ACPI_PARSE_OBJECT       *Root)
412 {
413     ACPI_PARSE_OBJECT       *Op = Root;
414     ACPI_PARSE_OBJECT       *Method;
415     ACPI_PARSE_OBJECT       *SearchOp;
416     ACPI_PARSE_OBJECT       *StartOp;
417     ACPI_STATUS             Status = AE_OK;
418     UINT32                  BaseAmlOffset;
419     ACPI_WALK_STATE         *WalkState;
420
421
422     ACPI_FUNCTION_ENTRY ();
423
424
425     AcpiOsPrintf ("Pass two parse ....\n");
426
427     while (Op)
428     {
429         if (Op->Common.AmlOpcode == AML_METHOD_OP)
430         {
431             Method = Op;
432
433             /* Create a new walk state for the parse */
434
435             WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
436             if (!WalkState)
437             {
438                 return (AE_NO_MEMORY);
439             }
440
441             /* Init the Walk State */
442
443             WalkState->ParserState.Aml          =
444             WalkState->ParserState.AmlStart     = Method->Named.Data;
445             WalkState->ParserState.AmlEnd       =
446             WalkState->ParserState.PkgEnd       = Method->Named.Data + Method->Named.Length;
447             WalkState->ParserState.StartScope   = Op;
448
449             WalkState->DescendingCallback       = AcpiDsLoad1BeginOp;
450             WalkState->AscendingCallback        = AcpiDsLoad1EndOp;
451
452             /* Perform the AML parse */
453
454             Status = AcpiPsParseAml (WalkState);
455
456             BaseAmlOffset = (Method->Common.Value.Arg)->Common.AmlOffset + 1;
457             StartOp = (Method->Common.Value.Arg)->Common.Next;
458             SearchOp = StartOp;
459
460             while (SearchOp)
461             {
462                 SearchOp->Common.AmlOffset += BaseAmlOffset;
463                 SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
464             }
465         }
466
467         if (Op->Common.AmlOpcode == AML_REGION_OP)
468         {
469             /* TBD: [Investigate] this isn't quite the right thing to do! */
470             /*
471              *
472              * Method = (ACPI_DEFERRED_OP *) Op;
473              * Status = AcpiPsParseAml (Op, Method->Body, Method->BodyLength);
474              */
475         }
476
477         if (ACPI_FAILURE (Status))
478         {
479             break;
480         }
481
482         Op = AcpiPsGetDepthNext (Root, Op);
483     }
484
485     return (Status);
486 }
487
488
489 /*******************************************************************************
490  *
491  * FUNCTION:    AcpiDbLocalNsLookup
492  *
493  * PARAMETERS:  Name            - Name to lookup
494  *
495  * RETURN:      Pointer to a namespace node
496  *
497  * DESCRIPTION: Lookup a name in the ACPI namespace
498  *
499  * Note: Currently begins search from the root.  Could be enhanced to use
500  * the current prefix (scope) node as the search beginning point.
501  *
502  ******************************************************************************/
503
504 ACPI_NAMESPACE_NODE *
505 AcpiDbLocalNsLookup (
506     char                    *Name)
507 {
508     char                    *InternalPath;
509     ACPI_STATUS             Status;
510     ACPI_NAMESPACE_NODE     *Node = NULL;
511
512
513     AcpiDbPrepNamestring (Name);
514
515     /* Build an internal namestring */
516
517     Status = AcpiNsInternalizeName (Name, &InternalPath);
518     if (ACPI_FAILURE (Status))
519     {
520         AcpiOsPrintf ("Invalid namestring: %s\n", Name);
521         return (NULL);
522     }
523
524     /*
525      * Lookup the name.
526      * (Uses root node as the search starting point)
527      */
528     Status = AcpiNsLookup (NULL, InternalPath, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
529                     ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
530     if (ACPI_FAILURE (Status))
531     {
532         AcpiOsPrintf ("Could not locate name: %s %s\n",
533                 Name, AcpiFormatException (Status));
534     }
535
536     ACPI_MEM_FREE (InternalPath);
537     return (Node);
538 }
539
540
541 #endif /* ACPI_DEBUGGER */
542
543