dbnames.c revision 249663
1218585Sjkim/*******************************************************************************
2218585Sjkim *
3218585Sjkim * Module Name: dbnames - Debugger commands for the acpi namespace
4218585Sjkim *
5218585Sjkim ******************************************************************************/
6218585Sjkim
7218585Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9218585Sjkim * All rights reserved.
10218585Sjkim *
11218585Sjkim * Redistribution and use in source and binary forms, with or without
12218585Sjkim * modification, are permitted provided that the following conditions
13218585Sjkim * are met:
14218585Sjkim * 1. Redistributions of source code must retain the above copyright
15218585Sjkim *    notice, this list of conditions, and the following disclaimer,
16218585Sjkim *    without modification.
17218585Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18218585Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19218585Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20218585Sjkim *    including a substantially similar Disclaimer requirement for further
21218585Sjkim *    binary redistribution.
22218585Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23218585Sjkim *    of any contributors may be used to endorse or promote products derived
24218585Sjkim *    from this software without specific prior written permission.
25218585Sjkim *
26218585Sjkim * Alternatively, this software may be distributed under the terms of the
27218585Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28218585Sjkim * Software Foundation.
29218585Sjkim *
30218585Sjkim * NO WARRANTY
31218585Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32218585Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33218585Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34218585Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35218585Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36218585Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37218585Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38218585Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39218585Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40218585Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41218585Sjkim * POSSIBILITY OF SUCH DAMAGES.
42218585Sjkim */
43218585Sjkim
44218585Sjkim
45218590Sjkim#include <contrib/dev/acpica/include/acpi.h>
46218590Sjkim#include <contrib/dev/acpica/include/accommon.h>
47218590Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
48218590Sjkim#include <contrib/dev/acpica/include/acdebug.h>
49249112Sjkim#include <contrib/dev/acpica/include/acpredef.h>
50218585Sjkim
51218585Sjkim
52218585Sjkim#ifdef ACPI_DEBUGGER
53218585Sjkim
54218585Sjkim#define _COMPONENT          ACPI_CA_DEBUGGER
55218585Sjkim        ACPI_MODULE_NAME    ("dbnames")
56218585Sjkim
57218585Sjkim
58218585Sjkim/* Local prototypes */
59218585Sjkim
60218585Sjkimstatic ACPI_STATUS
61218585SjkimAcpiDbWalkAndMatchName (
62218585Sjkim    ACPI_HANDLE             ObjHandle,
63218585Sjkim    UINT32                  NestingLevel,
64218585Sjkim    void                    *Context,
65218585Sjkim    void                    **ReturnValue);
66218585Sjkim
67218585Sjkimstatic ACPI_STATUS
68218585SjkimAcpiDbWalkForPredefinedNames (
69218585Sjkim    ACPI_HANDLE             ObjHandle,
70218585Sjkim    UINT32                  NestingLevel,
71218585Sjkim    void                    *Context,
72218585Sjkim    void                    **ReturnValue);
73218585Sjkim
74218585Sjkimstatic ACPI_STATUS
75218585SjkimAcpiDbWalkForSpecificObjects (
76218585Sjkim    ACPI_HANDLE             ObjHandle,
77218585Sjkim    UINT32                  NestingLevel,
78218585Sjkim    void                    *Context,
79218585Sjkim    void                    **ReturnValue);
80218585Sjkim
81218585Sjkimstatic ACPI_STATUS
82218585SjkimAcpiDbIntegrityWalk (
83218585Sjkim    ACPI_HANDLE             ObjHandle,
84218585Sjkim    UINT32                  NestingLevel,
85218585Sjkim    void                    *Context,
86218585Sjkim    void                    **ReturnValue);
87218585Sjkim
88218585Sjkimstatic ACPI_STATUS
89218585SjkimAcpiDbWalkForReferences (
90218585Sjkim    ACPI_HANDLE             ObjHandle,
91218585Sjkim    UINT32                  NestingLevel,
92218585Sjkim    void                    *Context,
93218585Sjkim    void                    **ReturnValue);
94218585Sjkim
95218585Sjkimstatic ACPI_STATUS
96218585SjkimAcpiDbBusWalk (
97218585Sjkim    ACPI_HANDLE             ObjHandle,
98218585Sjkim    UINT32                  NestingLevel,
99218585Sjkim    void                    *Context,
100218585Sjkim    void                    **ReturnValue);
101218585Sjkim
102218585Sjkim/*
103218585Sjkim * Arguments for the Objects command
104218585Sjkim * These object types map directly to the ACPI_TYPES
105218585Sjkim */
106240716Sjkimstatic ACPI_DB_ARGUMENT_INFO    AcpiDbObjectTypes [] =
107218585Sjkim{
108218585Sjkim    {"ANY"},
109218585Sjkim    {"INTEGERS"},
110218585Sjkim    {"STRINGS"},
111218585Sjkim    {"BUFFERS"},
112218585Sjkim    {"PACKAGES"},
113218585Sjkim    {"FIELDS"},
114218585Sjkim    {"DEVICES"},
115218585Sjkim    {"EVENTS"},
116218585Sjkim    {"METHODS"},
117218585Sjkim    {"MUTEXES"},
118218585Sjkim    {"REGIONS"},
119218585Sjkim    {"POWERRESOURCES"},
120218585Sjkim    {"PROCESSORS"},
121218585Sjkim    {"THERMALZONES"},
122218585Sjkim    {"BUFFERFIELDS"},
123218585Sjkim    {"DDBHANDLES"},
124218585Sjkim    {"DEBUG"},
125218585Sjkim    {"REGIONFIELDS"},
126218585Sjkim    {"BANKFIELDS"},
127218585Sjkim    {"INDEXFIELDS"},
128218585Sjkim    {"REFERENCES"},
129218585Sjkim    {"ALIAS"},
130218585Sjkim    {NULL}           /* Must be null terminated */
131218585Sjkim};
132218585Sjkim
133218585Sjkim
134218585Sjkim/*******************************************************************************
135218585Sjkim *
136218585Sjkim * FUNCTION:    AcpiDbSetScope
137218585Sjkim *
138218585Sjkim * PARAMETERS:  Name                - New scope path
139218585Sjkim *
140218585Sjkim * RETURN:      Status
141218585Sjkim *
142218585Sjkim * DESCRIPTION: Set the "current scope" as maintained by this utility.
143218585Sjkim *              The scope is used as a prefix to ACPI paths.
144218585Sjkim *
145218585Sjkim ******************************************************************************/
146218585Sjkim
147218585Sjkimvoid
148218585SjkimAcpiDbSetScope (
149218585Sjkim    char                    *Name)
150218585Sjkim{
151218585Sjkim    ACPI_STATUS             Status;
152218585Sjkim    ACPI_NAMESPACE_NODE     *Node;
153218585Sjkim
154218585Sjkim
155218585Sjkim    if (!Name || Name[0] == 0)
156218585Sjkim    {
157218585Sjkim        AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
158218585Sjkim        return;
159218585Sjkim    }
160218585Sjkim
161218585Sjkim    AcpiDbPrepNamestring (Name);
162218585Sjkim
163245582Sjkim    if (ACPI_IS_ROOT_PREFIX (Name[0]))
164218585Sjkim    {
165218585Sjkim        /* Validate new scope from the root */
166218585Sjkim
167218585Sjkim        Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH,
168218585Sjkim                    &Node);
169218585Sjkim        if (ACPI_FAILURE (Status))
170218585Sjkim        {
171218585Sjkim            goto ErrorExit;
172218585Sjkim        }
173218585Sjkim
174218585Sjkim        ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
175218585Sjkim        ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
176218585Sjkim    }
177218585Sjkim    else
178218585Sjkim    {
179218585Sjkim        /* Validate new scope relative to old scope */
180218585Sjkim
181218585Sjkim        Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH,
182218585Sjkim                    &Node);
183218585Sjkim        if (ACPI_FAILURE (Status))
184218585Sjkim        {
185218585Sjkim            goto ErrorExit;
186218585Sjkim        }
187218585Sjkim
188218585Sjkim        ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
189218585Sjkim        ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
190218585Sjkim    }
191218585Sjkim
192218585Sjkim    AcpiGbl_DbScopeNode = Node;
193218585Sjkim    AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
194218585Sjkim    return;
195218585Sjkim
196218585SjkimErrorExit:
197218585Sjkim
198218585Sjkim    AcpiOsPrintf ("Could not attach scope: %s, %s\n",
199218585Sjkim        Name, AcpiFormatException (Status));
200218585Sjkim}
201218585Sjkim
202218585Sjkim
203218585Sjkim/*******************************************************************************
204218585Sjkim *
205218585Sjkim * FUNCTION:    AcpiDbDumpNamespace
206218585Sjkim *
207218585Sjkim * PARAMETERS:  StartArg        - Node to begin namespace dump
208218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
209218585Sjkim *
210218585Sjkim * RETURN:      None
211218585Sjkim *
212241973Sjkim * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
213218585Sjkim *              with type and other information.
214218585Sjkim *
215218585Sjkim ******************************************************************************/
216218585Sjkim
217218585Sjkimvoid
218218585SjkimAcpiDbDumpNamespace (
219218585Sjkim    char                    *StartArg,
220218585Sjkim    char                    *DepthArg)
221218585Sjkim{
222218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
223218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
224218585Sjkim
225218585Sjkim
226218585Sjkim    /* No argument given, just start at the root and dump entire namespace */
227218585Sjkim
228218585Sjkim    if (StartArg)
229218585Sjkim    {
230218585Sjkim        SubtreeEntry = AcpiDbConvertToNode (StartArg);
231218585Sjkim        if (!SubtreeEntry)
232218585Sjkim        {
233218585Sjkim            return;
234218585Sjkim        }
235218585Sjkim
236218585Sjkim        /* Now we can check for the depth argument */
237218585Sjkim
238218585Sjkim        if (DepthArg)
239218585Sjkim        {
240218585Sjkim            MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
241218585Sjkim        }
242218585Sjkim    }
243218585Sjkim
244218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
245218585Sjkim    AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
246218585Sjkim        ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
247218585Sjkim
248218585Sjkim    /* Display the subtree */
249218585Sjkim
250218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
251218585Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
252218585Sjkim        ACPI_OWNER_ID_MAX, SubtreeEntry);
253218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
254218585Sjkim}
255218585Sjkim
256218585Sjkim
257218585Sjkim/*******************************************************************************
258218585Sjkim *
259218585Sjkim * FUNCTION:    AcpiDbDumpNamespaceByOwner
260218585Sjkim *
261218585Sjkim * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed
262218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
263218585Sjkim *
264218585Sjkim * RETURN:      None
265218585Sjkim *
266218585Sjkim * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
267218585Sjkim *
268218585Sjkim ******************************************************************************/
269218585Sjkim
270218585Sjkimvoid
271218585SjkimAcpiDbDumpNamespaceByOwner (
272218585Sjkim    char                    *OwnerArg,
273218585Sjkim    char                    *DepthArg)
274218585Sjkim{
275218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
276218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
277218585Sjkim    ACPI_OWNER_ID           OwnerId;
278218585Sjkim
279218585Sjkim
280218585Sjkim    OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0);
281218585Sjkim
282218585Sjkim    /* Now we can check for the depth argument */
283218585Sjkim
284218585Sjkim    if (DepthArg)
285218585Sjkim    {
286218585Sjkim        MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
287218585Sjkim    }
288218585Sjkim
289218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
290218585Sjkim    AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
291218585Sjkim
292218585Sjkim    /* Display the subtree */
293218585Sjkim
294218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
295218585Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId,
296218585Sjkim        SubtreeEntry);
297218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
298218585Sjkim}
299218585Sjkim
300218585Sjkim
301218585Sjkim/*******************************************************************************
302218585Sjkim *
303218585Sjkim * FUNCTION:    AcpiDbWalkAndMatchName
304218585Sjkim *
305218585Sjkim * PARAMETERS:  Callback from WalkNamespace
306218585Sjkim *
307218585Sjkim * RETURN:      Status
308218585Sjkim *
309241973Sjkim * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
310218585Sjkim *              are supported -- '?' matches any character.
311218585Sjkim *
312218585Sjkim ******************************************************************************/
313218585Sjkim
314218585Sjkimstatic ACPI_STATUS
315218585SjkimAcpiDbWalkAndMatchName (
316218585Sjkim    ACPI_HANDLE             ObjHandle,
317218585Sjkim    UINT32                  NestingLevel,
318218585Sjkim    void                    *Context,
319218585Sjkim    void                    **ReturnValue)
320218585Sjkim{
321218585Sjkim    ACPI_STATUS             Status;
322218585Sjkim    char                    *RequestedName = (char *) Context;
323218585Sjkim    UINT32                  i;
324218585Sjkim    ACPI_BUFFER             Buffer;
325218585Sjkim    ACPI_WALK_INFO          Info;
326218585Sjkim
327218585Sjkim
328218585Sjkim    /* Check for a name match */
329218585Sjkim
330218585Sjkim    for (i = 0; i < 4; i++)
331218585Sjkim    {
332218585Sjkim        /* Wildcard support */
333218585Sjkim
334218585Sjkim        if ((RequestedName[i] != '?') &&
335218585Sjkim            (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i]))
336218585Sjkim        {
337218585Sjkim            /* No match, just exit */
338218585Sjkim
339218585Sjkim            return (AE_OK);
340218585Sjkim        }
341218585Sjkim    }
342218585Sjkim
343218585Sjkim    /* Get the full pathname to this object */
344218585Sjkim
345218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
346218585Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
347218585Sjkim    if (ACPI_FAILURE (Status))
348218585Sjkim    {
349218585Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
350218585Sjkim    }
351218585Sjkim    else
352218585Sjkim    {
353218585Sjkim        Info.OwnerId = ACPI_OWNER_ID_MAX;
354218585Sjkim        Info.DebugLevel = ACPI_UINT32_MAX;
355218585Sjkim        Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
356218585Sjkim
357218585Sjkim        AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
358218585Sjkim        (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
359218585Sjkim        ACPI_FREE (Buffer.Pointer);
360218585Sjkim    }
361218585Sjkim
362218585Sjkim    return (AE_OK);
363218585Sjkim}
364218585Sjkim
365218585Sjkim
366218585Sjkim/*******************************************************************************
367218585Sjkim *
368218585Sjkim * FUNCTION:    AcpiDbFindNameInNamespace
369218585Sjkim *
370218585Sjkim * PARAMETERS:  NameArg         - The 4-character ACPI name to find.
371218585Sjkim *                                wildcards are supported.
372218585Sjkim *
373218585Sjkim * RETURN:      None
374218585Sjkim *
375218585Sjkim * DESCRIPTION: Search the namespace for a given name (with wildcards)
376218585Sjkim *
377218585Sjkim ******************************************************************************/
378218585Sjkim
379218585SjkimACPI_STATUS
380218585SjkimAcpiDbFindNameInNamespace (
381218585Sjkim    char                    *NameArg)
382218585Sjkim{
383218585Sjkim    char                    AcpiName[5] = "____";
384218585Sjkim    char                    *AcpiNamePtr = AcpiName;
385218585Sjkim
386218585Sjkim
387218585Sjkim    if (ACPI_STRLEN (NameArg) > 4)
388218585Sjkim    {
389218585Sjkim        AcpiOsPrintf ("Name must be no longer than 4 characters\n");
390218585Sjkim        return (AE_OK);
391218585Sjkim    }
392218585Sjkim
393218585Sjkim    /* Pad out name with underscores as necessary to create a 4-char name */
394218585Sjkim
395218585Sjkim    AcpiUtStrupr (NameArg);
396218585Sjkim    while (*NameArg)
397218585Sjkim    {
398218585Sjkim        *AcpiNamePtr = *NameArg;
399218585Sjkim        AcpiNamePtr++;
400218585Sjkim        NameArg++;
401218585Sjkim    }
402218585Sjkim
403218585Sjkim    /* Walk the namespace from the root */
404218585Sjkim
405218585Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
406218585Sjkim                        AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
407218585Sjkim
408218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
409218585Sjkim    return (AE_OK);
410218585Sjkim}
411218585Sjkim
412218585Sjkim
413218585Sjkim/*******************************************************************************
414218585Sjkim *
415218585Sjkim * FUNCTION:    AcpiDbWalkForPredefinedNames
416218585Sjkim *
417218585Sjkim * PARAMETERS:  Callback from WalkNamespace
418218585Sjkim *
419218585Sjkim * RETURN:      Status
420218585Sjkim *
421218585Sjkim * DESCRIPTION: Detect and display predefined ACPI names (names that start with
422218585Sjkim *              an underscore)
423218585Sjkim *
424218585Sjkim ******************************************************************************/
425218585Sjkim
426218585Sjkimstatic ACPI_STATUS
427218585SjkimAcpiDbWalkForPredefinedNames (
428218585Sjkim    ACPI_HANDLE             ObjHandle,
429218585Sjkim    UINT32                  NestingLevel,
430218585Sjkim    void                    *Context,
431218585Sjkim    void                    **ReturnValue)
432218585Sjkim{
433218585Sjkim    ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
434218585Sjkim    UINT32                      *Count = (UINT32 *) Context;
435218585Sjkim    const ACPI_PREDEFINED_INFO  *Predefined;
436218585Sjkim    const ACPI_PREDEFINED_INFO  *Package = NULL;
437218585Sjkim    char                        *Pathname;
438249663Sjkim    char                        StringBuffer[48];
439218585Sjkim
440218585Sjkim
441249112Sjkim    Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
442218585Sjkim    if (!Predefined)
443218585Sjkim    {
444218585Sjkim        return (AE_OK);
445218585Sjkim    }
446218585Sjkim
447218585Sjkim    Pathname = AcpiNsGetExternalPathname (Node);
448218585Sjkim    if (!Pathname)
449218585Sjkim    {
450218585Sjkim        return (AE_OK);
451218585Sjkim    }
452218585Sjkim
453218585Sjkim    /* If method returns a package, the info is in the next table entry */
454218585Sjkim
455249112Sjkim    if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE)
456218585Sjkim    {
457218585Sjkim        Package = Predefined + 1;
458218585Sjkim    }
459218585Sjkim
460249663Sjkim    AcpiUtGetExpectedReturnTypes (StringBuffer,
461249112Sjkim        Predefined->Info.ExpectedBtypes);
462218585Sjkim
463249663Sjkim    AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname,
464249663Sjkim        METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList),
465249663Sjkim        StringBuffer);
466249663Sjkim
467218585Sjkim    if (Package)
468218585Sjkim    {
469249663Sjkim        AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
470218585Sjkim            Package->RetInfo.Type, Package->RetInfo.ObjectType1,
471218585Sjkim            Package->RetInfo.Count1);
472218585Sjkim    }
473218585Sjkim
474218585Sjkim    AcpiOsPrintf("\n");
475218585Sjkim
476249663Sjkim    /* Check that the declared argument count matches the ACPI spec */
477249663Sjkim
478249663Sjkim    AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined);
479249663Sjkim
480218585Sjkim    ACPI_FREE (Pathname);
481218585Sjkim    (*Count)++;
482218585Sjkim    return (AE_OK);
483218585Sjkim}
484218585Sjkim
485218585Sjkim
486218585Sjkim/*******************************************************************************
487218585Sjkim *
488218585Sjkim * FUNCTION:    AcpiDbCheckPredefinedNames
489218585Sjkim *
490218585Sjkim * PARAMETERS:  None
491218585Sjkim *
492218585Sjkim * RETURN:      None
493218585Sjkim *
494218585Sjkim * DESCRIPTION: Validate all predefined names in the namespace
495218585Sjkim *
496218585Sjkim ******************************************************************************/
497218585Sjkim
498218585Sjkimvoid
499218585SjkimAcpiDbCheckPredefinedNames (
500218585Sjkim    void)
501218585Sjkim{
502218585Sjkim    UINT32                  Count = 0;
503218585Sjkim
504218585Sjkim
505218585Sjkim    /* Search all nodes in namespace */
506218585Sjkim
507218585Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
508218585Sjkim                AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL);
509218585Sjkim
510218585Sjkim    AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
511218585Sjkim}
512218585Sjkim
513218585Sjkim
514218585Sjkim/*******************************************************************************
515218585Sjkim *
516218585Sjkim * FUNCTION:    AcpiDbWalkForSpecificObjects
517218585Sjkim *
518218585Sjkim * PARAMETERS:  Callback from WalkNamespace
519218585Sjkim *
520218585Sjkim * RETURN:      Status
521218585Sjkim *
522218585Sjkim * DESCRIPTION: Display short info about objects in the namespace
523218585Sjkim *
524218585Sjkim ******************************************************************************/
525218585Sjkim
526218585Sjkimstatic ACPI_STATUS
527218585SjkimAcpiDbWalkForSpecificObjects (
528218585Sjkim    ACPI_HANDLE             ObjHandle,
529218585Sjkim    UINT32                  NestingLevel,
530218585Sjkim    void                    *Context,
531218585Sjkim    void                    **ReturnValue)
532218585Sjkim{
533218585Sjkim    ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
534218585Sjkim    ACPI_BUFFER             Buffer;
535218585Sjkim    ACPI_STATUS             Status;
536218585Sjkim
537218585Sjkim
538218585Sjkim    Info->Count++;
539218585Sjkim
540218585Sjkim    /* Get and display the full pathname to this object */
541218585Sjkim
542218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
543218585Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
544218585Sjkim    if (ACPI_FAILURE (Status))
545218585Sjkim    {
546218585Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
547218585Sjkim        return (AE_OK);
548218585Sjkim    }
549218585Sjkim
550218585Sjkim    AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
551218585Sjkim    ACPI_FREE (Buffer.Pointer);
552218585Sjkim
553218585Sjkim    /* Dump short info about the object */
554218585Sjkim
555218585Sjkim    (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
556218585Sjkim    return (AE_OK);
557218585Sjkim}
558218585Sjkim
559218585Sjkim
560218585Sjkim/*******************************************************************************
561218585Sjkim *
562218585Sjkim * FUNCTION:    AcpiDbDisplayObjects
563218585Sjkim *
564218585Sjkim * PARAMETERS:  ObjTypeArg          - Type of object to display
565218585Sjkim *              DisplayCountArg     - Max depth to display
566218585Sjkim *
567218585Sjkim * RETURN:      None
568218585Sjkim *
569218585Sjkim * DESCRIPTION: Display objects in the namespace of the requested type
570218585Sjkim *
571218585Sjkim ******************************************************************************/
572218585Sjkim
573218585SjkimACPI_STATUS
574218585SjkimAcpiDbDisplayObjects (
575218585Sjkim    char                    *ObjTypeArg,
576218585Sjkim    char                    *DisplayCountArg)
577218585Sjkim{
578218585Sjkim    ACPI_WALK_INFO          Info;
579218585Sjkim    ACPI_OBJECT_TYPE        Type;
580218585Sjkim
581218585Sjkim
582218585Sjkim    /* Get the object type */
583218585Sjkim
584218585Sjkim    Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
585218585Sjkim    if (Type == ACPI_TYPE_NOT_FOUND)
586218585Sjkim    {
587218585Sjkim        AcpiOsPrintf ("Invalid or unsupported argument\n");
588218585Sjkim        return (AE_OK);
589218585Sjkim    }
590218585Sjkim
591218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
592218585Sjkim    AcpiOsPrintf (
593218585Sjkim        "Objects of type [%s] defined in the current ACPI Namespace:\n",
594218585Sjkim        AcpiUtGetTypeName (Type));
595218585Sjkim
596218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
597218585Sjkim
598218585Sjkim    Info.Count = 0;
599218585Sjkim    Info.OwnerId = ACPI_OWNER_ID_MAX;
600218585Sjkim    Info.DebugLevel = ACPI_UINT32_MAX;
601218585Sjkim    Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
602218585Sjkim
603218585Sjkim    /* Walk the namespace from the root */
604218585Sjkim
605218585Sjkim    (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
606218585Sjkim                AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
607218585Sjkim
608218585Sjkim    AcpiOsPrintf (
609218585Sjkim        "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
610218585Sjkim        Info.Count, AcpiUtGetTypeName (Type));
611218585Sjkim
612218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
613218585Sjkim    return (AE_OK);
614218585Sjkim}
615218585Sjkim
616218585Sjkim
617218585Sjkim/*******************************************************************************
618218585Sjkim *
619218585Sjkim * FUNCTION:    AcpiDbIntegrityWalk
620218585Sjkim *
621218585Sjkim * PARAMETERS:  Callback from WalkNamespace
622218585Sjkim *
623218585Sjkim * RETURN:      Status
624218585Sjkim *
625218585Sjkim * DESCRIPTION: Examine one NS node for valid values.
626218585Sjkim *
627218585Sjkim ******************************************************************************/
628218585Sjkim
629218585Sjkimstatic ACPI_STATUS
630218585SjkimAcpiDbIntegrityWalk (
631218585Sjkim    ACPI_HANDLE             ObjHandle,
632218585Sjkim    UINT32                  NestingLevel,
633218585Sjkim    void                    *Context,
634218585Sjkim    void                    **ReturnValue)
635218585Sjkim{
636218585Sjkim    ACPI_INTEGRITY_INFO     *Info = (ACPI_INTEGRITY_INFO *) Context;
637218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
638218585Sjkim    ACPI_OPERAND_OBJECT     *Object;
639218585Sjkim    BOOLEAN                 Alias = TRUE;
640218585Sjkim
641218585Sjkim
642218585Sjkim    Info->Nodes++;
643218585Sjkim
644218585Sjkim    /* Verify the NS node, and dereference aliases */
645218585Sjkim
646218585Sjkim    while (Alias)
647218585Sjkim    {
648218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
649218585Sjkim        {
650218585Sjkim            AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n",
651218585Sjkim                Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node),
652218585Sjkim                ACPI_DESC_TYPE_NAMED);
653218585Sjkim            return (AE_OK);
654218585Sjkim        }
655218585Sjkim
656218585Sjkim        if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
657218585Sjkim            (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
658218585Sjkim        {
659218585Sjkim            Node = (ACPI_NAMESPACE_NODE *) Node->Object;
660218585Sjkim        }
661218585Sjkim        else
662218585Sjkim        {
663218585Sjkim            Alias = FALSE;
664218585Sjkim        }
665218585Sjkim    }
666218585Sjkim
667218585Sjkim    if (Node->Type > ACPI_TYPE_LOCAL_MAX)
668218585Sjkim    {
669218585Sjkim        AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
670218585Sjkim            Node, Node->Type);
671218585Sjkim        return (AE_OK);
672218585Sjkim    }
673218585Sjkim
674218585Sjkim    if (!AcpiUtValidAcpiName (Node->Name.Integer))
675218585Sjkim    {
676218585Sjkim        AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
677218585Sjkim        return (AE_OK);
678218585Sjkim    }
679218585Sjkim
680218585Sjkim    Object = AcpiNsGetAttachedObject (Node);
681218585Sjkim    if (Object)
682218585Sjkim    {
683218585Sjkim        Info->Objects++;
684218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
685218585Sjkim        {
686218585Sjkim            AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
687218585Sjkim                Object, AcpiUtGetDescriptorName (Object));
688218585Sjkim        }
689218585Sjkim    }
690218585Sjkim
691218585Sjkim    return (AE_OK);
692218585Sjkim}
693218585Sjkim
694218585Sjkim
695218585Sjkim/*******************************************************************************
696218585Sjkim *
697218585Sjkim * FUNCTION:    AcpiDbCheckIntegrity
698218585Sjkim *
699218585Sjkim * PARAMETERS:  None
700218585Sjkim *
701218585Sjkim * RETURN:      None
702218585Sjkim *
703218585Sjkim * DESCRIPTION: Check entire namespace for data structure integrity
704218585Sjkim *
705218585Sjkim ******************************************************************************/
706218585Sjkim
707218585Sjkimvoid
708218585SjkimAcpiDbCheckIntegrity (
709218585Sjkim    void)
710218585Sjkim{
711218585Sjkim    ACPI_INTEGRITY_INFO     Info = {0,0};
712218585Sjkim
713218585Sjkim    /* Search all nodes in namespace */
714218585Sjkim
715218585Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
716218585Sjkim                    AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
717218585Sjkim
718218585Sjkim    AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
719218585Sjkim        Info.Nodes, Info.Objects);
720218585Sjkim}
721218585Sjkim
722218585Sjkim
723218585Sjkim/*******************************************************************************
724218585Sjkim *
725218585Sjkim * FUNCTION:    AcpiDbWalkForReferences
726218585Sjkim *
727218585Sjkim * PARAMETERS:  Callback from WalkNamespace
728218585Sjkim *
729218585Sjkim * RETURN:      Status
730218585Sjkim *
731218585Sjkim * DESCRIPTION: Check if this namespace object refers to the target object
732218585Sjkim *              that is passed in as the context value.
733218585Sjkim *
734218585Sjkim * Note: Currently doesn't check subobjects within the Node's object
735218585Sjkim *
736218585Sjkim ******************************************************************************/
737218585Sjkim
738218585Sjkimstatic ACPI_STATUS
739218585SjkimAcpiDbWalkForReferences (
740218585Sjkim    ACPI_HANDLE             ObjHandle,
741218585Sjkim    UINT32                  NestingLevel,
742218585Sjkim    void                    *Context,
743218585Sjkim    void                    **ReturnValue)
744218585Sjkim{
745218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc = (ACPI_OPERAND_OBJECT  *) Context;
746218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
747218585Sjkim
748218585Sjkim
749218585Sjkim    /* Check for match against the namespace node itself */
750218585Sjkim
751218585Sjkim    if (Node == (void *) ObjDesc)
752218585Sjkim    {
753218585Sjkim        AcpiOsPrintf ("Object is a Node [%4.4s]\n",
754218585Sjkim            AcpiUtGetNodeName (Node));
755218585Sjkim    }
756218585Sjkim
757218585Sjkim    /* Check for match against the object attached to the node */
758218585Sjkim
759218585Sjkim    if (AcpiNsGetAttachedObject (Node) == ObjDesc)
760218585Sjkim    {
761218585Sjkim        AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
762218585Sjkim            Node, AcpiUtGetNodeName (Node));
763218585Sjkim    }
764218585Sjkim
765218585Sjkim    return (AE_OK);
766218585Sjkim}
767218585Sjkim
768218585Sjkim
769218585Sjkim/*******************************************************************************
770218585Sjkim *
771218585Sjkim * FUNCTION:    AcpiDbFindReferences
772218585Sjkim *
773218585Sjkim * PARAMETERS:  ObjectArg       - String with hex value of the object
774218585Sjkim *
775218585Sjkim * RETURN:      None
776218585Sjkim *
777218585Sjkim * DESCRIPTION: Search namespace for all references to the input object
778218585Sjkim *
779218585Sjkim ******************************************************************************/
780218585Sjkim
781218585Sjkimvoid
782218585SjkimAcpiDbFindReferences (
783218585Sjkim    char                    *ObjectArg)
784218585Sjkim{
785218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc;
786218585Sjkim
787218585Sjkim
788218585Sjkim    /* Convert string to object pointer */
789218585Sjkim
790218585Sjkim    ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
791218585Sjkim
792218585Sjkim    /* Search all nodes in namespace */
793218585Sjkim
794218585Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
795218585Sjkim                    AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL);
796218585Sjkim}
797218585Sjkim
798218585Sjkim
799218585Sjkim/*******************************************************************************
800218585Sjkim *
801218585Sjkim * FUNCTION:    AcpiDbBusWalk
802218585Sjkim *
803218585Sjkim * PARAMETERS:  Callback from WalkNamespace
804218585Sjkim *
805218585Sjkim * RETURN:      Status
806218585Sjkim *
807218585Sjkim * DESCRIPTION: Display info about device objects that have a corresponding
808218585Sjkim *              _PRT method.
809218585Sjkim *
810218585Sjkim ******************************************************************************/
811218585Sjkim
812218585Sjkimstatic ACPI_STATUS
813218585SjkimAcpiDbBusWalk (
814218585Sjkim    ACPI_HANDLE             ObjHandle,
815218585Sjkim    UINT32                  NestingLevel,
816218585Sjkim    void                    *Context,
817218585Sjkim    void                    **ReturnValue)
818218585Sjkim{
819218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
820218585Sjkim    ACPI_STATUS             Status;
821218585Sjkim    ACPI_BUFFER             Buffer;
822218585Sjkim    ACPI_NAMESPACE_NODE     *TempNode;
823218585Sjkim    ACPI_DEVICE_INFO        *Info;
824218585Sjkim    UINT32                  i;
825218585Sjkim
826218585Sjkim
827218585Sjkim    if ((Node->Type != ACPI_TYPE_DEVICE) &&
828218585Sjkim        (Node->Type != ACPI_TYPE_PROCESSOR))
829218585Sjkim    {
830218585Sjkim        return (AE_OK);
831218585Sjkim    }
832218585Sjkim
833218585Sjkim    /* Exit if there is no _PRT under this device */
834218585Sjkim
835218585Sjkim    Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
836218585Sjkim                ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
837218585Sjkim    if (ACPI_FAILURE (Status))
838218585Sjkim    {
839218585Sjkim        return (AE_OK);
840218585Sjkim    }
841218585Sjkim
842218585Sjkim    /* Get the full path to this device object */
843218585Sjkim
844218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
845218585Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
846218585Sjkim    if (ACPI_FAILURE (Status))
847218585Sjkim    {
848218585Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
849218585Sjkim        return (AE_OK);
850218585Sjkim    }
851218585Sjkim
852218585Sjkim    Status = AcpiGetObjectInfo (ObjHandle, &Info);
853218585Sjkim    if (ACPI_FAILURE (Status))
854218585Sjkim    {
855218585Sjkim        return (AE_OK);
856218585Sjkim    }
857218585Sjkim
858218585Sjkim    /* Display the full path */
859218585Sjkim
860218585Sjkim    AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
861218585Sjkim    ACPI_FREE (Buffer.Pointer);
862218585Sjkim
863218585Sjkim    if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
864218585Sjkim    {
865218585Sjkim        AcpiOsPrintf ("  - Is PCI Root Bridge");
866218585Sjkim    }
867218585Sjkim    AcpiOsPrintf ("\n");
868218585Sjkim
869218585Sjkim    /* _PRT info */
870218585Sjkim
871218585Sjkim    AcpiOsPrintf ("_PRT: %p\n", TempNode);
872218585Sjkim
873218585Sjkim    /* Dump _ADR, _HID, _UID, _CID */
874218585Sjkim
875218585Sjkim    if (Info->Valid & ACPI_VALID_ADR)
876218585Sjkim    {
877218585Sjkim        AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address));
878218585Sjkim    }
879218585Sjkim    else
880218585Sjkim    {
881218585Sjkim        AcpiOsPrintf ("_ADR: <Not Present>\n");
882218585Sjkim    }
883218585Sjkim
884218585Sjkim    if (Info->Valid & ACPI_VALID_HID)
885218585Sjkim    {
886218585Sjkim        AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
887218585Sjkim    }
888218585Sjkim    else
889218585Sjkim    {
890218585Sjkim        AcpiOsPrintf ("_HID: <Not Present>\n");
891218585Sjkim    }
892218585Sjkim
893218585Sjkim    if (Info->Valid & ACPI_VALID_UID)
894218585Sjkim    {
895218585Sjkim        AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
896218585Sjkim    }
897218585Sjkim    else
898218585Sjkim    {
899218585Sjkim        AcpiOsPrintf ("_UID: <Not Present>\n");
900218585Sjkim    }
901218585Sjkim
902218585Sjkim    if (Info->Valid & ACPI_VALID_CID)
903218585Sjkim    {
904218585Sjkim        for (i = 0; i < Info->CompatibleIdList.Count; i++)
905218585Sjkim        {
906218585Sjkim            AcpiOsPrintf ("_CID: %s\n",
907218585Sjkim                Info->CompatibleIdList.Ids[i].String);
908218585Sjkim        }
909218585Sjkim    }
910218585Sjkim    else
911218585Sjkim    {
912218585Sjkim        AcpiOsPrintf ("_CID: <Not Present>\n");
913218585Sjkim    }
914218585Sjkim
915218585Sjkim    ACPI_FREE (Info);
916218585Sjkim    return (AE_OK);
917218585Sjkim}
918218585Sjkim
919218585Sjkim
920218585Sjkim/*******************************************************************************
921218585Sjkim *
922218585Sjkim * FUNCTION:    AcpiDbGetBusInfo
923218585Sjkim *
924218585Sjkim * PARAMETERS:  None
925218585Sjkim *
926218585Sjkim * RETURN:      None
927218585Sjkim *
928218585Sjkim * DESCRIPTION: Display info about system busses.
929218585Sjkim *
930218585Sjkim ******************************************************************************/
931218585Sjkim
932218585Sjkimvoid
933218585SjkimAcpiDbGetBusInfo (
934218585Sjkim    void)
935218585Sjkim{
936218585Sjkim    /* Search all nodes in namespace */
937218585Sjkim
938218585Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
939218585Sjkim                    AcpiDbBusWalk, NULL, NULL, NULL);
940218585Sjkim}
941218585Sjkim
942218585Sjkim#endif /* ACPI_DEBUGGER */
943