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