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