Some laptops return other values for working toucpads. Allow test_aux_port to
[dragonfly.git] / sys / contrib / dev / acpica-unix-20031203 / debugger / dbutils.c
1 /*******************************************************************************
2  *
3  * Module Name: dbutils - AML debugger utilities
4  *              $Revision: 65 $
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
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,
224             ACPI_UINT32_MAX);
225 }
226
227
228 /*******************************************************************************
229  *
230  * FUNCTION:    AcpiDbDumpObject
231  *
232  * PARAMETERS:  ObjDesc         - External ACPI object to dump
233  *              Level           - Nesting level.
234  *
235  * RETURN:      None
236  *
237  * DESCRIPTION: Dump the contents of an ACPI external object
238  *
239  ******************************************************************************/
240
241 void
242 AcpiDbDumpObject (
243     ACPI_OBJECT             *ObjDesc,
244     UINT32                  Level)
245 {
246     UINT32                  i;
247
248
249     if (!ObjDesc)
250     {
251         AcpiOsPrintf ("[Null Object]\n");
252         return;
253     }
254
255     for (i = 0; i < Level; i++)
256     {
257         AcpiOsPrintf ("  ");
258     }
259
260     switch (ObjDesc->Type)
261     {
262     case ACPI_TYPE_ANY:
263
264         AcpiOsPrintf ("[Object Reference] = %p\n", ObjDesc->Reference.Handle);
265         break;
266
267
268     case ACPI_TYPE_INTEGER:
269
270         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
271                     ACPI_FORMAT_UINT64 (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,
292                     ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
293         }
294         else
295         {
296             AcpiOsPrintf ("\n");
297         }
298         break;
299
300
301     case ACPI_TYPE_PACKAGE:
302
303         AcpiOsPrintf ("[Package]  Contains %d Elements: \n",
304                 ObjDesc->Package.Count);
305
306         for (i = 0; i < ObjDesc->Package.Count; i++)
307         {
308             AcpiDbDumpObject (&ObjDesc->Package.Elements[i], Level+1);
309         }
310         break;
311
312
313     case ACPI_TYPE_LOCAL_REFERENCE:
314
315         AcpiOsPrintf ("[Object Reference] = %p\n", ObjDesc->Reference.Handle);
316         break;
317
318
319     case ACPI_TYPE_PROCESSOR:
320
321         AcpiOsPrintf ("[Processor]\n");
322         break;
323
324
325     case ACPI_TYPE_POWER:
326
327         AcpiOsPrintf ("[Power Resource]\n");
328         break;
329
330
331     default:
332
333         AcpiOsPrintf ("[Unknown Type] %X \n", ObjDesc->Type);
334         break;
335     }
336 }
337
338
339 /*******************************************************************************
340  *
341  * FUNCTION:    AcpiDbPrepNamestring
342  *
343  * PARAMETERS:  Name            - String to prepare
344  *
345  * RETURN:      None
346  *
347  * DESCRIPTION: Translate all forward slashes and dots to backslashes.
348  *
349  ******************************************************************************/
350
351 void
352 AcpiDbPrepNamestring (
353     char                    *Name)
354 {
355
356
357     if (!Name)
358     {
359         return;
360     }
361
362     ACPI_STRUPR (Name);
363
364     /* Convert a leading forward slash to a backslash */
365
366     if (*Name == '/')
367     {
368         *Name = '\\';
369     }
370
371     /* Ignore a leading backslash, this is the root prefix */
372
373     if (*Name == '\\')
374     {
375         Name++;
376     }
377
378     /* Convert all slash path separators to dots */
379
380     while (*Name)
381     {
382         if ((*Name == '/') ||
383             (*Name == '\\'))
384         {
385             *Name = '.';
386         }
387
388         Name++;
389     }
390 }
391
392
393 /*******************************************************************************
394  *
395  * FUNCTION:    AcpiDbSecondPassParse
396  *
397  * PARAMETERS:  Root            - Root of the parse tree
398  *
399  * RETURN:      Status
400  *
401  * DESCRIPTION: Second pass parse of the ACPI tables.  We need to wait until
402  *              second pass to parse the control methods
403  *
404  ******************************************************************************/
405
406 ACPI_STATUS
407 AcpiDbSecondPassParse (
408     ACPI_PARSE_OBJECT       *Root)
409 {
410     ACPI_PARSE_OBJECT       *Op = Root;
411     ACPI_PARSE_OBJECT       *Method;
412     ACPI_PARSE_OBJECT       *SearchOp;
413     ACPI_PARSE_OBJECT       *StartOp;
414     ACPI_STATUS             Status = AE_OK;
415     UINT32                  BaseAmlOffset;
416     ACPI_WALK_STATE         *WalkState;
417
418
419     ACPI_FUNCTION_ENTRY ();
420
421
422     AcpiOsPrintf ("Pass two parse ....\n");
423
424     while (Op)
425     {
426         if (Op->Common.AmlOpcode == AML_METHOD_OP)
427         {
428             Method = Op;
429
430             /* Create a new walk state for the parse */
431
432             WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
433             if (!WalkState)
434             {
435                 return (AE_NO_MEMORY);
436             }
437
438             /* Init the Walk State */
439
440             WalkState->ParserState.Aml          =
441             WalkState->ParserState.AmlStart     = Method->Named.Data;
442             WalkState->ParserState.AmlEnd       =
443             WalkState->ParserState.PkgEnd       = Method->Named.Data + Method->Named.Length;
444             WalkState->ParserState.StartScope   = Op;
445
446             WalkState->DescendingCallback       = AcpiDsLoad1BeginOp;
447             WalkState->AscendingCallback        = AcpiDsLoad1EndOp;
448
449             /* Perform the AML parse */
450
451             Status = AcpiPsParseAml (WalkState);
452
453             BaseAmlOffset = (Method->Common.Value.Arg)->Common.AmlOffset + 1;
454             StartOp = (Method->Common.Value.Arg)->Common.Next;
455             SearchOp = StartOp;
456
457             while (SearchOp)
458             {
459                 SearchOp->Common.AmlOffset += BaseAmlOffset;
460                 SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
461             }
462         }
463
464         if (Op->Common.AmlOpcode == AML_REGION_OP)
465         {
466             /* TBD: [Investigate] this isn't quite the right thing to do! */
467             /*
468              *
469              * Method = (ACPI_DEFERRED_OP *) Op;
470              * Status = AcpiPsParseAml (Op, Method->Body, Method->BodyLength);
471              */
472         }
473
474         if (ACPI_FAILURE (Status))
475         {
476             break;
477         }
478
479         Op = AcpiPsGetDepthNext (Root, Op);
480     }
481
482     return (Status);
483 }
484
485
486 /*******************************************************************************
487  *
488  * FUNCTION:    AcpiDbLocalNsLookup
489  *
490  * PARAMETERS:  Name            - Name to lookup
491  *
492  * RETURN:      Pointer to a namespace node
493  *
494  * DESCRIPTION: Lookup a name in the ACPI namespace
495  *
496  * Note: Currently begins search from the root.  Could be enhanced to use
497  * the current prefix (scope) node as the search beginning point.
498  *
499  ******************************************************************************/
500
501 ACPI_NAMESPACE_NODE *
502 AcpiDbLocalNsLookup (
503     char                    *Name)
504 {
505     char                    *InternalPath;
506     ACPI_STATUS             Status;
507     ACPI_NAMESPACE_NODE     *Node = NULL;
508
509
510     AcpiDbPrepNamestring (Name);
511
512     /* Build an internal namestring */
513
514     Status = AcpiNsInternalizeName (Name, &InternalPath);
515     if (ACPI_FAILURE (Status))
516     {
517         AcpiOsPrintf ("Invalid namestring: %s\n", Name);
518         return (NULL);
519     }
520
521     /*
522      * Lookup the name.
523      * (Uses root node as the search starting point)
524      */
525     Status = AcpiNsLookup (NULL, InternalPath, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
526                     ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
527     if (ACPI_FAILURE (Status))
528     {
529         AcpiOsPrintf ("Could not locate name: %s %s\n",
530                 Name, AcpiFormatException (Status));
531     }
532
533     ACPI_MEM_FREE (InternalPath);
534     return (Node);
535 }
536
537
538 #endif /* ACPI_DEBUGGER */
539
540