dbnames.c revision 284583
1218585Sjkim/******************************************************************************* 2218585Sjkim * 3218585Sjkim * Module Name: dbnames - Debugger commands for the acpi namespace 4218585Sjkim * 5218585Sjkim ******************************************************************************/ 6218585Sjkim 7218585Sjkim/* 8278970Sjkim * Copyright (C) 2000 - 2015, 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 44218590Sjkim#include <contrib/dev/acpica/include/acpi.h> 45218590Sjkim#include <contrib/dev/acpica/include/accommon.h> 46218590Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 47218590Sjkim#include <contrib/dev/acpica/include/acdebug.h> 48249112Sjkim#include <contrib/dev/acpica/include/acpredef.h> 49218585Sjkim 50218585Sjkim 51218585Sjkim#ifdef ACPI_DEBUGGER 52218585Sjkim 53218585Sjkim#define _COMPONENT ACPI_CA_DEBUGGER 54218585Sjkim ACPI_MODULE_NAME ("dbnames") 55218585Sjkim 56218585Sjkim 57218585Sjkim/* Local prototypes */ 58218585Sjkim 59218585Sjkimstatic ACPI_STATUS 60218585SjkimAcpiDbWalkAndMatchName ( 61218585Sjkim ACPI_HANDLE ObjHandle, 62218585Sjkim UINT32 NestingLevel, 63218585Sjkim void *Context, 64218585Sjkim void **ReturnValue); 65218585Sjkim 66218585Sjkimstatic ACPI_STATUS 67218585SjkimAcpiDbWalkForPredefinedNames ( 68218585Sjkim ACPI_HANDLE ObjHandle, 69218585Sjkim UINT32 NestingLevel, 70218585Sjkim void *Context, 71218585Sjkim void **ReturnValue); 72218585Sjkim 73218585Sjkimstatic ACPI_STATUS 74218585SjkimAcpiDbWalkForSpecificObjects ( 75218585Sjkim ACPI_HANDLE ObjHandle, 76218585Sjkim UINT32 NestingLevel, 77218585Sjkim void *Context, 78218585Sjkim void **ReturnValue); 79218585Sjkim 80218585Sjkimstatic ACPI_STATUS 81218585SjkimAcpiDbIntegrityWalk ( 82218585Sjkim ACPI_HANDLE ObjHandle, 83218585Sjkim UINT32 NestingLevel, 84218585Sjkim void *Context, 85218585Sjkim void **ReturnValue); 86218585Sjkim 87218585Sjkimstatic ACPI_STATUS 88218585SjkimAcpiDbWalkForReferences ( 89218585Sjkim ACPI_HANDLE ObjHandle, 90218585Sjkim UINT32 NestingLevel, 91218585Sjkim void *Context, 92218585Sjkim void **ReturnValue); 93218585Sjkim 94218585Sjkimstatic ACPI_STATUS 95218585SjkimAcpiDbBusWalk ( 96218585Sjkim ACPI_HANDLE ObjHandle, 97218585Sjkim UINT32 NestingLevel, 98218585Sjkim void *Context, 99218585Sjkim void **ReturnValue); 100218585Sjkim 101218585Sjkim/* 102218585Sjkim * Arguments for the Objects command 103218585Sjkim * These object types map directly to the ACPI_TYPES 104218585Sjkim */ 105240716Sjkimstatic ACPI_DB_ARGUMENT_INFO AcpiDbObjectTypes [] = 106218585Sjkim{ 107218585Sjkim {"ANY"}, 108218585Sjkim {"INTEGERS"}, 109218585Sjkim {"STRINGS"}, 110218585Sjkim {"BUFFERS"}, 111218585Sjkim {"PACKAGES"}, 112218585Sjkim {"FIELDS"}, 113218585Sjkim {"DEVICES"}, 114218585Sjkim {"EVENTS"}, 115218585Sjkim {"METHODS"}, 116218585Sjkim {"MUTEXES"}, 117218585Sjkim {"REGIONS"}, 118218585Sjkim {"POWERRESOURCES"}, 119218585Sjkim {"PROCESSORS"}, 120218585Sjkim {"THERMALZONES"}, 121218585Sjkim {"BUFFERFIELDS"}, 122218585Sjkim {"DDBHANDLES"}, 123218585Sjkim {"DEBUG"}, 124218585Sjkim {"REGIONFIELDS"}, 125218585Sjkim {"BANKFIELDS"}, 126218585Sjkim {"INDEXFIELDS"}, 127218585Sjkim {"REFERENCES"}, 128218585Sjkim {"ALIAS"}, 129218585Sjkim {NULL} /* Must be null terminated */ 130218585Sjkim}; 131218585Sjkim 132218585Sjkim 133218585Sjkim/******************************************************************************* 134218585Sjkim * 135218585Sjkim * FUNCTION: AcpiDbSetScope 136218585Sjkim * 137218585Sjkim * PARAMETERS: Name - New scope path 138218585Sjkim * 139218585Sjkim * RETURN: Status 140218585Sjkim * 141218585Sjkim * DESCRIPTION: Set the "current scope" as maintained by this utility. 142218585Sjkim * The scope is used as a prefix to ACPI paths. 143218585Sjkim * 144218585Sjkim ******************************************************************************/ 145218585Sjkim 146218585Sjkimvoid 147218585SjkimAcpiDbSetScope ( 148218585Sjkim char *Name) 149218585Sjkim{ 150218585Sjkim ACPI_STATUS Status; 151218585Sjkim ACPI_NAMESPACE_NODE *Node; 152218585Sjkim 153218585Sjkim 154218585Sjkim if (!Name || Name[0] == 0) 155218585Sjkim { 156218585Sjkim AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf); 157218585Sjkim return; 158218585Sjkim } 159218585Sjkim 160218585Sjkim AcpiDbPrepNamestring (Name); 161218585Sjkim 162245582Sjkim if (ACPI_IS_ROOT_PREFIX (Name[0])) 163218585Sjkim { 164218585Sjkim /* Validate new scope from the root */ 165218585Sjkim 166218585Sjkim Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH, 167218585Sjkim &Node); 168218585Sjkim if (ACPI_FAILURE (Status)) 169218585Sjkim { 170218585Sjkim goto ErrorExit; 171218585Sjkim } 172218585Sjkim 173272444Sjkim AcpiGbl_DbScopeBuf[0] = 0; 174218585Sjkim } 175218585Sjkim else 176218585Sjkim { 177218585Sjkim /* Validate new scope relative to old scope */ 178218585Sjkim 179218585Sjkim Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH, 180218585Sjkim &Node); 181218585Sjkim if (ACPI_FAILURE (Status)) 182218585Sjkim { 183218585Sjkim goto ErrorExit; 184218585Sjkim } 185272444Sjkim } 186218585Sjkim 187272444Sjkim /* Build the final pathname */ 188272444Sjkim 189272444Sjkim if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf), 190272444Sjkim Name)) 191272444Sjkim { 192272444Sjkim Status = AE_BUFFER_OVERFLOW; 193272444Sjkim goto ErrorExit; 194218585Sjkim } 195218585Sjkim 196272444Sjkim if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf), 197272444Sjkim "\\")) 198272444Sjkim { 199272444Sjkim Status = AE_BUFFER_OVERFLOW; 200272444Sjkim goto ErrorExit; 201272444Sjkim } 202272444Sjkim 203218585Sjkim AcpiGbl_DbScopeNode = Node; 204218585Sjkim AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf); 205218585Sjkim return; 206218585Sjkim 207218585SjkimErrorExit: 208218585Sjkim 209218585Sjkim AcpiOsPrintf ("Could not attach scope: %s, %s\n", 210218585Sjkim Name, AcpiFormatException (Status)); 211218585Sjkim} 212218585Sjkim 213218585Sjkim 214218585Sjkim/******************************************************************************* 215218585Sjkim * 216218585Sjkim * FUNCTION: AcpiDbDumpNamespace 217218585Sjkim * 218218585Sjkim * PARAMETERS: StartArg - Node to begin namespace dump 219218585Sjkim * DepthArg - Maximum tree depth to be dumped 220218585Sjkim * 221218585Sjkim * RETURN: None 222218585Sjkim * 223241973Sjkim * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed 224218585Sjkim * with type and other information. 225218585Sjkim * 226218585Sjkim ******************************************************************************/ 227218585Sjkim 228218585Sjkimvoid 229218585SjkimAcpiDbDumpNamespace ( 230218585Sjkim char *StartArg, 231218585Sjkim char *DepthArg) 232218585Sjkim{ 233218585Sjkim ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 234218585Sjkim UINT32 MaxDepth = ACPI_UINT32_MAX; 235218585Sjkim 236218585Sjkim 237218585Sjkim /* No argument given, just start at the root and dump entire namespace */ 238218585Sjkim 239218585Sjkim if (StartArg) 240218585Sjkim { 241218585Sjkim SubtreeEntry = AcpiDbConvertToNode (StartArg); 242218585Sjkim if (!SubtreeEntry) 243218585Sjkim { 244218585Sjkim return; 245218585Sjkim } 246218585Sjkim 247218585Sjkim /* Now we can check for the depth argument */ 248218585Sjkim 249218585Sjkim if (DepthArg) 250218585Sjkim { 251284583Sjkim MaxDepth = strtoul (DepthArg, NULL, 0); 252218585Sjkim } 253218585Sjkim } 254218585Sjkim 255218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 256218585Sjkim AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n", 257218585Sjkim ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry); 258218585Sjkim 259218585Sjkim /* Display the subtree */ 260218585Sjkim 261218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 262218585Sjkim AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, 263218585Sjkim ACPI_OWNER_ID_MAX, SubtreeEntry); 264218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 265218585Sjkim} 266218585Sjkim 267218585Sjkim 268218585Sjkim/******************************************************************************* 269218585Sjkim * 270254745Sjkim * FUNCTION: AcpiDbDumpNamespacePaths 271254745Sjkim * 272254745Sjkim * PARAMETERS: None 273254745Sjkim * 274254745Sjkim * RETURN: None 275254745Sjkim * 276254745Sjkim * DESCRIPTION: Dump entire namespace with full object pathnames and object 277254745Sjkim * type information. Alternative to "namespace" command. 278254745Sjkim * 279254745Sjkim ******************************************************************************/ 280254745Sjkim 281254745Sjkimvoid 282254745SjkimAcpiDbDumpNamespacePaths ( 283254745Sjkim void) 284254745Sjkim{ 285254745Sjkim 286254745Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 287254745Sjkim AcpiOsPrintf ("ACPI Namespace (from root):\n"); 288254745Sjkim 289254745Sjkim /* Display the entire namespace */ 290254745Sjkim 291254745Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 292254745Sjkim AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, 293254745Sjkim ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode); 294254745Sjkim 295254745Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 296254745Sjkim} 297254745Sjkim 298254745Sjkim 299254745Sjkim/******************************************************************************* 300254745Sjkim * 301218585Sjkim * FUNCTION: AcpiDbDumpNamespaceByOwner 302218585Sjkim * 303218585Sjkim * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed 304218585Sjkim * DepthArg - Maximum tree depth to be dumped 305218585Sjkim * 306218585Sjkim * RETURN: None 307218585Sjkim * 308218585Sjkim * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId. 309218585Sjkim * 310218585Sjkim ******************************************************************************/ 311218585Sjkim 312218585Sjkimvoid 313218585SjkimAcpiDbDumpNamespaceByOwner ( 314218585Sjkim char *OwnerArg, 315218585Sjkim char *DepthArg) 316218585Sjkim{ 317218585Sjkim ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 318218585Sjkim UINT32 MaxDepth = ACPI_UINT32_MAX; 319218585Sjkim ACPI_OWNER_ID OwnerId; 320218585Sjkim 321218585Sjkim 322284583Sjkim OwnerId = (ACPI_OWNER_ID) strtoul (OwnerArg, NULL, 0); 323218585Sjkim 324218585Sjkim /* Now we can check for the depth argument */ 325218585Sjkim 326218585Sjkim if (DepthArg) 327218585Sjkim { 328284583Sjkim MaxDepth = strtoul (DepthArg, NULL, 0); 329218585Sjkim } 330218585Sjkim 331218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 332218585Sjkim AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId); 333218585Sjkim 334218585Sjkim /* Display the subtree */ 335218585Sjkim 336218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 337218585Sjkim AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId, 338218585Sjkim SubtreeEntry); 339218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 340218585Sjkim} 341218585Sjkim 342218585Sjkim 343218585Sjkim/******************************************************************************* 344218585Sjkim * 345218585Sjkim * FUNCTION: AcpiDbWalkAndMatchName 346218585Sjkim * 347218585Sjkim * PARAMETERS: Callback from WalkNamespace 348218585Sjkim * 349218585Sjkim * RETURN: Status 350218585Sjkim * 351241973Sjkim * DESCRIPTION: Find a particular name/names within the namespace. Wildcards 352218585Sjkim * are supported -- '?' matches any character. 353218585Sjkim * 354218585Sjkim ******************************************************************************/ 355218585Sjkim 356218585Sjkimstatic ACPI_STATUS 357218585SjkimAcpiDbWalkAndMatchName ( 358218585Sjkim ACPI_HANDLE ObjHandle, 359218585Sjkim UINT32 NestingLevel, 360218585Sjkim void *Context, 361218585Sjkim void **ReturnValue) 362218585Sjkim{ 363218585Sjkim ACPI_STATUS Status; 364218585Sjkim char *RequestedName = (char *) Context; 365218585Sjkim UINT32 i; 366218585Sjkim ACPI_BUFFER Buffer; 367218585Sjkim ACPI_WALK_INFO Info; 368218585Sjkim 369218585Sjkim 370218585Sjkim /* Check for a name match */ 371218585Sjkim 372218585Sjkim for (i = 0; i < 4; i++) 373218585Sjkim { 374218585Sjkim /* Wildcard support */ 375218585Sjkim 376218585Sjkim if ((RequestedName[i] != '?') && 377218585Sjkim (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i])) 378218585Sjkim { 379218585Sjkim /* No match, just exit */ 380218585Sjkim 381218585Sjkim return (AE_OK); 382218585Sjkim } 383218585Sjkim } 384218585Sjkim 385218585Sjkim /* Get the full pathname to this object */ 386218585Sjkim 387218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 388218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 389218585Sjkim if (ACPI_FAILURE (Status)) 390218585Sjkim { 391218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 392218585Sjkim } 393218585Sjkim else 394218585Sjkim { 395218585Sjkim Info.OwnerId = ACPI_OWNER_ID_MAX; 396218585Sjkim Info.DebugLevel = ACPI_UINT32_MAX; 397218585Sjkim Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 398218585Sjkim 399218585Sjkim AcpiOsPrintf ("%32s", (char *) Buffer.Pointer); 400218585Sjkim (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL); 401218585Sjkim ACPI_FREE (Buffer.Pointer); 402218585Sjkim } 403218585Sjkim 404218585Sjkim return (AE_OK); 405218585Sjkim} 406218585Sjkim 407218585Sjkim 408218585Sjkim/******************************************************************************* 409218585Sjkim * 410218585Sjkim * FUNCTION: AcpiDbFindNameInNamespace 411218585Sjkim * 412218585Sjkim * PARAMETERS: NameArg - The 4-character ACPI name to find. 413218585Sjkim * wildcards are supported. 414218585Sjkim * 415218585Sjkim * RETURN: None 416218585Sjkim * 417218585Sjkim * DESCRIPTION: Search the namespace for a given name (with wildcards) 418218585Sjkim * 419218585Sjkim ******************************************************************************/ 420218585Sjkim 421218585SjkimACPI_STATUS 422218585SjkimAcpiDbFindNameInNamespace ( 423218585Sjkim char *NameArg) 424218585Sjkim{ 425218585Sjkim char AcpiName[5] = "____"; 426218585Sjkim char *AcpiNamePtr = AcpiName; 427218585Sjkim 428218585Sjkim 429284583Sjkim if (strlen (NameArg) > 4) 430218585Sjkim { 431218585Sjkim AcpiOsPrintf ("Name must be no longer than 4 characters\n"); 432218585Sjkim return (AE_OK); 433218585Sjkim } 434218585Sjkim 435218585Sjkim /* Pad out name with underscores as necessary to create a 4-char name */ 436218585Sjkim 437218585Sjkim AcpiUtStrupr (NameArg); 438218585Sjkim while (*NameArg) 439218585Sjkim { 440218585Sjkim *AcpiNamePtr = *NameArg; 441218585Sjkim AcpiNamePtr++; 442218585Sjkim NameArg++; 443218585Sjkim } 444218585Sjkim 445218585Sjkim /* Walk the namespace from the root */ 446218585Sjkim 447218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 448218585Sjkim AcpiDbWalkAndMatchName, NULL, AcpiName, NULL); 449218585Sjkim 450218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 451218585Sjkim return (AE_OK); 452218585Sjkim} 453218585Sjkim 454218585Sjkim 455218585Sjkim/******************************************************************************* 456218585Sjkim * 457218585Sjkim * FUNCTION: AcpiDbWalkForPredefinedNames 458218585Sjkim * 459218585Sjkim * PARAMETERS: Callback from WalkNamespace 460218585Sjkim * 461218585Sjkim * RETURN: Status 462218585Sjkim * 463218585Sjkim * DESCRIPTION: Detect and display predefined ACPI names (names that start with 464218585Sjkim * an underscore) 465218585Sjkim * 466218585Sjkim ******************************************************************************/ 467218585Sjkim 468218585Sjkimstatic ACPI_STATUS 469218585SjkimAcpiDbWalkForPredefinedNames ( 470218585Sjkim ACPI_HANDLE ObjHandle, 471218585Sjkim UINT32 NestingLevel, 472218585Sjkim void *Context, 473218585Sjkim void **ReturnValue) 474218585Sjkim{ 475218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 476218585Sjkim UINT32 *Count = (UINT32 *) Context; 477218585Sjkim const ACPI_PREDEFINED_INFO *Predefined; 478218585Sjkim const ACPI_PREDEFINED_INFO *Package = NULL; 479218585Sjkim char *Pathname; 480249663Sjkim char StringBuffer[48]; 481218585Sjkim 482218585Sjkim 483249112Sjkim Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); 484218585Sjkim if (!Predefined) 485218585Sjkim { 486218585Sjkim return (AE_OK); 487218585Sjkim } 488218585Sjkim 489218585Sjkim Pathname = AcpiNsGetExternalPathname (Node); 490218585Sjkim if (!Pathname) 491218585Sjkim { 492218585Sjkim return (AE_OK); 493218585Sjkim } 494218585Sjkim 495218585Sjkim /* If method returns a package, the info is in the next table entry */ 496218585Sjkim 497249112Sjkim if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE) 498218585Sjkim { 499218585Sjkim Package = Predefined + 1; 500218585Sjkim } 501218585Sjkim 502249663Sjkim AcpiUtGetExpectedReturnTypes (StringBuffer, 503249112Sjkim Predefined->Info.ExpectedBtypes); 504218585Sjkim 505249663Sjkim AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname, 506249663Sjkim METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList), 507249663Sjkim StringBuffer); 508249663Sjkim 509218585Sjkim if (Package) 510218585Sjkim { 511249663Sjkim AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)", 512218585Sjkim Package->RetInfo.Type, Package->RetInfo.ObjectType1, 513218585Sjkim Package->RetInfo.Count1); 514218585Sjkim } 515218585Sjkim 516218585Sjkim AcpiOsPrintf("\n"); 517218585Sjkim 518249663Sjkim /* Check that the declared argument count matches the ACPI spec */ 519249663Sjkim 520249663Sjkim AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined); 521249663Sjkim 522218585Sjkim ACPI_FREE (Pathname); 523218585Sjkim (*Count)++; 524218585Sjkim return (AE_OK); 525218585Sjkim} 526218585Sjkim 527218585Sjkim 528218585Sjkim/******************************************************************************* 529218585Sjkim * 530218585Sjkim * FUNCTION: AcpiDbCheckPredefinedNames 531218585Sjkim * 532218585Sjkim * PARAMETERS: None 533218585Sjkim * 534218585Sjkim * RETURN: None 535218585Sjkim * 536218585Sjkim * DESCRIPTION: Validate all predefined names in the namespace 537218585Sjkim * 538218585Sjkim ******************************************************************************/ 539218585Sjkim 540218585Sjkimvoid 541218585SjkimAcpiDbCheckPredefinedNames ( 542218585Sjkim void) 543218585Sjkim{ 544218585Sjkim UINT32 Count = 0; 545218585Sjkim 546218585Sjkim 547218585Sjkim /* Search all nodes in namespace */ 548218585Sjkim 549218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 550218585Sjkim AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL); 551218585Sjkim 552218585Sjkim AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count); 553218585Sjkim} 554218585Sjkim 555218585Sjkim 556218585Sjkim/******************************************************************************* 557218585Sjkim * 558218585Sjkim * FUNCTION: AcpiDbWalkForSpecificObjects 559218585Sjkim * 560218585Sjkim * PARAMETERS: Callback from WalkNamespace 561218585Sjkim * 562218585Sjkim * RETURN: Status 563218585Sjkim * 564218585Sjkim * DESCRIPTION: Display short info about objects in the namespace 565218585Sjkim * 566218585Sjkim ******************************************************************************/ 567218585Sjkim 568218585Sjkimstatic ACPI_STATUS 569218585SjkimAcpiDbWalkForSpecificObjects ( 570218585Sjkim ACPI_HANDLE ObjHandle, 571218585Sjkim UINT32 NestingLevel, 572218585Sjkim void *Context, 573218585Sjkim void **ReturnValue) 574218585Sjkim{ 575218585Sjkim ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context; 576218585Sjkim ACPI_BUFFER Buffer; 577218585Sjkim ACPI_STATUS Status; 578218585Sjkim 579218585Sjkim 580218585Sjkim Info->Count++; 581218585Sjkim 582218585Sjkim /* Get and display the full pathname to this object */ 583218585Sjkim 584218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 585218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 586218585Sjkim if (ACPI_FAILURE (Status)) 587218585Sjkim { 588218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 589218585Sjkim return (AE_OK); 590218585Sjkim } 591218585Sjkim 592218585Sjkim AcpiOsPrintf ("%32s", (char *) Buffer.Pointer); 593218585Sjkim ACPI_FREE (Buffer.Pointer); 594218585Sjkim 595218585Sjkim /* Dump short info about the object */ 596218585Sjkim 597218585Sjkim (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL); 598218585Sjkim return (AE_OK); 599218585Sjkim} 600218585Sjkim 601218585Sjkim 602218585Sjkim/******************************************************************************* 603218585Sjkim * 604218585Sjkim * FUNCTION: AcpiDbDisplayObjects 605218585Sjkim * 606218585Sjkim * PARAMETERS: ObjTypeArg - Type of object to display 607218585Sjkim * DisplayCountArg - Max depth to display 608218585Sjkim * 609218585Sjkim * RETURN: None 610218585Sjkim * 611218585Sjkim * DESCRIPTION: Display objects in the namespace of the requested type 612218585Sjkim * 613218585Sjkim ******************************************************************************/ 614218585Sjkim 615218585SjkimACPI_STATUS 616218585SjkimAcpiDbDisplayObjects ( 617218585Sjkim char *ObjTypeArg, 618218585Sjkim char *DisplayCountArg) 619218585Sjkim{ 620218585Sjkim ACPI_WALK_INFO Info; 621218585Sjkim ACPI_OBJECT_TYPE Type; 622218585Sjkim 623218585Sjkim 624218585Sjkim /* Get the object type */ 625218585Sjkim 626218585Sjkim Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes); 627218585Sjkim if (Type == ACPI_TYPE_NOT_FOUND) 628218585Sjkim { 629218585Sjkim AcpiOsPrintf ("Invalid or unsupported argument\n"); 630218585Sjkim return (AE_OK); 631218585Sjkim } 632218585Sjkim 633218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 634218585Sjkim AcpiOsPrintf ( 635218585Sjkim "Objects of type [%s] defined in the current ACPI Namespace:\n", 636218585Sjkim AcpiUtGetTypeName (Type)); 637218585Sjkim 638218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 639218585Sjkim 640218585Sjkim Info.Count = 0; 641218585Sjkim Info.OwnerId = ACPI_OWNER_ID_MAX; 642218585Sjkim Info.DebugLevel = ACPI_UINT32_MAX; 643218585Sjkim Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 644218585Sjkim 645218585Sjkim /* Walk the namespace from the root */ 646218585Sjkim 647218585Sjkim (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 648218585Sjkim AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL); 649218585Sjkim 650218585Sjkim AcpiOsPrintf ( 651218585Sjkim "\nFound %u objects of type [%s] in the current ACPI Namespace\n", 652218585Sjkim Info.Count, AcpiUtGetTypeName (Type)); 653218585Sjkim 654218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 655218585Sjkim return (AE_OK); 656218585Sjkim} 657218585Sjkim 658218585Sjkim 659218585Sjkim/******************************************************************************* 660218585Sjkim * 661218585Sjkim * FUNCTION: AcpiDbIntegrityWalk 662218585Sjkim * 663218585Sjkim * PARAMETERS: Callback from WalkNamespace 664218585Sjkim * 665218585Sjkim * RETURN: Status 666218585Sjkim * 667218585Sjkim * DESCRIPTION: Examine one NS node for valid values. 668218585Sjkim * 669218585Sjkim ******************************************************************************/ 670218585Sjkim 671218585Sjkimstatic ACPI_STATUS 672218585SjkimAcpiDbIntegrityWalk ( 673218585Sjkim ACPI_HANDLE ObjHandle, 674218585Sjkim UINT32 NestingLevel, 675218585Sjkim void *Context, 676218585Sjkim void **ReturnValue) 677218585Sjkim{ 678218585Sjkim ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context; 679218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 680218585Sjkim ACPI_OPERAND_OBJECT *Object; 681218585Sjkim BOOLEAN Alias = TRUE; 682218585Sjkim 683218585Sjkim 684218585Sjkim Info->Nodes++; 685218585Sjkim 686218585Sjkim /* Verify the NS node, and dereference aliases */ 687218585Sjkim 688218585Sjkim while (Alias) 689218585Sjkim { 690218585Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 691218585Sjkim { 692218585Sjkim AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n", 693218585Sjkim Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node), 694218585Sjkim ACPI_DESC_TYPE_NAMED); 695218585Sjkim return (AE_OK); 696218585Sjkim } 697218585Sjkim 698218585Sjkim if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS) || 699218585Sjkim (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) 700218585Sjkim { 701218585Sjkim Node = (ACPI_NAMESPACE_NODE *) Node->Object; 702218585Sjkim } 703218585Sjkim else 704218585Sjkim { 705218585Sjkim Alias = FALSE; 706218585Sjkim } 707218585Sjkim } 708218585Sjkim 709218585Sjkim if (Node->Type > ACPI_TYPE_LOCAL_MAX) 710218585Sjkim { 711218585Sjkim AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n", 712218585Sjkim Node, Node->Type); 713218585Sjkim return (AE_OK); 714218585Sjkim } 715218585Sjkim 716250838Sjkim if (!AcpiUtValidAcpiName (Node->Name.Ascii)) 717218585Sjkim { 718218585Sjkim AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node); 719218585Sjkim return (AE_OK); 720218585Sjkim } 721218585Sjkim 722218585Sjkim Object = AcpiNsGetAttachedObject (Node); 723218585Sjkim if (Object) 724218585Sjkim { 725218585Sjkim Info->Objects++; 726218585Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND) 727218585Sjkim { 728218585Sjkim AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n", 729218585Sjkim Object, AcpiUtGetDescriptorName (Object)); 730218585Sjkim } 731218585Sjkim } 732218585Sjkim 733218585Sjkim return (AE_OK); 734218585Sjkim} 735218585Sjkim 736218585Sjkim 737218585Sjkim/******************************************************************************* 738218585Sjkim * 739218585Sjkim * FUNCTION: AcpiDbCheckIntegrity 740218585Sjkim * 741218585Sjkim * PARAMETERS: None 742218585Sjkim * 743218585Sjkim * RETURN: None 744218585Sjkim * 745218585Sjkim * DESCRIPTION: Check entire namespace for data structure integrity 746218585Sjkim * 747218585Sjkim ******************************************************************************/ 748218585Sjkim 749218585Sjkimvoid 750218585SjkimAcpiDbCheckIntegrity ( 751218585Sjkim void) 752218585Sjkim{ 753218585Sjkim ACPI_INTEGRITY_INFO Info = {0,0}; 754218585Sjkim 755218585Sjkim /* Search all nodes in namespace */ 756218585Sjkim 757218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 758218585Sjkim AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL); 759218585Sjkim 760218585Sjkim AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n", 761218585Sjkim Info.Nodes, Info.Objects); 762218585Sjkim} 763218585Sjkim 764218585Sjkim 765218585Sjkim/******************************************************************************* 766218585Sjkim * 767218585Sjkim * FUNCTION: AcpiDbWalkForReferences 768218585Sjkim * 769218585Sjkim * PARAMETERS: Callback from WalkNamespace 770218585Sjkim * 771218585Sjkim * RETURN: Status 772218585Sjkim * 773218585Sjkim * DESCRIPTION: Check if this namespace object refers to the target object 774218585Sjkim * that is passed in as the context value. 775218585Sjkim * 776218585Sjkim * Note: Currently doesn't check subobjects within the Node's object 777218585Sjkim * 778218585Sjkim ******************************************************************************/ 779218585Sjkim 780218585Sjkimstatic ACPI_STATUS 781218585SjkimAcpiDbWalkForReferences ( 782218585Sjkim ACPI_HANDLE ObjHandle, 783218585Sjkim UINT32 NestingLevel, 784218585Sjkim void *Context, 785218585Sjkim void **ReturnValue) 786218585Sjkim{ 787218585Sjkim ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context; 788218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 789218585Sjkim 790218585Sjkim 791218585Sjkim /* Check for match against the namespace node itself */ 792218585Sjkim 793218585Sjkim if (Node == (void *) ObjDesc) 794218585Sjkim { 795218585Sjkim AcpiOsPrintf ("Object is a Node [%4.4s]\n", 796218585Sjkim AcpiUtGetNodeName (Node)); 797218585Sjkim } 798218585Sjkim 799218585Sjkim /* Check for match against the object attached to the node */ 800218585Sjkim 801218585Sjkim if (AcpiNsGetAttachedObject (Node) == ObjDesc) 802218585Sjkim { 803218585Sjkim AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n", 804218585Sjkim Node, AcpiUtGetNodeName (Node)); 805218585Sjkim } 806218585Sjkim 807218585Sjkim return (AE_OK); 808218585Sjkim} 809218585Sjkim 810218585Sjkim 811218585Sjkim/******************************************************************************* 812218585Sjkim * 813218585Sjkim * FUNCTION: AcpiDbFindReferences 814218585Sjkim * 815218585Sjkim * PARAMETERS: ObjectArg - String with hex value of the object 816218585Sjkim * 817218585Sjkim * RETURN: None 818218585Sjkim * 819218585Sjkim * DESCRIPTION: Search namespace for all references to the input object 820218585Sjkim * 821218585Sjkim ******************************************************************************/ 822218585Sjkim 823218585Sjkimvoid 824218585SjkimAcpiDbFindReferences ( 825218585Sjkim char *ObjectArg) 826218585Sjkim{ 827218585Sjkim ACPI_OPERAND_OBJECT *ObjDesc; 828252279Sjkim ACPI_SIZE Address; 829218585Sjkim 830218585Sjkim 831218585Sjkim /* Convert string to object pointer */ 832218585Sjkim 833284583Sjkim Address = strtoul (ObjectArg, NULL, 16); 834252279Sjkim ObjDesc = ACPI_TO_POINTER (Address); 835218585Sjkim 836218585Sjkim /* Search all nodes in namespace */ 837218585Sjkim 838218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 839218585Sjkim AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL); 840218585Sjkim} 841218585Sjkim 842218585Sjkim 843218585Sjkim/******************************************************************************* 844218585Sjkim * 845218585Sjkim * FUNCTION: AcpiDbBusWalk 846218585Sjkim * 847218585Sjkim * PARAMETERS: Callback from WalkNamespace 848218585Sjkim * 849218585Sjkim * RETURN: Status 850218585Sjkim * 851218585Sjkim * DESCRIPTION: Display info about device objects that have a corresponding 852218585Sjkim * _PRT method. 853218585Sjkim * 854218585Sjkim ******************************************************************************/ 855218585Sjkim 856218585Sjkimstatic ACPI_STATUS 857218585SjkimAcpiDbBusWalk ( 858218585Sjkim ACPI_HANDLE ObjHandle, 859218585Sjkim UINT32 NestingLevel, 860218585Sjkim void *Context, 861218585Sjkim void **ReturnValue) 862218585Sjkim{ 863218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 864218585Sjkim ACPI_STATUS Status; 865218585Sjkim ACPI_BUFFER Buffer; 866218585Sjkim ACPI_NAMESPACE_NODE *TempNode; 867218585Sjkim ACPI_DEVICE_INFO *Info; 868218585Sjkim UINT32 i; 869218585Sjkim 870218585Sjkim 871218585Sjkim if ((Node->Type != ACPI_TYPE_DEVICE) && 872218585Sjkim (Node->Type != ACPI_TYPE_PROCESSOR)) 873218585Sjkim { 874218585Sjkim return (AE_OK); 875218585Sjkim } 876218585Sjkim 877218585Sjkim /* Exit if there is no _PRT under this device */ 878218585Sjkim 879218585Sjkim Status = AcpiGetHandle (Node, METHOD_NAME__PRT, 880218585Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &TempNode)); 881218585Sjkim if (ACPI_FAILURE (Status)) 882218585Sjkim { 883218585Sjkim return (AE_OK); 884218585Sjkim } 885218585Sjkim 886218585Sjkim /* Get the full path to this device object */ 887218585Sjkim 888218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 889218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 890218585Sjkim if (ACPI_FAILURE (Status)) 891218585Sjkim { 892218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 893218585Sjkim return (AE_OK); 894218585Sjkim } 895218585Sjkim 896218585Sjkim Status = AcpiGetObjectInfo (ObjHandle, &Info); 897218585Sjkim if (ACPI_FAILURE (Status)) 898218585Sjkim { 899218585Sjkim return (AE_OK); 900218585Sjkim } 901218585Sjkim 902218585Sjkim /* Display the full path */ 903218585Sjkim 904218585Sjkim AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type); 905218585Sjkim ACPI_FREE (Buffer.Pointer); 906218585Sjkim 907218585Sjkim if (Info->Flags & ACPI_PCI_ROOT_BRIDGE) 908218585Sjkim { 909218585Sjkim AcpiOsPrintf (" - Is PCI Root Bridge"); 910218585Sjkim } 911218585Sjkim AcpiOsPrintf ("\n"); 912218585Sjkim 913218585Sjkim /* _PRT info */ 914218585Sjkim 915218585Sjkim AcpiOsPrintf ("_PRT: %p\n", TempNode); 916218585Sjkim 917218585Sjkim /* Dump _ADR, _HID, _UID, _CID */ 918218585Sjkim 919218585Sjkim if (Info->Valid & ACPI_VALID_ADR) 920218585Sjkim { 921218585Sjkim AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address)); 922218585Sjkim } 923218585Sjkim else 924218585Sjkim { 925218585Sjkim AcpiOsPrintf ("_ADR: <Not Present>\n"); 926218585Sjkim } 927218585Sjkim 928218585Sjkim if (Info->Valid & ACPI_VALID_HID) 929218585Sjkim { 930218585Sjkim AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String); 931218585Sjkim } 932218585Sjkim else 933218585Sjkim { 934218585Sjkim AcpiOsPrintf ("_HID: <Not Present>\n"); 935218585Sjkim } 936218585Sjkim 937218585Sjkim if (Info->Valid & ACPI_VALID_UID) 938218585Sjkim { 939218585Sjkim AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String); 940218585Sjkim } 941218585Sjkim else 942218585Sjkim { 943218585Sjkim AcpiOsPrintf ("_UID: <Not Present>\n"); 944218585Sjkim } 945218585Sjkim 946218585Sjkim if (Info->Valid & ACPI_VALID_CID) 947218585Sjkim { 948218585Sjkim for (i = 0; i < Info->CompatibleIdList.Count; i++) 949218585Sjkim { 950218585Sjkim AcpiOsPrintf ("_CID: %s\n", 951218585Sjkim Info->CompatibleIdList.Ids[i].String); 952218585Sjkim } 953218585Sjkim } 954218585Sjkim else 955218585Sjkim { 956218585Sjkim AcpiOsPrintf ("_CID: <Not Present>\n"); 957218585Sjkim } 958218585Sjkim 959218585Sjkim ACPI_FREE (Info); 960218585Sjkim return (AE_OK); 961218585Sjkim} 962218585Sjkim 963218585Sjkim 964218585Sjkim/******************************************************************************* 965218585Sjkim * 966218585Sjkim * FUNCTION: AcpiDbGetBusInfo 967218585Sjkim * 968218585Sjkim * PARAMETERS: None 969218585Sjkim * 970218585Sjkim * RETURN: None 971218585Sjkim * 972218585Sjkim * DESCRIPTION: Display info about system busses. 973218585Sjkim * 974218585Sjkim ******************************************************************************/ 975218585Sjkim 976218585Sjkimvoid 977218585SjkimAcpiDbGetBusInfo ( 978218585Sjkim void) 979218585Sjkim{ 980218585Sjkim /* Search all nodes in namespace */ 981218585Sjkim 982218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 983218585Sjkim AcpiDbBusWalk, NULL, NULL, NULL); 984218585Sjkim} 985218585Sjkim 986218585Sjkim#endif /* ACPI_DEBUGGER */ 987