Home | History | Annotate | Line # | Download | only in debugger
dbcmds.c revision 1.1.1.2
      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 */
    823