Deleted Added
full compact
dbnames.c (218590) dbnames.c (229989)
1/*******************************************************************************
2 *
3 * Module Name: dbnames - Debugger commands for the acpi namespace
4 *
5 ******************************************************************************/
6
7/*
1/*******************************************************************************
2 *
3 * Module Name: dbnames - Debugger commands for the acpi namespace
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2011, Intel Corp.
8 * Copyright (C) 2000 - 2012, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45#include <contrib/dev/acpica/include/acpi.h>
46#include <contrib/dev/acpica/include/accommon.h>
47#include <contrib/dev/acpica/include/acnamesp.h>
48#include <contrib/dev/acpica/include/acdebug.h>
49
50
51#ifdef ACPI_DEBUGGER
52
53#define _COMPONENT ACPI_CA_DEBUGGER
54 ACPI_MODULE_NAME ("dbnames")
55
56
57/* Local prototypes */
58
59static ACPI_STATUS
60AcpiDbWalkAndMatchName (
61 ACPI_HANDLE ObjHandle,
62 UINT32 NestingLevel,
63 void *Context,
64 void **ReturnValue);
65
66static ACPI_STATUS
67AcpiDbWalkForPredefinedNames (
68 ACPI_HANDLE ObjHandle,
69 UINT32 NestingLevel,
70 void *Context,
71 void **ReturnValue);
72
73static ACPI_STATUS
74AcpiDbWalkForSpecificObjects (
75 ACPI_HANDLE ObjHandle,
76 UINT32 NestingLevel,
77 void *Context,
78 void **ReturnValue);
79
80static ACPI_STATUS
81AcpiDbIntegrityWalk (
82 ACPI_HANDLE ObjHandle,
83 UINT32 NestingLevel,
84 void *Context,
85 void **ReturnValue);
86
87static ACPI_STATUS
88AcpiDbWalkForReferences (
89 ACPI_HANDLE ObjHandle,
90 UINT32 NestingLevel,
91 void *Context,
92 void **ReturnValue);
93
94static ACPI_STATUS
95AcpiDbBusWalk (
96 ACPI_HANDLE ObjHandle,
97 UINT32 NestingLevel,
98 void *Context,
99 void **ReturnValue);
100
101/*
102 * Arguments for the Objects command
103 * These object types map directly to the ACPI_TYPES
104 */
105static ARGUMENT_INFO AcpiDbObjectTypes [] =
106{
107 {"ANY"},
108 {"INTEGERS"},
109 {"STRINGS"},
110 {"BUFFERS"},
111 {"PACKAGES"},
112 {"FIELDS"},
113 {"DEVICES"},
114 {"EVENTS"},
115 {"METHODS"},
116 {"MUTEXES"},
117 {"REGIONS"},
118 {"POWERRESOURCES"},
119 {"PROCESSORS"},
120 {"THERMALZONES"},
121 {"BUFFERFIELDS"},
122 {"DDBHANDLES"},
123 {"DEBUG"},
124 {"REGIONFIELDS"},
125 {"BANKFIELDS"},
126 {"INDEXFIELDS"},
127 {"REFERENCES"},
128 {"ALIAS"},
129 {NULL} /* Must be null terminated */
130};
131
132
133/*******************************************************************************
134 *
135 * FUNCTION: AcpiDbSetScope
136 *
137 * PARAMETERS: Name - New scope path
138 *
139 * RETURN: Status
140 *
141 * DESCRIPTION: Set the "current scope" as maintained by this utility.
142 * The scope is used as a prefix to ACPI paths.
143 *
144 ******************************************************************************/
145
146void
147AcpiDbSetScope (
148 char *Name)
149{
150 ACPI_STATUS Status;
151 ACPI_NAMESPACE_NODE *Node;
152
153
154 if (!Name || Name[0] == 0)
155 {
156 AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
157 return;
158 }
159
160 AcpiDbPrepNamestring (Name);
161
162 if (Name[0] == '\\')
163 {
164 /* Validate new scope from the root */
165
166 Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH,
167 &Node);
168 if (ACPI_FAILURE (Status))
169 {
170 goto ErrorExit;
171 }
172
173 ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
174 ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
175 }
176 else
177 {
178 /* Validate new scope relative to old scope */
179
180 Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH,
181 &Node);
182 if (ACPI_FAILURE (Status))
183 {
184 goto ErrorExit;
185 }
186
187 ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
188 ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
189 }
190
191 AcpiGbl_DbScopeNode = Node;
192 AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
193 return;
194
195ErrorExit:
196
197 AcpiOsPrintf ("Could not attach scope: %s, %s\n",
198 Name, AcpiFormatException (Status));
199}
200
201
202/*******************************************************************************
203 *
204 * FUNCTION: AcpiDbDumpNamespace
205 *
206 * PARAMETERS: StartArg - Node to begin namespace dump
207 * DepthArg - Maximum tree depth to be dumped
208 *
209 * RETURN: None
210 *
211 * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
212 * with type and other information.
213 *
214 ******************************************************************************/
215
216void
217AcpiDbDumpNamespace (
218 char *StartArg,
219 char *DepthArg)
220{
221 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
222 UINT32 MaxDepth = ACPI_UINT32_MAX;
223
224
225 /* No argument given, just start at the root and dump entire namespace */
226
227 if (StartArg)
228 {
229 SubtreeEntry = AcpiDbConvertToNode (StartArg);
230 if (!SubtreeEntry)
231 {
232 return;
233 }
234
235 /* Now we can check for the depth argument */
236
237 if (DepthArg)
238 {
239 MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
240 }
241 }
242
243 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
244 AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
245 ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
246
247 /* Display the subtree */
248
249 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
250 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
251 ACPI_OWNER_ID_MAX, SubtreeEntry);
252 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
253}
254
255
256/*******************************************************************************
257 *
258 * FUNCTION: AcpiDbDumpNamespaceByOwner
259 *
260 * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed
261 * DepthArg - Maximum tree depth to be dumped
262 *
263 * RETURN: None
264 *
265 * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
266 *
267 ******************************************************************************/
268
269void
270AcpiDbDumpNamespaceByOwner (
271 char *OwnerArg,
272 char *DepthArg)
273{
274 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
275 UINT32 MaxDepth = ACPI_UINT32_MAX;
276 ACPI_OWNER_ID OwnerId;
277
278
279 OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0);
280
281 /* Now we can check for the depth argument */
282
283 if (DepthArg)
284 {
285 MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
286 }
287
288 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
289 AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
290
291 /* Display the subtree */
292
293 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
294 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId,
295 SubtreeEntry);
296 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
297}
298
299
300/*******************************************************************************
301 *
302 * FUNCTION: AcpiDbWalkAndMatchName
303 *
304 * PARAMETERS: Callback from WalkNamespace
305 *
306 * RETURN: Status
307 *
308 * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
309 * are supported -- '?' matches any character.
310 *
311 ******************************************************************************/
312
313static ACPI_STATUS
314AcpiDbWalkAndMatchName (
315 ACPI_HANDLE ObjHandle,
316 UINT32 NestingLevel,
317 void *Context,
318 void **ReturnValue)
319{
320 ACPI_STATUS Status;
321 char *RequestedName = (char *) Context;
322 UINT32 i;
323 ACPI_BUFFER Buffer;
324 ACPI_WALK_INFO Info;
325
326
327 /* Check for a name match */
328
329 for (i = 0; i < 4; i++)
330 {
331 /* Wildcard support */
332
333 if ((RequestedName[i] != '?') &&
334 (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i]))
335 {
336 /* No match, just exit */
337
338 return (AE_OK);
339 }
340 }
341
342 /* Get the full pathname to this object */
343
344 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
345 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
346 if (ACPI_FAILURE (Status))
347 {
348 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
349 }
350 else
351 {
352 Info.OwnerId = ACPI_OWNER_ID_MAX;
353 Info.DebugLevel = ACPI_UINT32_MAX;
354 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
355
356 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
357 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
358 ACPI_FREE (Buffer.Pointer);
359 }
360
361 return (AE_OK);
362}
363
364
365/*******************************************************************************
366 *
367 * FUNCTION: AcpiDbFindNameInNamespace
368 *
369 * PARAMETERS: NameArg - The 4-character ACPI name to find.
370 * wildcards are supported.
371 *
372 * RETURN: None
373 *
374 * DESCRIPTION: Search the namespace for a given name (with wildcards)
375 *
376 ******************************************************************************/
377
378ACPI_STATUS
379AcpiDbFindNameInNamespace (
380 char *NameArg)
381{
382 char AcpiName[5] = "____";
383 char *AcpiNamePtr = AcpiName;
384
385
386 if (ACPI_STRLEN (NameArg) > 4)
387 {
388 AcpiOsPrintf ("Name must be no longer than 4 characters\n");
389 return (AE_OK);
390 }
391
392 /* Pad out name with underscores as necessary to create a 4-char name */
393
394 AcpiUtStrupr (NameArg);
395 while (*NameArg)
396 {
397 *AcpiNamePtr = *NameArg;
398 AcpiNamePtr++;
399 NameArg++;
400 }
401
402 /* Walk the namespace from the root */
403
404 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
405 AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
406
407 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
408 return (AE_OK);
409}
410
411
412/*******************************************************************************
413 *
414 * FUNCTION: AcpiDbWalkForPredefinedNames
415 *
416 * PARAMETERS: Callback from WalkNamespace
417 *
418 * RETURN: Status
419 *
420 * DESCRIPTION: Detect and display predefined ACPI names (names that start with
421 * an underscore)
422 *
423 ******************************************************************************/
424
425static ACPI_STATUS
426AcpiDbWalkForPredefinedNames (
427 ACPI_HANDLE ObjHandle,
428 UINT32 NestingLevel,
429 void *Context,
430 void **ReturnValue)
431{
432 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
433 UINT32 *Count = (UINT32 *) Context;
434 const ACPI_PREDEFINED_INFO *Predefined;
435 const ACPI_PREDEFINED_INFO *Package = NULL;
436 char *Pathname;
437
438
439 Predefined = AcpiNsCheckForPredefinedName (Node);
440 if (!Predefined)
441 {
442 return (AE_OK);
443 }
444
445 Pathname = AcpiNsGetExternalPathname (Node);
446 if (!Pathname)
447 {
448 return (AE_OK);
449 }
450
451 /* If method returns a package, the info is in the next table entry */
452
453 if (Predefined->Info.ExpectedBtypes & ACPI_BTYPE_PACKAGE)
454 {
455 Package = Predefined + 1;
456 }
457
458 AcpiOsPrintf ("%-32s arg %X ret %2.2X", Pathname,
459 Predefined->Info.ParamCount, Predefined->Info.ExpectedBtypes);
460
461 if (Package)
462 {
463 AcpiOsPrintf (" PkgType %2.2X ObjType %2.2X Count %2.2X",
464 Package->RetInfo.Type, Package->RetInfo.ObjectType1,
465 Package->RetInfo.Count1);
466 }
467
468 AcpiOsPrintf("\n");
469
470 AcpiNsCheckParameterCount (Pathname, Node, ACPI_UINT32_MAX, Predefined);
471 ACPI_FREE (Pathname);
472 (*Count)++;
473
474 return (AE_OK);
475}
476
477
478/*******************************************************************************
479 *
480 * FUNCTION: AcpiDbCheckPredefinedNames
481 *
482 * PARAMETERS: None
483 *
484 * RETURN: None
485 *
486 * DESCRIPTION: Validate all predefined names in the namespace
487 *
488 ******************************************************************************/
489
490void
491AcpiDbCheckPredefinedNames (
492 void)
493{
494 UINT32 Count = 0;
495
496
497 /* Search all nodes in namespace */
498
499 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
500 AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL);
501
502 AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
503}
504
505
506/*******************************************************************************
507 *
508 * FUNCTION: AcpiDbWalkForSpecificObjects
509 *
510 * PARAMETERS: Callback from WalkNamespace
511 *
512 * RETURN: Status
513 *
514 * DESCRIPTION: Display short info about objects in the namespace
515 *
516 ******************************************************************************/
517
518static ACPI_STATUS
519AcpiDbWalkForSpecificObjects (
520 ACPI_HANDLE ObjHandle,
521 UINT32 NestingLevel,
522 void *Context,
523 void **ReturnValue)
524{
525 ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context;
526 ACPI_BUFFER Buffer;
527 ACPI_STATUS Status;
528
529
530 Info->Count++;
531
532 /* Get and display the full pathname to this object */
533
534 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
535 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
536 if (ACPI_FAILURE (Status))
537 {
538 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
539 return (AE_OK);
540 }
541
542 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
543 ACPI_FREE (Buffer.Pointer);
544
545 /* Dump short info about the object */
546
547 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
548 return (AE_OK);
549}
550
551
552/*******************************************************************************
553 *
554 * FUNCTION: AcpiDbDisplayObjects
555 *
556 * PARAMETERS: ObjTypeArg - Type of object to display
557 * DisplayCountArg - Max depth to display
558 *
559 * RETURN: None
560 *
561 * DESCRIPTION: Display objects in the namespace of the requested type
562 *
563 ******************************************************************************/
564
565ACPI_STATUS
566AcpiDbDisplayObjects (
567 char *ObjTypeArg,
568 char *DisplayCountArg)
569{
570 ACPI_WALK_INFO Info;
571 ACPI_OBJECT_TYPE Type;
572
573
574 /* Get the object type */
575
576 Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
577 if (Type == ACPI_TYPE_NOT_FOUND)
578 {
579 AcpiOsPrintf ("Invalid or unsupported argument\n");
580 return (AE_OK);
581 }
582
583 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
584 AcpiOsPrintf (
585 "Objects of type [%s] defined in the current ACPI Namespace:\n",
586 AcpiUtGetTypeName (Type));
587
588 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
589
590 Info.Count = 0;
591 Info.OwnerId = ACPI_OWNER_ID_MAX;
592 Info.DebugLevel = ACPI_UINT32_MAX;
593 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
594
595 /* Walk the namespace from the root */
596
597 (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
598 AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
599
600 AcpiOsPrintf (
601 "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
602 Info.Count, AcpiUtGetTypeName (Type));
603
604 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
605 return (AE_OK);
606}
607
608
609/*******************************************************************************
610 *
611 * FUNCTION: AcpiDbIntegrityWalk
612 *
613 * PARAMETERS: Callback from WalkNamespace
614 *
615 * RETURN: Status
616 *
617 * DESCRIPTION: Examine one NS node for valid values.
618 *
619 ******************************************************************************/
620
621static ACPI_STATUS
622AcpiDbIntegrityWalk (
623 ACPI_HANDLE ObjHandle,
624 UINT32 NestingLevel,
625 void *Context,
626 void **ReturnValue)
627{
628 ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context;
629 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
630 ACPI_OPERAND_OBJECT *Object;
631 BOOLEAN Alias = TRUE;
632
633
634 Info->Nodes++;
635
636 /* Verify the NS node, and dereference aliases */
637
638 while (Alias)
639 {
640 if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
641 {
642 AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n",
643 Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node),
644 ACPI_DESC_TYPE_NAMED);
645 return (AE_OK);
646 }
647
648 if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS) ||
649 (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
650 {
651 Node = (ACPI_NAMESPACE_NODE *) Node->Object;
652 }
653 else
654 {
655 Alias = FALSE;
656 }
657 }
658
659 if (Node->Type > ACPI_TYPE_LOCAL_MAX)
660 {
661 AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
662 Node, Node->Type);
663 return (AE_OK);
664 }
665
666 if (!AcpiUtValidAcpiName (Node->Name.Integer))
667 {
668 AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
669 return (AE_OK);
670 }
671
672 Object = AcpiNsGetAttachedObject (Node);
673 if (Object)
674 {
675 Info->Objects++;
676 if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
677 {
678 AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
679 Object, AcpiUtGetDescriptorName (Object));
680 }
681 }
682
683 return (AE_OK);
684}
685
686
687/*******************************************************************************
688 *
689 * FUNCTION: AcpiDbCheckIntegrity
690 *
691 * PARAMETERS: None
692 *
693 * RETURN: None
694 *
695 * DESCRIPTION: Check entire namespace for data structure integrity
696 *
697 ******************************************************************************/
698
699void
700AcpiDbCheckIntegrity (
701 void)
702{
703 ACPI_INTEGRITY_INFO Info = {0,0};
704
705 /* Search all nodes in namespace */
706
707 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
708 AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
709
710 AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
711 Info.Nodes, Info.Objects);
712}
713
714
715/*******************************************************************************
716 *
717 * FUNCTION: AcpiDbWalkForReferences
718 *
719 * PARAMETERS: Callback from WalkNamespace
720 *
721 * RETURN: Status
722 *
723 * DESCRIPTION: Check if this namespace object refers to the target object
724 * that is passed in as the context value.
725 *
726 * Note: Currently doesn't check subobjects within the Node's object
727 *
728 ******************************************************************************/
729
730static ACPI_STATUS
731AcpiDbWalkForReferences (
732 ACPI_HANDLE ObjHandle,
733 UINT32 NestingLevel,
734 void *Context,
735 void **ReturnValue)
736{
737 ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context;
738 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
739
740
741 /* Check for match against the namespace node itself */
742
743 if (Node == (void *) ObjDesc)
744 {
745 AcpiOsPrintf ("Object is a Node [%4.4s]\n",
746 AcpiUtGetNodeName (Node));
747 }
748
749 /* Check for match against the object attached to the node */
750
751 if (AcpiNsGetAttachedObject (Node) == ObjDesc)
752 {
753 AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
754 Node, AcpiUtGetNodeName (Node));
755 }
756
757 return (AE_OK);
758}
759
760
761/*******************************************************************************
762 *
763 * FUNCTION: AcpiDbFindReferences
764 *
765 * PARAMETERS: ObjectArg - String with hex value of the object
766 *
767 * RETURN: None
768 *
769 * DESCRIPTION: Search namespace for all references to the input object
770 *
771 ******************************************************************************/
772
773void
774AcpiDbFindReferences (
775 char *ObjectArg)
776{
777 ACPI_OPERAND_OBJECT *ObjDesc;
778
779
780 /* Convert string to object pointer */
781
782 ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
783
784 /* Search all nodes in namespace */
785
786 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
787 AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL);
788}
789
790
791/*******************************************************************************
792 *
793 * FUNCTION: AcpiDbBusWalk
794 *
795 * PARAMETERS: Callback from WalkNamespace
796 *
797 * RETURN: Status
798 *
799 * DESCRIPTION: Display info about device objects that have a corresponding
800 * _PRT method.
801 *
802 ******************************************************************************/
803
804static ACPI_STATUS
805AcpiDbBusWalk (
806 ACPI_HANDLE ObjHandle,
807 UINT32 NestingLevel,
808 void *Context,
809 void **ReturnValue)
810{
811 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
812 ACPI_STATUS Status;
813 ACPI_BUFFER Buffer;
814 ACPI_NAMESPACE_NODE *TempNode;
815 ACPI_DEVICE_INFO *Info;
816 UINT32 i;
817
818
819 if ((Node->Type != ACPI_TYPE_DEVICE) &&
820 (Node->Type != ACPI_TYPE_PROCESSOR))
821 {
822 return (AE_OK);
823 }
824
825 /* Exit if there is no _PRT under this device */
826
827 Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
828 ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
829 if (ACPI_FAILURE (Status))
830 {
831 return (AE_OK);
832 }
833
834 /* Get the full path to this device object */
835
836 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
837 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
838 if (ACPI_FAILURE (Status))
839 {
840 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
841 return (AE_OK);
842 }
843
844 Status = AcpiGetObjectInfo (ObjHandle, &Info);
845 if (ACPI_FAILURE (Status))
846 {
847 return (AE_OK);
848 }
849
850 /* Display the full path */
851
852 AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
853 ACPI_FREE (Buffer.Pointer);
854
855 if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
856 {
857 AcpiOsPrintf (" - Is PCI Root Bridge");
858 }
859 AcpiOsPrintf ("\n");
860
861 /* _PRT info */
862
863 AcpiOsPrintf ("_PRT: %p\n", TempNode);
864
865 /* Dump _ADR, _HID, _UID, _CID */
866
867 if (Info->Valid & ACPI_VALID_ADR)
868 {
869 AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address));
870 }
871 else
872 {
873 AcpiOsPrintf ("_ADR: <Not Present>\n");
874 }
875
876 if (Info->Valid & ACPI_VALID_HID)
877 {
878 AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
879 }
880 else
881 {
882 AcpiOsPrintf ("_HID: <Not Present>\n");
883 }
884
885 if (Info->Valid & ACPI_VALID_UID)
886 {
887 AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
888 }
889 else
890 {
891 AcpiOsPrintf ("_UID: <Not Present>\n");
892 }
893
894 if (Info->Valid & ACPI_VALID_CID)
895 {
896 for (i = 0; i < Info->CompatibleIdList.Count; i++)
897 {
898 AcpiOsPrintf ("_CID: %s\n",
899 Info->CompatibleIdList.Ids[i].String);
900 }
901 }
902 else
903 {
904 AcpiOsPrintf ("_CID: <Not Present>\n");
905 }
906
907 ACPI_FREE (Info);
908 return (AE_OK);
909}
910
911
912/*******************************************************************************
913 *
914 * FUNCTION: AcpiDbGetBusInfo
915 *
916 * PARAMETERS: None
917 *
918 * RETURN: None
919 *
920 * DESCRIPTION: Display info about system busses.
921 *
922 ******************************************************************************/
923
924void
925AcpiDbGetBusInfo (
926 void)
927{
928 /* Search all nodes in namespace */
929
930 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
931 AcpiDbBusWalk, NULL, NULL, NULL);
932}
933
934#endif /* ACPI_DEBUGGER */
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45#include <contrib/dev/acpica/include/acpi.h>
46#include <contrib/dev/acpica/include/accommon.h>
47#include <contrib/dev/acpica/include/acnamesp.h>
48#include <contrib/dev/acpica/include/acdebug.h>
49
50
51#ifdef ACPI_DEBUGGER
52
53#define _COMPONENT ACPI_CA_DEBUGGER
54 ACPI_MODULE_NAME ("dbnames")
55
56
57/* Local prototypes */
58
59static ACPI_STATUS
60AcpiDbWalkAndMatchName (
61 ACPI_HANDLE ObjHandle,
62 UINT32 NestingLevel,
63 void *Context,
64 void **ReturnValue);
65
66static ACPI_STATUS
67AcpiDbWalkForPredefinedNames (
68 ACPI_HANDLE ObjHandle,
69 UINT32 NestingLevel,
70 void *Context,
71 void **ReturnValue);
72
73static ACPI_STATUS
74AcpiDbWalkForSpecificObjects (
75 ACPI_HANDLE ObjHandle,
76 UINT32 NestingLevel,
77 void *Context,
78 void **ReturnValue);
79
80static ACPI_STATUS
81AcpiDbIntegrityWalk (
82 ACPI_HANDLE ObjHandle,
83 UINT32 NestingLevel,
84 void *Context,
85 void **ReturnValue);
86
87static ACPI_STATUS
88AcpiDbWalkForReferences (
89 ACPI_HANDLE ObjHandle,
90 UINT32 NestingLevel,
91 void *Context,
92 void **ReturnValue);
93
94static ACPI_STATUS
95AcpiDbBusWalk (
96 ACPI_HANDLE ObjHandle,
97 UINT32 NestingLevel,
98 void *Context,
99 void **ReturnValue);
100
101/*
102 * Arguments for the Objects command
103 * These object types map directly to the ACPI_TYPES
104 */
105static ARGUMENT_INFO AcpiDbObjectTypes [] =
106{
107 {"ANY"},
108 {"INTEGERS"},
109 {"STRINGS"},
110 {"BUFFERS"},
111 {"PACKAGES"},
112 {"FIELDS"},
113 {"DEVICES"},
114 {"EVENTS"},
115 {"METHODS"},
116 {"MUTEXES"},
117 {"REGIONS"},
118 {"POWERRESOURCES"},
119 {"PROCESSORS"},
120 {"THERMALZONES"},
121 {"BUFFERFIELDS"},
122 {"DDBHANDLES"},
123 {"DEBUG"},
124 {"REGIONFIELDS"},
125 {"BANKFIELDS"},
126 {"INDEXFIELDS"},
127 {"REFERENCES"},
128 {"ALIAS"},
129 {NULL} /* Must be null terminated */
130};
131
132
133/*******************************************************************************
134 *
135 * FUNCTION: AcpiDbSetScope
136 *
137 * PARAMETERS: Name - New scope path
138 *
139 * RETURN: Status
140 *
141 * DESCRIPTION: Set the "current scope" as maintained by this utility.
142 * The scope is used as a prefix to ACPI paths.
143 *
144 ******************************************************************************/
145
146void
147AcpiDbSetScope (
148 char *Name)
149{
150 ACPI_STATUS Status;
151 ACPI_NAMESPACE_NODE *Node;
152
153
154 if (!Name || Name[0] == 0)
155 {
156 AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
157 return;
158 }
159
160 AcpiDbPrepNamestring (Name);
161
162 if (Name[0] == '\\')
163 {
164 /* Validate new scope from the root */
165
166 Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH,
167 &Node);
168 if (ACPI_FAILURE (Status))
169 {
170 goto ErrorExit;
171 }
172
173 ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
174 ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
175 }
176 else
177 {
178 /* Validate new scope relative to old scope */
179
180 Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH,
181 &Node);
182 if (ACPI_FAILURE (Status))
183 {
184 goto ErrorExit;
185 }
186
187 ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
188 ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
189 }
190
191 AcpiGbl_DbScopeNode = Node;
192 AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
193 return;
194
195ErrorExit:
196
197 AcpiOsPrintf ("Could not attach scope: %s, %s\n",
198 Name, AcpiFormatException (Status));
199}
200
201
202/*******************************************************************************
203 *
204 * FUNCTION: AcpiDbDumpNamespace
205 *
206 * PARAMETERS: StartArg - Node to begin namespace dump
207 * DepthArg - Maximum tree depth to be dumped
208 *
209 * RETURN: None
210 *
211 * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
212 * with type and other information.
213 *
214 ******************************************************************************/
215
216void
217AcpiDbDumpNamespace (
218 char *StartArg,
219 char *DepthArg)
220{
221 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
222 UINT32 MaxDepth = ACPI_UINT32_MAX;
223
224
225 /* No argument given, just start at the root and dump entire namespace */
226
227 if (StartArg)
228 {
229 SubtreeEntry = AcpiDbConvertToNode (StartArg);
230 if (!SubtreeEntry)
231 {
232 return;
233 }
234
235 /* Now we can check for the depth argument */
236
237 if (DepthArg)
238 {
239 MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
240 }
241 }
242
243 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
244 AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
245 ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
246
247 /* Display the subtree */
248
249 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
250 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
251 ACPI_OWNER_ID_MAX, SubtreeEntry);
252 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
253}
254
255
256/*******************************************************************************
257 *
258 * FUNCTION: AcpiDbDumpNamespaceByOwner
259 *
260 * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed
261 * DepthArg - Maximum tree depth to be dumped
262 *
263 * RETURN: None
264 *
265 * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
266 *
267 ******************************************************************************/
268
269void
270AcpiDbDumpNamespaceByOwner (
271 char *OwnerArg,
272 char *DepthArg)
273{
274 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
275 UINT32 MaxDepth = ACPI_UINT32_MAX;
276 ACPI_OWNER_ID OwnerId;
277
278
279 OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0);
280
281 /* Now we can check for the depth argument */
282
283 if (DepthArg)
284 {
285 MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
286 }
287
288 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
289 AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
290
291 /* Display the subtree */
292
293 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
294 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId,
295 SubtreeEntry);
296 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
297}
298
299
300/*******************************************************************************
301 *
302 * FUNCTION: AcpiDbWalkAndMatchName
303 *
304 * PARAMETERS: Callback from WalkNamespace
305 *
306 * RETURN: Status
307 *
308 * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
309 * are supported -- '?' matches any character.
310 *
311 ******************************************************************************/
312
313static ACPI_STATUS
314AcpiDbWalkAndMatchName (
315 ACPI_HANDLE ObjHandle,
316 UINT32 NestingLevel,
317 void *Context,
318 void **ReturnValue)
319{
320 ACPI_STATUS Status;
321 char *RequestedName = (char *) Context;
322 UINT32 i;
323 ACPI_BUFFER Buffer;
324 ACPI_WALK_INFO Info;
325
326
327 /* Check for a name match */
328
329 for (i = 0; i < 4; i++)
330 {
331 /* Wildcard support */
332
333 if ((RequestedName[i] != '?') &&
334 (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i]))
335 {
336 /* No match, just exit */
337
338 return (AE_OK);
339 }
340 }
341
342 /* Get the full pathname to this object */
343
344 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
345 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
346 if (ACPI_FAILURE (Status))
347 {
348 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
349 }
350 else
351 {
352 Info.OwnerId = ACPI_OWNER_ID_MAX;
353 Info.DebugLevel = ACPI_UINT32_MAX;
354 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
355
356 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
357 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
358 ACPI_FREE (Buffer.Pointer);
359 }
360
361 return (AE_OK);
362}
363
364
365/*******************************************************************************
366 *
367 * FUNCTION: AcpiDbFindNameInNamespace
368 *
369 * PARAMETERS: NameArg - The 4-character ACPI name to find.
370 * wildcards are supported.
371 *
372 * RETURN: None
373 *
374 * DESCRIPTION: Search the namespace for a given name (with wildcards)
375 *
376 ******************************************************************************/
377
378ACPI_STATUS
379AcpiDbFindNameInNamespace (
380 char *NameArg)
381{
382 char AcpiName[5] = "____";
383 char *AcpiNamePtr = AcpiName;
384
385
386 if (ACPI_STRLEN (NameArg) > 4)
387 {
388 AcpiOsPrintf ("Name must be no longer than 4 characters\n");
389 return (AE_OK);
390 }
391
392 /* Pad out name with underscores as necessary to create a 4-char name */
393
394 AcpiUtStrupr (NameArg);
395 while (*NameArg)
396 {
397 *AcpiNamePtr = *NameArg;
398 AcpiNamePtr++;
399 NameArg++;
400 }
401
402 /* Walk the namespace from the root */
403
404 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
405 AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
406
407 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
408 return (AE_OK);
409}
410
411
412/*******************************************************************************
413 *
414 * FUNCTION: AcpiDbWalkForPredefinedNames
415 *
416 * PARAMETERS: Callback from WalkNamespace
417 *
418 * RETURN: Status
419 *
420 * DESCRIPTION: Detect and display predefined ACPI names (names that start with
421 * an underscore)
422 *
423 ******************************************************************************/
424
425static ACPI_STATUS
426AcpiDbWalkForPredefinedNames (
427 ACPI_HANDLE ObjHandle,
428 UINT32 NestingLevel,
429 void *Context,
430 void **ReturnValue)
431{
432 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
433 UINT32 *Count = (UINT32 *) Context;
434 const ACPI_PREDEFINED_INFO *Predefined;
435 const ACPI_PREDEFINED_INFO *Package = NULL;
436 char *Pathname;
437
438
439 Predefined = AcpiNsCheckForPredefinedName (Node);
440 if (!Predefined)
441 {
442 return (AE_OK);
443 }
444
445 Pathname = AcpiNsGetExternalPathname (Node);
446 if (!Pathname)
447 {
448 return (AE_OK);
449 }
450
451 /* If method returns a package, the info is in the next table entry */
452
453 if (Predefined->Info.ExpectedBtypes & ACPI_BTYPE_PACKAGE)
454 {
455 Package = Predefined + 1;
456 }
457
458 AcpiOsPrintf ("%-32s arg %X ret %2.2X", Pathname,
459 Predefined->Info.ParamCount, Predefined->Info.ExpectedBtypes);
460
461 if (Package)
462 {
463 AcpiOsPrintf (" PkgType %2.2X ObjType %2.2X Count %2.2X",
464 Package->RetInfo.Type, Package->RetInfo.ObjectType1,
465 Package->RetInfo.Count1);
466 }
467
468 AcpiOsPrintf("\n");
469
470 AcpiNsCheckParameterCount (Pathname, Node, ACPI_UINT32_MAX, Predefined);
471 ACPI_FREE (Pathname);
472 (*Count)++;
473
474 return (AE_OK);
475}
476
477
478/*******************************************************************************
479 *
480 * FUNCTION: AcpiDbCheckPredefinedNames
481 *
482 * PARAMETERS: None
483 *
484 * RETURN: None
485 *
486 * DESCRIPTION: Validate all predefined names in the namespace
487 *
488 ******************************************************************************/
489
490void
491AcpiDbCheckPredefinedNames (
492 void)
493{
494 UINT32 Count = 0;
495
496
497 /* Search all nodes in namespace */
498
499 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
500 AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL);
501
502 AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
503}
504
505
506/*******************************************************************************
507 *
508 * FUNCTION: AcpiDbWalkForSpecificObjects
509 *
510 * PARAMETERS: Callback from WalkNamespace
511 *
512 * RETURN: Status
513 *
514 * DESCRIPTION: Display short info about objects in the namespace
515 *
516 ******************************************************************************/
517
518static ACPI_STATUS
519AcpiDbWalkForSpecificObjects (
520 ACPI_HANDLE ObjHandle,
521 UINT32 NestingLevel,
522 void *Context,
523 void **ReturnValue)
524{
525 ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context;
526 ACPI_BUFFER Buffer;
527 ACPI_STATUS Status;
528
529
530 Info->Count++;
531
532 /* Get and display the full pathname to this object */
533
534 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
535 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
536 if (ACPI_FAILURE (Status))
537 {
538 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
539 return (AE_OK);
540 }
541
542 AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
543 ACPI_FREE (Buffer.Pointer);
544
545 /* Dump short info about the object */
546
547 (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
548 return (AE_OK);
549}
550
551
552/*******************************************************************************
553 *
554 * FUNCTION: AcpiDbDisplayObjects
555 *
556 * PARAMETERS: ObjTypeArg - Type of object to display
557 * DisplayCountArg - Max depth to display
558 *
559 * RETURN: None
560 *
561 * DESCRIPTION: Display objects in the namespace of the requested type
562 *
563 ******************************************************************************/
564
565ACPI_STATUS
566AcpiDbDisplayObjects (
567 char *ObjTypeArg,
568 char *DisplayCountArg)
569{
570 ACPI_WALK_INFO Info;
571 ACPI_OBJECT_TYPE Type;
572
573
574 /* Get the object type */
575
576 Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
577 if (Type == ACPI_TYPE_NOT_FOUND)
578 {
579 AcpiOsPrintf ("Invalid or unsupported argument\n");
580 return (AE_OK);
581 }
582
583 AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
584 AcpiOsPrintf (
585 "Objects of type [%s] defined in the current ACPI Namespace:\n",
586 AcpiUtGetTypeName (Type));
587
588 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
589
590 Info.Count = 0;
591 Info.OwnerId = ACPI_OWNER_ID_MAX;
592 Info.DebugLevel = ACPI_UINT32_MAX;
593 Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
594
595 /* Walk the namespace from the root */
596
597 (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
598 AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
599
600 AcpiOsPrintf (
601 "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
602 Info.Count, AcpiUtGetTypeName (Type));
603
604 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
605 return (AE_OK);
606}
607
608
609/*******************************************************************************
610 *
611 * FUNCTION: AcpiDbIntegrityWalk
612 *
613 * PARAMETERS: Callback from WalkNamespace
614 *
615 * RETURN: Status
616 *
617 * DESCRIPTION: Examine one NS node for valid values.
618 *
619 ******************************************************************************/
620
621static ACPI_STATUS
622AcpiDbIntegrityWalk (
623 ACPI_HANDLE ObjHandle,
624 UINT32 NestingLevel,
625 void *Context,
626 void **ReturnValue)
627{
628 ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context;
629 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
630 ACPI_OPERAND_OBJECT *Object;
631 BOOLEAN Alias = TRUE;
632
633
634 Info->Nodes++;
635
636 /* Verify the NS node, and dereference aliases */
637
638 while (Alias)
639 {
640 if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
641 {
642 AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n",
643 Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node),
644 ACPI_DESC_TYPE_NAMED);
645 return (AE_OK);
646 }
647
648 if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS) ||
649 (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
650 {
651 Node = (ACPI_NAMESPACE_NODE *) Node->Object;
652 }
653 else
654 {
655 Alias = FALSE;
656 }
657 }
658
659 if (Node->Type > ACPI_TYPE_LOCAL_MAX)
660 {
661 AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
662 Node, Node->Type);
663 return (AE_OK);
664 }
665
666 if (!AcpiUtValidAcpiName (Node->Name.Integer))
667 {
668 AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
669 return (AE_OK);
670 }
671
672 Object = AcpiNsGetAttachedObject (Node);
673 if (Object)
674 {
675 Info->Objects++;
676 if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
677 {
678 AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
679 Object, AcpiUtGetDescriptorName (Object));
680 }
681 }
682
683 return (AE_OK);
684}
685
686
687/*******************************************************************************
688 *
689 * FUNCTION: AcpiDbCheckIntegrity
690 *
691 * PARAMETERS: None
692 *
693 * RETURN: None
694 *
695 * DESCRIPTION: Check entire namespace for data structure integrity
696 *
697 ******************************************************************************/
698
699void
700AcpiDbCheckIntegrity (
701 void)
702{
703 ACPI_INTEGRITY_INFO Info = {0,0};
704
705 /* Search all nodes in namespace */
706
707 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
708 AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
709
710 AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
711 Info.Nodes, Info.Objects);
712}
713
714
715/*******************************************************************************
716 *
717 * FUNCTION: AcpiDbWalkForReferences
718 *
719 * PARAMETERS: Callback from WalkNamespace
720 *
721 * RETURN: Status
722 *
723 * DESCRIPTION: Check if this namespace object refers to the target object
724 * that is passed in as the context value.
725 *
726 * Note: Currently doesn't check subobjects within the Node's object
727 *
728 ******************************************************************************/
729
730static ACPI_STATUS
731AcpiDbWalkForReferences (
732 ACPI_HANDLE ObjHandle,
733 UINT32 NestingLevel,
734 void *Context,
735 void **ReturnValue)
736{
737 ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context;
738 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
739
740
741 /* Check for match against the namespace node itself */
742
743 if (Node == (void *) ObjDesc)
744 {
745 AcpiOsPrintf ("Object is a Node [%4.4s]\n",
746 AcpiUtGetNodeName (Node));
747 }
748
749 /* Check for match against the object attached to the node */
750
751 if (AcpiNsGetAttachedObject (Node) == ObjDesc)
752 {
753 AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
754 Node, AcpiUtGetNodeName (Node));
755 }
756
757 return (AE_OK);
758}
759
760
761/*******************************************************************************
762 *
763 * FUNCTION: AcpiDbFindReferences
764 *
765 * PARAMETERS: ObjectArg - String with hex value of the object
766 *
767 * RETURN: None
768 *
769 * DESCRIPTION: Search namespace for all references to the input object
770 *
771 ******************************************************************************/
772
773void
774AcpiDbFindReferences (
775 char *ObjectArg)
776{
777 ACPI_OPERAND_OBJECT *ObjDesc;
778
779
780 /* Convert string to object pointer */
781
782 ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
783
784 /* Search all nodes in namespace */
785
786 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
787 AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL);
788}
789
790
791/*******************************************************************************
792 *
793 * FUNCTION: AcpiDbBusWalk
794 *
795 * PARAMETERS: Callback from WalkNamespace
796 *
797 * RETURN: Status
798 *
799 * DESCRIPTION: Display info about device objects that have a corresponding
800 * _PRT method.
801 *
802 ******************************************************************************/
803
804static ACPI_STATUS
805AcpiDbBusWalk (
806 ACPI_HANDLE ObjHandle,
807 UINT32 NestingLevel,
808 void *Context,
809 void **ReturnValue)
810{
811 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
812 ACPI_STATUS Status;
813 ACPI_BUFFER Buffer;
814 ACPI_NAMESPACE_NODE *TempNode;
815 ACPI_DEVICE_INFO *Info;
816 UINT32 i;
817
818
819 if ((Node->Type != ACPI_TYPE_DEVICE) &&
820 (Node->Type != ACPI_TYPE_PROCESSOR))
821 {
822 return (AE_OK);
823 }
824
825 /* Exit if there is no _PRT under this device */
826
827 Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
828 ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
829 if (ACPI_FAILURE (Status))
830 {
831 return (AE_OK);
832 }
833
834 /* Get the full path to this device object */
835
836 Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
837 Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
838 if (ACPI_FAILURE (Status))
839 {
840 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
841 return (AE_OK);
842 }
843
844 Status = AcpiGetObjectInfo (ObjHandle, &Info);
845 if (ACPI_FAILURE (Status))
846 {
847 return (AE_OK);
848 }
849
850 /* Display the full path */
851
852 AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
853 ACPI_FREE (Buffer.Pointer);
854
855 if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
856 {
857 AcpiOsPrintf (" - Is PCI Root Bridge");
858 }
859 AcpiOsPrintf ("\n");
860
861 /* _PRT info */
862
863 AcpiOsPrintf ("_PRT: %p\n", TempNode);
864
865 /* Dump _ADR, _HID, _UID, _CID */
866
867 if (Info->Valid & ACPI_VALID_ADR)
868 {
869 AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address));
870 }
871 else
872 {
873 AcpiOsPrintf ("_ADR: <Not Present>\n");
874 }
875
876 if (Info->Valid & ACPI_VALID_HID)
877 {
878 AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
879 }
880 else
881 {
882 AcpiOsPrintf ("_HID: <Not Present>\n");
883 }
884
885 if (Info->Valid & ACPI_VALID_UID)
886 {
887 AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
888 }
889 else
890 {
891 AcpiOsPrintf ("_UID: <Not Present>\n");
892 }
893
894 if (Info->Valid & ACPI_VALID_CID)
895 {
896 for (i = 0; i < Info->CompatibleIdList.Count; i++)
897 {
898 AcpiOsPrintf ("_CID: %s\n",
899 Info->CompatibleIdList.Ids[i].String);
900 }
901 }
902 else
903 {
904 AcpiOsPrintf ("_CID: <Not Present>\n");
905 }
906
907 ACPI_FREE (Info);
908 return (AE_OK);
909}
910
911
912/*******************************************************************************
913 *
914 * FUNCTION: AcpiDbGetBusInfo
915 *
916 * PARAMETERS: None
917 *
918 * RETURN: None
919 *
920 * DESCRIPTION: Display info about system busses.
921 *
922 ******************************************************************************/
923
924void
925AcpiDbGetBusInfo (
926 void)
927{
928 /* Search all nodes in namespace */
929
930 (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
931 AcpiDbBusWalk, NULL, NULL, NULL);
932}
933
934#endif /* ACPI_DEBUGGER */