1 /*******************************************************************************
   2  *
   3  * Module Name: dbcmds - Miscellaneous debug commands and output routines
   4  *
   5  ******************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2011, 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 "acpi.h"
  46 #include "accommon.h"
  47 #include "acevents.h"
  48 #include "acdebug.h"
  49 #include "acresrc.h"
  50 #include "actables.h"
  51 
  52 #ifdef ACPI_DEBUGGER
  53 
  54 #define _COMPONENT          ACPI_CA_DEBUGGER
  55         ACPI_MODULE_NAME    ("dbcmds")
  56 
  57 
  58 /* Local prototypes */
  59 
  60 static void
  61 AcpiDmCompareAmlResources (
  62     UINT8                   *Aml1Buffer,
  63     ACPI_RSDESC_SIZE        Aml1BufferLength,
  64     UINT8                   *Aml2Buffer,
  65     ACPI_RSDESC_SIZE        Aml2BufferLength);
  66 
  67 static ACPI_STATUS
  68 AcpiDmTestResourceConversion (
  69     ACPI_NAMESPACE_NODE     *Node,
  70     char                    *Name);
  71 
  72 
  73 /*******************************************************************************
  74  *
  75  * FUNCTION:    AcpiDbConvertToNode
  76  *
  77  * PARAMETERS:  InString        - String to convert
  78  *
  79  * RETURN:      Pointer to a NS node
  80  *
  81  * DESCRIPTION: Convert a string to a valid NS pointer.  Handles numeric or
  82  *              alpha strings.
  83  *
  84  ******************************************************************************/
  85 
  86 ACPI_NAMESPACE_NODE *
  87 AcpiDbConvertToNode (
  88     char                    *InString)
  89 {
  90     ACPI_NAMESPACE_NODE     *Node;
  91 
  92 
  93     if ((*InString >= 0x30) && (*InString <= 0x39))
  94     {
  95         /* Numeric argument, convert */
  96 
  97         Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
  98         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
  99         {
 100             AcpiOsPrintf ("Address %p is invalid in this address space\n",
 101                 Node);
 102             return (NULL);
 103         }
 104 
 105         /* Make sure pointer is valid NS node */
 106 
 107         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
 108         {
 109             AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
 110                     Node, AcpiUtGetDescriptorName (Node));
 111             return (NULL);
 112         }
 113     }
 114     else
 115     {
 116         /* Alpha argument */
 117         /* The parameter is a name string that must be resolved to a
 118          * Named obj
 119          */
 120         Node = AcpiDbLocalNsLookup (InString);
 121         if (!Node)
 122         {
 123             Node = AcpiGbl_RootNode;
 124         }
 125     }
 126 
 127     return (Node);
 128 }
 129 
 130 
 131 /*******************************************************************************
 132  *
 133  * FUNCTION:    AcpiDbSleep
 134  *
 135  * PARAMETERS:  ObjectArg       - Desired sleep state (0-5)
 136  *
 137  * RETURN:      Status
 138  *
 139  * DESCRIPTION: Simulate a sleep/wake sequence
 140  *
 141  ******************************************************************************/
 142 
 143 ACPI_STATUS
 144 AcpiDbSleep (
 145     char                    *ObjectArg)
 146 {
 147     ACPI_STATUS             Status;
 148     UINT8                   SleepState;
 149 
 150 
 151     SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
 152 
 153     AcpiOsPrintf ("**** Prepare to sleep ****\n");
 154     Status = AcpiEnterSleepStatePrep (SleepState);
 155     if (ACPI_FAILURE (Status))
 156     {
 157         return (Status);
 158     }
 159 
 160     AcpiOsPrintf ("**** Going to sleep ****\n");
 161     Status = AcpiEnterSleepState (SleepState);
 162     if (ACPI_FAILURE (Status))
 163     {
 164         return (Status);
 165     }
 166 
 167     AcpiOsPrintf ("**** returning from sleep ****\n");
 168     Status = AcpiLeaveSleepState (SleepState);
 169 
 170     return (Status);
 171 }
 172 
 173 /*******************************************************************************
 174  *
 175  * FUNCTION:    AcpiDbDisplayLocks
 176  *
 177  * PARAMETERS:  None
 178  *
 179  * RETURN:      None
 180  *
 181  * DESCRIPTION: Display information about internal mutexes.
 182  *
 183  ******************************************************************************/
 184 
 185 void
 186 AcpiDbDisplayLocks (
 187     void)
 188 {
 189     UINT32                  i;
 190 
 191 
 192     for (i = 0; i < ACPI_MAX_MUTEX; i++)
 193     {
 194         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
 195             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
 196                 ? "Locked" : "Unlocked");
 197     }
 198 }
 199 
 200 
 201 /*******************************************************************************
 202  *
 203  * FUNCTION:    AcpiDbDisplayTableInfo
 204  *
 205  * PARAMETERS:  TableArg        - String with name of table to be displayed
 206  *
 207  * RETURN:      None
 208  *
 209  * DESCRIPTION: Display information about loaded tables.  Current
 210  *              implementation displays all loaded tables.
 211  *
 212  ******************************************************************************/
 213 
 214 void
 215 AcpiDbDisplayTableInfo (
 216     char                    *TableArg)
 217 {
 218     UINT32                  i;
 219     ACPI_TABLE_DESC         *TableDesc;
 220     ACPI_STATUS             Status;
 221 
 222 
 223     /* Walk the entire root table list */
 224 
 225     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
 226     {
 227         TableDesc = &AcpiGbl_RootTableList.Tables[i];
 228         AcpiOsPrintf ("%u ", i);
 229 
 230         /* Make sure that the table is mapped */
 231 
 232         Status = AcpiTbVerifyTable (TableDesc);
 233         if (ACPI_FAILURE (Status))
 234         {
 235             return;
 236         }
 237 
 238         /* Dump the table header */
 239 
 240         if (TableDesc->Pointer)
 241         {
 242             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
 243         }
 244         else
 245         {
 246             /* If the pointer is null, the table has been unloaded */
 247 
 248             ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
 249                 TableDesc->Signature.Ascii));
 250         }
 251     }
 252 }
 253 
 254 
 255 /*******************************************************************************
 256  *
 257  * FUNCTION:    AcpiDbUnloadAcpiTable
 258  *
 259  * PARAMETERS:  TableArg        - Name of the table to be unloaded
 260  *              InstanceArg     - Which instance of the table to unload (if
 261  *                                there are multiple tables of the same type)
 262  *
 263  * RETURN:      Nonde
 264  *
 265  * DESCRIPTION: Unload an ACPI table.
 266  *              Instance is not implemented
 267  *
 268  ******************************************************************************/
 269 
 270 void
 271 AcpiDbUnloadAcpiTable (
 272     char                    *TableArg,
 273     char                    *InstanceArg)
 274 {
 275 /* TBD: Need to reimplement for new data structures */
 276 
 277 #if 0
 278     UINT32                  i;
 279     ACPI_STATUS             Status;
 280 
 281 
 282     /* Search all tables for the target type */
 283 
 284     for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
 285     {
 286         if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
 287                 AcpiGbl_TableData[i].SigLength))
 288         {
 289             /* Found the table, unload it */
 290 
 291             Status = AcpiUnloadTable (i);
 292             if (ACPI_SUCCESS (Status))
 293             {
 294                 AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
 295             }
 296             else
 297             {
 298                 AcpiOsPrintf ("%s, while unloading [%s]\n",
 299                     AcpiFormatException (Status), TableArg);
 300             }
 301 
 302             return;
 303         }
 304     }
 305 
 306     AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
 307 #endif
 308 }
 309 
 310 
 311 /*******************************************************************************
 312  *
 313  * FUNCTION:    AcpiDbSendNotify
 314  *
 315  * PARAMETERS:  Name            - Name of ACPI object to send the notify to
 316  *              Value           - Value of the notify to send.
 317  *
 318  * RETURN:      None
 319  *
 320  * DESCRIPTION: Send an ACPI notification.  The value specified is sent to the
 321  *              named object as an ACPI notify.
 322  *
 323  ******************************************************************************/
 324 
 325 void
 326 AcpiDbSendNotify (
 327     char                    *Name,
 328     UINT32                  Value)
 329 {
 330     ACPI_NAMESPACE_NODE     *Node;
 331     ACPI_STATUS             Status;
 332 
 333 
 334     /* Translate name to an Named object */
 335 
 336     Node = AcpiDbConvertToNode (Name);
 337     if (!Node)
 338     {
 339         return;
 340     }
 341 
 342     /* Decode Named object type */
 343 
 344     switch (Node->Type)
 345     {
 346     case ACPI_TYPE_DEVICE:
 347     case ACPI_TYPE_THERMAL:
 348 
 349          /* Send the notify */
 350 
 351         Status = AcpiEvQueueNotifyRequest (Node, Value);
 352         if (ACPI_FAILURE (Status))
 353         {
 354             AcpiOsPrintf ("Could not queue notify\n");
 355         }
 356         break;
 357 
 358     default:
 359         AcpiOsPrintf ("Named object is not a device or a thermal object\n");
 360         break;
 361     }
 362 }
 363 
 364 
 365 /*******************************************************************************
 366  *
 367  * FUNCTION:    AcpiDbDisplayInterfaces
 368  *
 369  * PARAMETERS:  ActionArg           - Null, "install", or "remove"
 370  *              InterfaceNameArg    - Name for install/remove options
 371  *
 372  * RETURN:      None
 373  *
 374  * DESCRIPTION: Display or modify the global _OSI interface list
 375  *
 376  ******************************************************************************/
 377 
 378 void
 379 AcpiDbDisplayInterfaces (
 380     char                    *ActionArg,
 381     char                    *InterfaceNameArg)
 382 {
 383     ACPI_INTERFACE_INFO     *NextInterface;
 384     char                    *SubString;
 385     ACPI_STATUS             Status;
 386 
 387 
 388     /* If no arguments, just display current interface list */
 389 
 390     if (!ActionArg)
 391     {
 392         (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex,
 393                     ACPI_WAIT_FOREVER);
 394 
 395         NextInterface = AcpiGbl_SupportedInterfaces;
 396 
 397         while (NextInterface)
 398         {
 399             if (!(NextInterface->Flags & ACPI_OSI_INVALID))
 400             {
 401                 AcpiOsPrintf ("%s\n", NextInterface->Name);
 402             }
 403             NextInterface = NextInterface->Next;
 404         }
 405 
 406         AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
 407         return;
 408     }
 409 
 410     /* If ActionArg exists, so must InterfaceNameArg */
 411 
 412     if (!InterfaceNameArg)
 413     {
 414         AcpiOsPrintf ("Missing Interface Name argument\n");
 415         return;
 416     }
 417 
 418     /* Uppercase the action for match below */
 419 
 420     AcpiUtStrupr (ActionArg);
 421 
 422     /* Install - install an interface */
 423 
 424     SubString = ACPI_STRSTR ("INSTALL", ActionArg);
 425     if (SubString)
 426     {
 427         Status = AcpiInstallInterface (InterfaceNameArg);
 428         if (ACPI_FAILURE (Status))
 429         {
 430             AcpiOsPrintf ("%s, while installing \"%s\"\n",
 431                 AcpiFormatException (Status), InterfaceNameArg);
 432         }
 433         return;
 434     }
 435 
 436     /* Remove - remove an interface */
 437 
 438     SubString = ACPI_STRSTR ("REMOVE", ActionArg);
 439     if (SubString)
 440     {
 441         Status = AcpiRemoveInterface (InterfaceNameArg);
 442         if (ACPI_FAILURE (Status))
 443         {
 444             AcpiOsPrintf ("%s, while removing \"%s\"\n",
 445                 AcpiFormatException (Status), InterfaceNameArg);
 446         }
 447         return;
 448     }
 449 
 450     /* Invalid ActionArg */
 451 
 452     AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
 453     return;
 454 }
 455 
 456 
 457 /*******************************************************************************
 458  *
 459  * FUNCTION:    AcpiDmCompareAmlResources
 460  *
 461  * PARAMETERS:  Aml1Buffer          - Contains first resource list
 462  *              Aml1BufferLength    - Length of first resource list
 463  *              Aml2Buffer          - Contains second resource list
 464  *              Aml2BufferLength    - Length of second resource list
 465  *
 466  * RETURN:      None
 467  *
 468  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
 469  *              order to isolate a miscompare to an individual resource)
 470  *
 471  ******************************************************************************/
 472 
 473 static void
 474 AcpiDmCompareAmlResources (
 475     UINT8                   *Aml1Buffer,
 476     ACPI_RSDESC_SIZE        Aml1BufferLength,
 477     UINT8                   *Aml2Buffer,
 478     ACPI_RSDESC_SIZE        Aml2BufferLength)
 479 {
 480     UINT8                   *Aml1;
 481     UINT8                   *Aml2;
 482     ACPI_RSDESC_SIZE        Aml1Length;
 483     ACPI_RSDESC_SIZE        Aml2Length;
 484     ACPI_RSDESC_SIZE        Offset = 0;
 485     UINT8                   ResourceType;
 486     UINT32                  Count = 0;
 487 
 488 
 489     /* Compare overall buffer sizes (may be different due to size rounding) */
 490 
 491     if (Aml1BufferLength != Aml2BufferLength)
 492     {
 493         AcpiOsPrintf (
 494             "**** Buffer length mismatch in converted AML: original %X new %X ****\n",
 495             Aml1BufferLength, Aml2BufferLength);
 496     }
 497 
 498     Aml1 = Aml1Buffer;
 499     Aml2 = Aml2Buffer;
 500 
 501     /* Walk the descriptor lists, comparing each descriptor */
 502 
 503     while (Aml1 < (Aml1Buffer + Aml1BufferLength))
 504     {
 505         /* Get the lengths of each descriptor */
 506 
 507         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
 508         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
 509         ResourceType = AcpiUtGetResourceType (Aml1);
 510 
 511         /* Check for descriptor length match */
 512 
 513         if (Aml1Length != Aml2Length)
 514         {
 515             AcpiOsPrintf (
 516                 "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X L1 %X L2 %X ****\n",
 517                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
 518         }
 519 
 520         /* Check for descriptor byte match */
 521 
 522         else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
 523         {
 524             AcpiOsPrintf (
 525                 "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
 526                 Count, ResourceType, Offset);
 527         }
 528 
 529         /* Exit on EndTag descriptor */
 530 
 531         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
 532         {
 533             return;
 534         }
 535 
 536         /* Point to next descriptor in each buffer */
 537 
 538         Count++;
 539         Offset += Aml1Length;
 540         Aml1 += Aml1Length;
 541         Aml2 += Aml2Length;
 542     }
 543 }
 544 
 545 
 546 /*******************************************************************************
 547  *
 548  * FUNCTION:    AcpiDmTestResourceConversion
 549  *
 550  * PARAMETERS:  Node            - Parent device node
 551  *              Name            - resource method name (_CRS)
 552  *
 553  * RETURN:      Status
 554  *
 555  * DESCRIPTION: Compare the original AML with a conversion of the AML to
 556  *              internal resource list, then back to AML.
 557  *
 558  ******************************************************************************/
 559 
 560 static ACPI_STATUS
 561 AcpiDmTestResourceConversion (
 562     ACPI_NAMESPACE_NODE     *Node,
 563     char                    *Name)
 564 {
 565     ACPI_STATUS             Status;
 566     ACPI_BUFFER             ReturnObj;
 567     ACPI_BUFFER             ResourceObj;
 568     ACPI_BUFFER             NewAml;
 569     ACPI_OBJECT             *OriginalAml;
 570 
 571 
 572     AcpiOsPrintf ("Resource Conversion Comparison:\n");
 573 
 574     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
 575     ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
 576     ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
 577 
 578     /* Get the original _CRS AML resource template */
 579 
 580     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
 581     if (ACPI_FAILURE (Status))
 582     {
 583         AcpiOsPrintf ("Could not obtain %s: %s\n",
 584             Name, AcpiFormatException (Status));
 585         return (Status);
 586     }
 587 
 588     /* Get the AML resource template, converted to internal resource structs */
 589 
 590     Status = AcpiGetCurrentResources (Node, &ResourceObj);
 591     if (ACPI_FAILURE (Status))
 592     {
 593         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
 594             AcpiFormatException (Status));
 595         goto Exit1;
 596     }
 597 
 598     /* Convert internal resource list to external AML resource template */
 599 
 600     Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
 601     if (ACPI_FAILURE (Status))
 602     {
 603         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
 604             AcpiFormatException (Status));
 605         goto Exit2;
 606     }
 607 
 608     /* Compare original AML to the newly created AML resource list */
 609 
 610     OriginalAml = ReturnObj.Pointer;
 611 
 612     AcpiDmCompareAmlResources (
 613         OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
 614         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
 615 
 616     /* Cleanup and exit */
 617 
 618     ACPI_FREE (NewAml.Pointer);
 619 Exit2:
 620     ACPI_FREE (ResourceObj.Pointer);
 621 Exit1:
 622     ACPI_FREE (ReturnObj.Pointer);
 623     return (Status);
 624 }
 625 
 626 
 627 /*******************************************************************************
 628  *
 629  * FUNCTION:    AcpiDbDisplayResources
 630  *
 631  * PARAMETERS:  ObjectArg       - String with hex value of the object
 632  *
 633  * RETURN:      None
 634  *
 635  * DESCRIPTION: Display the resource objects associated with a device.
 636  *
 637  ******************************************************************************/
 638 
 639 void
 640 AcpiDbDisplayResources (
 641     char                    *ObjectArg)
 642 {
 643     ACPI_NAMESPACE_NODE     *Node;
 644     ACPI_STATUS             Status;
 645     ACPI_BUFFER             ReturnObj;
 646 
 647 
 648     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
 649     AcpiDbgLevel |= ACPI_LV_RESOURCES;
 650 
 651     /* Convert string to object pointer */
 652 
 653     Node = AcpiDbConvertToNode (ObjectArg);
 654     if (!Node)
 655     {
 656         return;
 657     }
 658 
 659     /* Prepare for a return object of arbitrary size */
 660 
 661     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 662     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 663 
 664     /* _PRT */
 665 
 666     AcpiOsPrintf ("Evaluating _PRT\n");
 667 
 668     /* Check if _PRT exists */
 669 
 670     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRT, NULL, &ReturnObj);
 671     if (ACPI_FAILURE (Status))
 672     {
 673         AcpiOsPrintf ("Could not obtain _PRT: %s\n",
 674             AcpiFormatException (Status));
 675         goto GetCrs;
 676     }
 677 
 678     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 679     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 680 
 681     Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
 682     if (ACPI_FAILURE (Status))
 683     {
 684         AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
 685             AcpiFormatException (Status));
 686         goto GetCrs;
 687     }
 688 
 689     AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
 690 
 691 
 692     /* _CRS */
 693 
 694 GetCrs:
 695     AcpiOsPrintf ("Evaluating _CRS\n");
 696 
 697     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 698     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 699 
 700     /* Check if _CRS exists */
 701 
 702     Status = AcpiEvaluateObject (Node, METHOD_NAME__CRS, NULL, &ReturnObj);
 703     if (ACPI_FAILURE (Status))
 704     {
 705         AcpiOsPrintf ("Could not obtain _CRS: %s\n",
 706             AcpiFormatException (Status));
 707         goto GetPrs;
 708     }
 709 
 710     /* Get the _CRS resource list */
 711 
 712     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 713     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 714 
 715     Status = AcpiGetCurrentResources (Node, &ReturnObj);
 716     if (ACPI_FAILURE (Status))
 717     {
 718         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
 719             AcpiFormatException (Status));
 720         goto GetPrs;
 721     }
 722 
 723     /* Dump the _CRS resource list */
 724 
 725     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
 726         ReturnObj.Pointer));
 727 
 728     /*
 729      * Perform comparison of original AML to newly created AML. This tests both
 730      * the AML->Resource conversion and the Resource->Aml conversion.
 731      */
 732     Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
 733 
 734     /* Execute _SRS with the resource list */
 735 
 736     Status = AcpiSetCurrentResources (Node, &ReturnObj);
 737     if (ACPI_FAILURE (Status))
 738     {
 739         AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
 740             AcpiFormatException (Status));
 741         goto GetPrs;
 742     }
 743 
 744 
 745     /* _PRS */
 746 
 747 GetPrs:
 748     AcpiOsPrintf ("Evaluating _PRS\n");
 749 
 750     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 751     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 752 
 753     /* Check if _PRS exists */
 754 
 755     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRS, NULL, &ReturnObj);
 756     if (ACPI_FAILURE (Status))
 757     {
 758         AcpiOsPrintf ("Could not obtain _PRS: %s\n",
 759             AcpiFormatException (Status));
 760         goto Cleanup;
 761     }
 762 
 763     ReturnObj.Pointer = AcpiGbl_DbBuffer;
 764     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
 765 
 766     Status = AcpiGetPossibleResources (Node, &ReturnObj);
 767     if (ACPI_FAILURE (Status))
 768     {
 769         AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
 770             AcpiFormatException (Status));
 771         goto Cleanup;
 772     }
 773 
 774     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
 775 
 776 Cleanup:
 777 
 778     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
 779     return;
 780 }
 781 
 782 
 783 /*******************************************************************************
 784  *
 785  * FUNCTION:    AcpiDbGenerateGpe
 786  *
 787  * PARAMETERS:  GpeArg          - Raw GPE number, ascii string
 788  *              BlockArg        - GPE block number, ascii string
 789  *                                0 or 1 for FADT GPE blocks
 790  *
 791  * RETURN:      None
 792  *
 793  * DESCRIPTION: Generate a GPE
 794  *
 795  ******************************************************************************/
 796 
 797 void
 798 AcpiDbGenerateGpe (
 799     char                    *GpeArg,
 800     char                    *BlockArg)
 801 {
 802     UINT32                  BlockNumber;
 803     UINT32                  GpeNumber;
 804     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
 805 
 806 
 807     GpeNumber   = ACPI_STRTOUL (GpeArg, NULL, 0);
 808     BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
 809 
 810 
 811     GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
 812         GpeNumber);
 813     if (!GpeEventInfo)
 814     {
 815         AcpiOsPrintf ("Invalid GPE\n");
 816         return;
 817     }
 818 
 819     (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
 820 }
 821 
 822 #endif /* ACPI_DEBUGGER */