dbcmds.c revision 73561
1/******************************************************************************* 2 * 3 * Module Name: dbcmds - debug commands and output routines 4 * $Revision: 46 $ 5 * 6 ******************************************************************************/ 7 8/****************************************************************************** 9 * 10 * 1. Copyright Notice 11 * 12 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. 13 * All rights reserved. 14 * 15 * 2. License 16 * 17 * 2.1. This is your license from Intel Corp. under its intellectual property 18 * rights. You may have additional license terms from the party that provided 19 * you this software, covering your right to use that party's intellectual 20 * property rights. 21 * 22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23 * copy of the source code appearing in this file ("Covered Code") an 24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25 * base code distributed originally by Intel ("Original Intel Code") to copy, 26 * make derivatives, distribute, use and display any portion of the Covered 27 * Code in any form, with the right to sublicense such rights; and 28 * 29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30 * license (with the right to sublicense), under only those claims of Intel 31 * patents that are infringed by the Original Intel Code, to make, use, sell, 32 * offer to sell, and import the Covered Code and derivative works thereof 33 * solely to the minimum extent necessary to exercise the above copyright 34 * license, and in no event shall the patent license extend to any additions 35 * to or modifications of the Original Intel Code. No other license or right 36 * is granted directly or by implication, estoppel or otherwise; 37 * 38 * The above copyright and patent license is granted only if the following 39 * conditions are met: 40 * 41 * 3. Conditions 42 * 43 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44 * Redistribution of source code of any substantial portion of the Covered 45 * Code or modification with rights to further distribute source must include 46 * the above Copyright Notice, the above License, this list of Conditions, 47 * and the following Disclaimer and Export Compliance provision. In addition, 48 * Licensee must cause all Covered Code to which Licensee contributes to 49 * contain a file documenting the changes Licensee made to create that Covered 50 * Code and the date of any change. Licensee must include in that file the 51 * documentation of any changes made by any predecessor Licensee. Licensee 52 * must include a prominent statement that the modification is derived, 53 * directly or indirectly, from Original Intel Code. 54 * 55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56 * Redistribution of source code of any substantial portion of the Covered 57 * Code or modification without rights to further distribute source must 58 * include the following Disclaimer and Export Compliance provision in the 59 * documentation and/or other materials provided with distribution. In 60 * addition, Licensee may not authorize further sublicense of source of any 61 * portion of the Covered Code, and must include terms to the effect that the 62 * license from Licensee to its licensee is limited to the intellectual 63 * property embodied in the software Licensee provides to its licensee, and 64 * not to intellectual property embodied in modifications its licensee may 65 * make. 66 * 67 * 3.3. Redistribution of Executable. Redistribution in executable form of any 68 * substantial portion of the Covered Code or modification must reproduce the 69 * above Copyright Notice, and the following Disclaimer and Export Compliance 70 * provision in the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3.4. Intel retains all right, title, and interest in and to the Original 74 * Intel Code. 75 * 76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77 * Intel shall be used in advertising or otherwise to promote the sale, use or 78 * other dealings in products derived from or relating to the Covered Code 79 * without prior written authorization from Intel. 80 * 81 * 4. Disclaimer and Export Compliance 82 * 83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89 * PARTICULAR PURPOSE. 90 * 91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98 * LIMITED REMEDY. 99 * 100 * 4.3. Licensee shall not export, either directly or indirectly, any of this 101 * software or system incorporating such software without first obtaining any 102 * required license or other approval from the U. S. Department of Commerce or 103 * any other agency or department of the United States Government. In the 104 * event Licensee exports any such software from the United States or 105 * re-exports any such software from a foreign destination, Licensee shall 106 * ensure that the distribution and export/re-export of the software is in 107 * compliance with all laws, regulations, orders, or other restrictions of the 108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109 * any of its subsidiaries will export/re-export any technical data, process, 110 * software, or service, directly or indirectly, to any country for which the 111 * United States government or any agency thereof requires an export license, 112 * other governmental approval, or letter of assurance, without first obtaining 113 * such license, approval or letter. 114 * 115 *****************************************************************************/ 116 117 118#include "acpi.h" 119#include "acparser.h" 120#include "acdispat.h" 121#include "amlcode.h" 122#include "acnamesp.h" 123#include "acparser.h" 124#include "acevents.h" 125#include "acinterp.h" 126#include "acdebug.h" 127#include "actables.h" 128 129#ifdef ENABLE_DEBUGGER 130 131#define _COMPONENT DEBUGGER 132 MODULE_NAME ("dbcmds") 133 134 135/* 136 * Arguments for the Objects command 137 * These object types map directly to the ACPI_TYPES 138 */ 139 140ARGUMENT_INFO AcpiDbObjectTypes [] = 141{ 142 {"ANY"}, 143 {"NUMBERS"}, 144 {"STRINGS"}, 145 {"BUFFERS"}, 146 {"PACKAGES"}, 147 {"FIELDS"}, 148 {"DEVICES"}, 149 {"EVENTS"}, 150 {"METHODS"}, 151 {"MUTEXES"}, 152 {"REGIONS"}, 153 {"POWERRESOURCES"}, 154 {"PROCESSORS"}, 155 {"THERMALZONES"}, 156 {"BUFFERFIELDS"}, 157 {"DDBHANDLES"}, 158 {NULL} /* Must be null terminated */ 159}; 160 161 162/******************************************************************************* 163 * 164 * FUNCTION: AcpiDbWalkForReferences 165 * 166 * PARAMETERS: Callback from WalkNamespace 167 * 168 * RETURN: Status 169 * 170 * DESCRIPTION: Check if this namespace object refers to the target object 171 * that is passed in as the context value. 172 * 173 ******************************************************************************/ 174 175ACPI_STATUS 176AcpiDbWalkForReferences ( 177 ACPI_HANDLE ObjHandle, 178 UINT32 NestingLevel, 179 void *Context, 180 void **ReturnValue) 181{ 182 ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context; 183 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 184 185 186 /* Check for match against the namespace node itself */ 187 188 if (Node == (void *) ObjDesc) 189 { 190 AcpiOsPrintf ("Object is a Node [%4.4s]\n", &Node->Name); 191 } 192 193 /* Check for match against the object attached to the node */ 194 195 if (Node->Object == ObjDesc) 196 { 197 AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n", Node, &Node->Name); 198 } 199 200 /* Check first child for a match */ 201 /* TBD: [Investigate] probably now obsolete with new datastructure */ 202 203 if (Node->Child == (void *) ObjDesc) 204 { 205 AcpiOsPrintf ("Reference at Node->Child %p [%4.4s]\n", Node, &Node->Name); 206 } 207 208 return (AE_OK); 209} 210 211 212/******************************************************************************* 213 * 214 * FUNCTION: AcpiDbFindReferences 215 * 216 * PARAMETERS: ObjectArg - String with hex value of the object 217 * 218 * RETURN: None 219 * 220 * DESCRIPTION: Search namespace for all references to the input object 221 * 222 ******************************************************************************/ 223 224void 225AcpiDbFindReferences ( 226 NATIVE_CHAR *ObjectArg) 227{ 228 ACPI_OPERAND_OBJECT *ObjDesc; 229 230 231 /* Convert string to object pointer */ 232 233 ObjDesc = (ACPI_OPERAND_OBJECT *) STRTOUL (ObjectArg, NULL, 16); 234 235 /* Search all nodes in namespace */ 236 237 AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 238 AcpiDbWalkForReferences, (void *) ObjDesc, NULL); 239} 240 241 242/******************************************************************************* 243 * 244 * FUNCTION: AcpiDbDisplayTableInfo 245 * 246 * PARAMETERS: TableArg - String with name of table to be displayed 247 * 248 * RETURN: None 249 * 250 * DESCRIPTION: Display information about loaded tables. Current 251 * implementation displays all loaded tables. 252 * 253 ******************************************************************************/ 254 255void 256AcpiDbDisplayTableInfo ( 257 NATIVE_CHAR *TableArg) 258{ 259 UINT32 i; 260 261 262 for (i = 0; i < NUM_ACPI_TABLES; i++) 263 { 264 if (AcpiGbl_AcpiTables[i].Pointer) 265 { 266 AcpiOsPrintf ("%s at %p length %X\n", AcpiGbl_AcpiTableData[i].Name, 267 AcpiGbl_AcpiTables[i].Pointer, AcpiGbl_AcpiTables[i].Length); 268 } 269 } 270} 271 272 273/******************************************************************************* 274 * 275 * FUNCTION: AcpiDbUnloadAcpiTable 276 * 277 * PARAMETERS: TableArg - Name of the table to be unloaded 278 * InstanceArg - Which instance of the table to unload (if 279 * there are multiple tables of the same type) 280 * 281 * RETURN: Nonde 282 * 283 * DESCRIPTION: Unload an ACPI table. 284 * Instance is not implemented 285 * 286 ******************************************************************************/ 287 288void 289AcpiDbUnloadAcpiTable ( 290 NATIVE_CHAR *TableArg, 291 NATIVE_CHAR *InstanceArg) 292{ 293 UINT32 i; 294 ACPI_STATUS Status; 295 296 297 /* Search all tables for the target type */ 298 299 for (i = 0; i < NUM_ACPI_TABLES; i++) 300 { 301 if (!STRNCMP (TableArg, AcpiGbl_AcpiTableData[i].Signature, AcpiGbl_AcpiTableData[i].SigLength)) 302 { 303 /* Found the table, unload it */ 304 305 Status = AcpiUnloadTable (i); 306 if (ACPI_SUCCESS (Status)) 307 { 308 AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg); 309 } 310 else 311 { 312 AcpiOsPrintf ("%s, while unloading [%s]\n", AcpiCmFormatException (Status), TableArg); 313 } 314 315 return; 316 } 317 } 318 319 AcpiOsPrintf ("Unknown table type [%s]\n", TableArg); 320} 321 322 323/******************************************************************************* 324 * 325 * FUNCTION: AcpiDbSetMethodBreakpoint 326 * 327 * PARAMETERS: Location - AML offset of breakpoint 328 * WalkState - Current walk info 329 * Op - Current Op (from parse walk) 330 * 331 * RETURN: None 332 * 333 * DESCRIPTION: Set a breakpoint in a control method at the specified 334 * AML offset 335 * 336 ******************************************************************************/ 337 338void 339AcpiDbSetMethodBreakpoint ( 340 NATIVE_CHAR *Location, 341 ACPI_WALK_STATE *WalkState, 342 ACPI_PARSE_OBJECT *Op) 343{ 344 UINT32 Address; 345 346 347 if (!Op) 348 { 349 AcpiOsPrintf ("There is no method currently executing\n"); 350 return; 351 } 352 353 /* Get and verify the breakpoint address */ 354 355 Address = STRTOUL (Location, NULL, 16); 356 if (Address <= Op->AmlOffset) 357 { 358 AcpiOsPrintf ("Breakpoint %X is beyond current address %X\n", Address, Op->AmlOffset); 359 } 360 361 /* Save breakpoint in current walk */ 362 363 WalkState->MethodBreakpoint = Address; 364 AcpiOsPrintf ("Breakpoint set at AML offset %X\n", Address); 365} 366 367 368/******************************************************************************* 369 * 370 * FUNCTION: AcpiDbSetMethodCallBreakpoint 371 * 372 * PARAMETERS: Op - Current Op (from parse walk) 373 * 374 * RETURN: None 375 * 376 * DESCRIPTION: Set a breakpoint in a control method at the specified 377 * AML offset 378 * 379 ******************************************************************************/ 380 381void 382AcpiDbSetMethodCallBreakpoint ( 383 ACPI_PARSE_OBJECT *Op) 384{ 385 386 387 if (!Op) 388 { 389 AcpiOsPrintf ("There is no method currently executing\n"); 390 return; 391 } 392 393 394 AcpiGbl_StepToNextCall = TRUE; 395} 396 397 398/******************************************************************************* 399 * 400 * FUNCTION: AcpiDbDisassembleAml 401 * 402 * PARAMETERS: Statements - Number of statements to disassemble 403 * Op - Current Op (from parse walk) 404 * 405 * RETURN: None 406 * 407 * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number 408 * of statements specified. 409 * 410 ******************************************************************************/ 411 412void 413AcpiDbDisassembleAml ( 414 NATIVE_CHAR *Statements, 415 ACPI_PARSE_OBJECT *Op) 416{ 417 UINT32 NumStatements = 8; 418 419 420 if (!Op) 421 { 422 AcpiOsPrintf ("There is no method currently executing\n"); 423 return; 424 } 425 426 if (Statements) 427 { 428 NumStatements = STRTOUL (Statements, NULL, 0); 429 } 430 431 432 AcpiDbDisplayOp (NULL, Op, NumStatements); 433} 434 435 436/******************************************************************************* 437 * 438 * FUNCTION: AcpiDbDumpNamespace 439 * 440 * PARAMETERS: StartArg - Node to begin namespace dump 441 * DepthArg - Maximum tree depth to be dumped 442 * 443 * RETURN: None 444 * 445 * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed 446 * with type and other information. 447 * 448 ******************************************************************************/ 449 450void 451AcpiDbDumpNamespace ( 452 NATIVE_CHAR *StartArg, 453 NATIVE_CHAR *DepthArg) 454{ 455 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 456 UINT32 MaxDepth = ACPI_UINT32_MAX; 457 458 459 /* No argument given, just start at the root and dump entire namespace */ 460 461 if (StartArg) 462 { 463 /* Check if numeric argument, must be a Node */ 464 465 if ((StartArg[0] >= 0x30) && (StartArg[0] <= 0x39)) 466 { 467 SubtreeEntry = (ACPI_HANDLE) STRTOUL (StartArg, NULL, 16); 468 if (!AcpiOsReadable (SubtreeEntry, sizeof (ACPI_NAMESPACE_NODE))) 469 { 470 AcpiOsPrintf ("Address %p is invalid in this address space\n", SubtreeEntry); 471 return; 472 } 473 474 if (!VALID_DESCRIPTOR_TYPE ((SubtreeEntry), ACPI_DESC_TYPE_NAMED)) 475 { 476 AcpiOsPrintf ("Address %p is not a valid Named object\n", SubtreeEntry); 477 return; 478 } 479 } 480 481 /* Alpha argument */ 482 483 else 484 { 485 /* The parameter is a name string that must be resolved to a Named obj*/ 486 487 SubtreeEntry = AcpiDbLocalNsLookup (StartArg); 488 if (!SubtreeEntry) 489 { 490 SubtreeEntry = AcpiGbl_RootNode; 491 } 492 } 493 494 /* Now we can check for the depth argument */ 495 496 if (DepthArg) 497 { 498 MaxDepth = STRTOUL (DepthArg, NULL, 0); 499 } 500 } 501 502 503 AcpiDbSetOutputDestination (DB_DUPLICATE_OUTPUT); 504 AcpiOsPrintf ("ACPI Namespace (from %p subtree):\n", SubtreeEntry); 505 506 /* Display the subtree */ 507 508 AcpiDbSetOutputDestination (DB_REDIRECTABLE_OUTPUT); 509 AcpiNsDumpObjects (ACPI_TYPE_ANY, MaxDepth, ACPI_UINT32_MAX, SubtreeEntry); 510 AcpiDbSetOutputDestination (DB_CONSOLE_OUTPUT); 511} 512 513 514/******************************************************************************* 515 * 516 * FUNCTION: AcpiDbDumpNamespaceByOwner 517 * 518 * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed 519 * DepthArg - Maximum tree depth to be dumped 520 * 521 * RETURN: None 522 * 523 * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId. 524 * 525 ******************************************************************************/ 526 527void 528AcpiDbDumpNamespaceByOwner ( 529 NATIVE_CHAR *OwnerArg, 530 NATIVE_CHAR *DepthArg) 531{ 532 ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 533 UINT32 MaxDepth = ACPI_UINT32_MAX; 534 UINT16 OwnerId; 535 536 537 OwnerId = (UINT16) STRTOUL (OwnerArg, NULL, 0); 538 539 540 /* Now we can check for the depth argument */ 541 542 if (DepthArg) 543 { 544 MaxDepth = STRTOUL (DepthArg, NULL, 0); 545 } 546 547 548 AcpiDbSetOutputDestination (DB_DUPLICATE_OUTPUT); 549 AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId); 550 551 /* Display the subtree */ 552 553 AcpiDbSetOutputDestination (DB_REDIRECTABLE_OUTPUT); 554 AcpiNsDumpObjects (ACPI_TYPE_ANY, MaxDepth, OwnerId, SubtreeEntry); 555 AcpiDbSetOutputDestination (DB_CONSOLE_OUTPUT); 556} 557 558 559/******************************************************************************* 560 * 561 * FUNCTION: AcpiDbSendNotify 562 * 563 * PARAMETERS: Name - Name of ACPI object to send the notify to 564 * Value - Value of the notify to send. 565 * 566 * RETURN: None 567 * 568 * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 569 * named object as an ACPI notify. 570 * 571 ******************************************************************************/ 572 573void 574AcpiDbSendNotify ( 575 NATIVE_CHAR *Name, 576 UINT32 Value) 577{ 578 ACPI_NAMESPACE_NODE *Node; 579 580 581 /* Translate name to an Named object */ 582 583 Node = AcpiDbLocalNsLookup (Name); 584 if (!Node) 585 { 586 return; 587 } 588 589 /* Decode Named object type */ 590 591 switch (Node->Type) 592 { 593 case ACPI_TYPE_DEVICE: 594 case ACPI_TYPE_THERMAL: 595 596 /* Send the notify */ 597 598 AcpiEvNotifyDispatch (Node, Value); 599 break; 600 601 default: 602 AcpiOsPrintf ("Named object is not a device or a thermal object\n"); 603 break; 604 } 605 606} 607 608 609/******************************************************************************* 610 * 611 * FUNCTION: AcpiDbSetMethodData 612 * 613 * PARAMETERS: TypeArg - L for local, A for argument 614 * IndexArg - which one 615 * ValueArg - Value to set. 616 * 617 * RETURN: None 618 * 619 * DESCRIPTION: Set a local or argument for the running control method. 620 * NOTE: only object supported is Number. 621 * 622 ******************************************************************************/ 623 624void 625AcpiDbSetMethodData ( 626 NATIVE_CHAR *TypeArg, 627 NATIVE_CHAR *IndexArg, 628 NATIVE_CHAR *ValueArg) 629{ 630 NATIVE_CHAR Type; 631 UINT32 Index; 632 UINT32 Value; 633 ACPI_WALK_STATE *WalkState; 634 ACPI_OPERAND_OBJECT *ObjDesc; 635 636 637 /* Validate TypeArg */ 638 639 STRUPR (TypeArg); 640 Type = TypeArg[0]; 641 if ((Type != 'L') && 642 (Type != 'A')) 643 { 644 AcpiOsPrintf ("Invalid SET operand: %s\n", TypeArg); 645 return; 646 } 647 648 /* Get the index and value */ 649 650 Index = STRTOUL (IndexArg, NULL, 16); 651 Value = STRTOUL (ValueArg, NULL, 16); 652 653 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 654 if (!WalkState) 655 { 656 AcpiOsPrintf ("There is no method currently executing\n"); 657 return; 658 } 659 660 661 /* Create and initialize the new object */ 662 663 ObjDesc = AcpiCmCreateInternalObject (ACPI_TYPE_INTEGER); 664 if (!ObjDesc) 665 { 666 AcpiOsPrintf ("Could not create an internal object\n"); 667 return; 668 } 669 670 ObjDesc->Integer.Value = Value; 671 672 673 /* Store the new object into the target */ 674 675 switch (Type) 676 { 677 case 'A': 678 679 /* Set a method argument */ 680 681 if (Index > MTH_NUM_ARGS) 682 { 683 AcpiOsPrintf ("Arg%d - Invalid argument name\n", Index); 684 return; 685 } 686 687 AcpiDsMethodDataSetValue (MTH_TYPE_ARG, Index, ObjDesc, WalkState); 688 ObjDesc = WalkState->Arguments[Index].Object; 689 690 AcpiOsPrintf ("Arg%d: ", Index); 691 AcpiDbDisplayInternalObject (ObjDesc, WalkState); 692 break; 693 694 case 'L': 695 696 /* Set a method local */ 697 698 if (Index > MTH_NUM_LOCALS) 699 { 700 AcpiOsPrintf ("Local%d - Invalid local variable name\n", Index); 701 return; 702 } 703 704 AcpiDsMethodDataSetValue (MTH_TYPE_LOCAL, Index, ObjDesc, WalkState); 705 ObjDesc = WalkState->LocalVariables[Index].Object; 706 707 AcpiOsPrintf ("Local%d: ", Index); 708 AcpiDbDisplayInternalObject (ObjDesc, WalkState); 709 break; 710 711 default: 712 break; 713 } 714} 715 716 717/******************************************************************************* 718 * 719 * FUNCTION: AcpiDbWalkForSpecificObjects 720 * 721 * PARAMETERS: Callback from WalkNamespace 722 * 723 * RETURN: Status 724 * 725 * DESCRIPTION: Display short info about objects in the namespace 726 * 727 ******************************************************************************/ 728 729ACPI_STATUS 730AcpiDbWalkForSpecificObjects ( 731 ACPI_HANDLE ObjHandle, 732 UINT32 NestingLevel, 733 void *Context, 734 void **ReturnValue) 735{ 736 ACPI_OPERAND_OBJECT *ObjDesc; 737 ACPI_STATUS Status; 738 UINT32 BufSize; 739 NATIVE_CHAR Buffer[64]; 740 741 742 ObjDesc = ((ACPI_NAMESPACE_NODE *)ObjHandle)->Object; 743 BufSize = sizeof (Buffer) / sizeof (*Buffer); 744 745 /* Get and display the full pathname to this object */ 746 747 Status = AcpiNsHandleToPathname (ObjHandle, &BufSize, Buffer); 748 749 if (ACPI_FAILURE (Status)) 750 { 751 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 752 return (AE_OK); 753 } 754 755 AcpiOsPrintf ("%32s", Buffer); 756 757 758 /* Display short information about the object */ 759 760 if (ObjDesc) 761 { 762 switch (ObjDesc->Common.Type) 763 { 764 case ACPI_TYPE_METHOD: 765 AcpiOsPrintf (" #Args %d Concurrency %X", ObjDesc->Method.ParamCount, ObjDesc->Method.Concurrency); 766 break; 767 768 case ACPI_TYPE_INTEGER: 769 AcpiOsPrintf (" Value %X", ObjDesc->Integer.Value); 770 break; 771 772 case ACPI_TYPE_STRING: 773 AcpiOsPrintf (" \"%s\"", ObjDesc->String.Pointer); 774 break; 775 776 case ACPI_TYPE_REGION: 777 AcpiOsPrintf (" SpaceId %X Address %X Length %X", ObjDesc->Region.SpaceId, ObjDesc->Region.Address, ObjDesc->Region.Length); 778 break; 779 780 case ACPI_TYPE_PACKAGE: 781 AcpiOsPrintf (" #Elements %X", ObjDesc->Package.Count); 782 break; 783 784 case ACPI_TYPE_BUFFER: 785 AcpiOsPrintf (" Length %X", ObjDesc->Buffer.Length); 786 break; 787 } 788 } 789 790 AcpiOsPrintf ("\n"); 791 return (AE_OK); 792} 793 794 795/******************************************************************************* 796 * 797 * FUNCTION: AcpiDbDisplayObjects 798 * 799 * PARAMETERS: ObjTypeArg - Type of object to display 800 * DisplayCountArg - Max depth to display 801 * 802 * RETURN: None 803 * 804 * DESCRIPTION: Display objects in the namespace of the requested type 805 * 806 ******************************************************************************/ 807 808ACPI_STATUS 809AcpiDbDisplayObjects ( 810 NATIVE_CHAR *ObjTypeArg, 811 NATIVE_CHAR *DisplayCountArg) 812{ 813 UINT32 DisplayCount; 814 OBJECT_TYPE_INTERNAL Type; 815 816 817 /* Get the object type */ 818 819 STRUPR (ObjTypeArg); 820 Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes); 821 if (Type == ACPI_TYPE_NOT_FOUND) 822 { 823 AcpiOsPrintf ("Invalid or unsupported argument\n"); 824 return (AE_OK); 825 } 826 827 /* Get the display depth */ 828 829 if (DisplayCountArg) 830 { 831 DisplayCount = STRTOUL (DisplayCountArg, NULL, 0); 832 } 833 834 else 835 { 836 DisplayCount = ACPI_UINT32_MAX; 837 } 838 839 AcpiDbSetOutputDestination (DB_DUPLICATE_OUTPUT); 840 AcpiOsPrintf ("Objects of type [%s] defined in the current ACPI Namespace: \n", AcpiCmGetTypeName (Type)); 841 842 AcpiDbSetOutputDestination (DB_REDIRECTABLE_OUTPUT); 843 844 /* Walk the namespace from the root */ 845 846 AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 847 AcpiDbWalkForSpecificObjects, (void *) &Type, NULL); 848 849 AcpiDbSetOutputDestination (DB_CONSOLE_OUTPUT); 850 return (AE_OK); 851} 852 853 854/******************************************************************************* 855 * 856 * FUNCTION: AcpiDbWalkAndMatchName 857 * 858 * PARAMETERS: Callback from WalkNamespace 859 * 860 * RETURN: Status 861 * 862 * DESCRIPTION: Find a particular name/names within the namespace. Wildcards 863 * are supported -- '?' matches any character. 864 * 865 ******************************************************************************/ 866 867ACPI_STATUS 868AcpiDbWalkAndMatchName ( 869 ACPI_HANDLE ObjHandle, 870 UINT32 NestingLevel, 871 void *Context, 872 void **ReturnValue) 873{ 874 ACPI_OPERAND_OBJECT *ObjDesc; 875 ACPI_STATUS Status; 876 NATIVE_CHAR *RequestedName = (NATIVE_CHAR *) Context; 877 UINT32 i; 878 UINT32 BufSize; 879 NATIVE_CHAR Buffer[96]; 880 881 882 ObjDesc = ((ACPI_NAMESPACE_NODE *)ObjHandle)->Object; 883 884 885 /* Check for a name match */ 886 887 for (i = 0; i < 4; i++) 888 { 889 /* Wildcard support */ 890 891 if ((RequestedName[i] != '?') && 892 (RequestedName[i] != ((NATIVE_CHAR *) (&((ACPI_NAMESPACE_NODE *) ObjHandle)->Name))[i])) 893 { 894 /* No match, just exit */ 895 896 return (AE_OK); 897 } 898 } 899 900 901 /* Get the full pathname to this object */ 902 903 BufSize = sizeof (Buffer) / sizeof (*Buffer); 904 905 Status = AcpiNsHandleToPathname (ObjHandle, &BufSize, Buffer); 906 if (ACPI_FAILURE (Status)) 907 { 908 AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 909 } 910 911 else 912 { 913 AcpiOsPrintf ("%32s (%p) - %s\n", Buffer, ObjHandle, 914 AcpiCmGetTypeName (((ACPI_NAMESPACE_NODE *) ObjHandle)->Type)); 915 } 916 917 return (AE_OK); 918} 919 920 921/******************************************************************************* 922 * 923 * FUNCTION: AcpiDbFindNameInNamespace 924 * 925 * PARAMETERS: NameArg - The 4-character ACPI name to find. 926 * wildcards are supported. 927 * 928 * RETURN: None 929 * 930 * DESCRIPTION: Search the namespace for a given name (with wildcards) 931 * 932 ******************************************************************************/ 933 934ACPI_STATUS 935AcpiDbFindNameInNamespace ( 936 NATIVE_CHAR *NameArg) 937{ 938 939 if (STRLEN (NameArg) > 4) 940 { 941 AcpiOsPrintf ("Name must be no longer than 4 characters\n"); 942 return (AE_OK); 943 } 944 945 /* Walk the namespace from the root */ 946 947 AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 948 AcpiDbWalkAndMatchName, NameArg, NULL); 949 950 AcpiDbSetOutputDestination (DB_CONSOLE_OUTPUT); 951 return (AE_OK); 952} 953 954 955/******************************************************************************* 956 * 957 * FUNCTION: AcpiDbSetScope 958 * 959 * PARAMETERS: Name - New scope path 960 * 961 * RETURN: Status 962 * 963 * DESCRIPTION: Set the "current scope" as maintained by this utility. 964 * The scope is used as a prefix to ACPI paths. 965 * 966 ******************************************************************************/ 967 968void 969AcpiDbSetScope ( 970 NATIVE_CHAR *Name) 971{ 972 973 if (!Name || Name[0] == 0) 974 { 975 AcpiOsPrintf ("Current scope: %s\n", ScopeBuf); 976 return; 977 } 978 979 AcpiDbPrepNamestring (Name); 980 981 /* TBD: [Future] Validate scope here */ 982 983 if (Name[0] == '\\') 984 { 985 STRCPY (ScopeBuf, Name); 986 STRCAT (ScopeBuf, "\\"); 987 } 988 989 else 990 { 991 STRCAT (ScopeBuf, Name); 992 STRCAT (ScopeBuf, "\\"); 993 } 994 995 AcpiOsPrintf ("New scope: %s\n", ScopeBuf); 996} 997 998 999/******************************************************************************* 1000 * 1001 * FUNCTION: AcpiDbDisplayResources 1002 * 1003 * PARAMETERS: ObjectArg - String with hex value of the object 1004 * 1005 * RETURN: None 1006 * 1007 * DESCRIPTION: 1008 * 1009 ******************************************************************************/ 1010 1011void 1012AcpiDbDisplayResources ( 1013 NATIVE_CHAR *ObjectArg) 1014{ 1015 ACPI_OPERAND_OBJECT *ObjDesc; 1016 ACPI_STATUS Status; 1017 ACPI_BUFFER ReturnObj; 1018 PCI_ROUTING_TABLE *Prt; 1019 UINT32 i; 1020 1021 1022 AcpiDbSetOutputDestination (DB_REDIRECTABLE_OUTPUT); 1023 1024 /* Convert string to object pointer */ 1025 1026 ObjDesc = (ACPI_OPERAND_OBJECT *) STRTOUL (ObjectArg, NULL, 16); 1027 1028 /* Prepare for a return object of arbitrary size */ 1029 1030 ReturnObj.Pointer = Buffer; 1031 ReturnObj.Length = BUFFER_SIZE; 1032 1033 Status = AcpiEvaluateObject (ObjDesc, "_PRT", NULL, &ReturnObj); 1034 if (ACPI_FAILURE (Status)) 1035 { 1036 AcpiOsPrintf ("Could not obtain _PRT: %s\n", AcpiCmFormatException (Status)); 1037 goto Cleanup; 1038 } 1039 1040 ReturnObj.Pointer = Buffer; 1041 ReturnObj.Length = BUFFER_SIZE; 1042 1043 Status = AcpiGetIrqRoutingTable (ObjDesc, &ReturnObj); 1044 if (ACPI_FAILURE (Status)) 1045 { 1046 AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", AcpiCmFormatException (Status)); 1047 goto Cleanup; 1048 } 1049 1050 Prt = (PCI_ROUTING_TABLE *) Buffer; 1051 i = 0; 1052 while ((char *) Prt < (Buffer + ReturnObj.Length)) 1053 { 1054 AcpiOsPrintf ("Prt[%d] Src=%s: Addr=%X\n", i, Prt->Source, Prt->Address); 1055 i++; 1056 Prt = (PCI_ROUTING_TABLE *) (((char *) Prt) + Prt->Length); 1057 } 1058 1059Cleanup: 1060 1061 AcpiDbSetOutputDestination (DB_CONSOLE_OUTPUT); 1062 return; 1063 1064} 1065 1066 1067 1068 1069 1070#endif /* ENABLE_DEBUGGER */ 1071