Home | History | Annotate | Line # | Download | only in debugger
dbcmds.c revision 1.1.1.16
      1 /*******************************************************************************
      2  *
      3  * Module Name: dbcmds - Miscellaneous debug commands and output routines
      4  *
      5  ******************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #include "acpi.h"
    153 #include "accommon.h"
    154 #include "acevents.h"
    155 #include "acdebug.h"
    156 #include "acnamesp.h"
    157 #include "acresrc.h"
    158 #include "actables.h"
    159 #include "limits.h"
    160 
    161 #define _COMPONENT          ACPI_CA_DEBUGGER
    162         ACPI_MODULE_NAME    ("dbcmds")
    163 
    164 
    165 /* Local prototypes */
    166 
    167 static void
    168 AcpiDmCompareAmlResources (
    169     UINT8                   *Aml1Buffer,
    170     ACPI_RSDESC_SIZE        Aml1BufferLength,
    171     UINT8                   *Aml2Buffer,
    172     ACPI_RSDESC_SIZE        Aml2BufferLength);
    173 
    174 static ACPI_STATUS
    175 AcpiDmTestResourceConversion (
    176     ACPI_NAMESPACE_NODE     *Node,
    177     char                    *Name);
    178 
    179 static ACPI_STATUS
    180 AcpiDbResourceCallback (
    181     ACPI_RESOURCE           *Resource,
    182     void                    *Context);
    183 
    184 static ACPI_STATUS
    185 AcpiDbDeviceResources (
    186     ACPI_HANDLE             ObjHandle,
    187     UINT32                  NestingLevel,
    188     void                    *Context,
    189     void                    **ReturnValue);
    190 
    191 static void
    192 AcpiDbDoOneSleepState (
    193     UINT8                   SleepState);
    194 
    195 
    196 static char                 *AcpiDbTraceMethodName = NULL;
    197 
    198 
    199 /*******************************************************************************
    200  *
    201  * FUNCTION:    AcpiDbConvertToNode
    202  *
    203  * PARAMETERS:  InString            - String to convert
    204  *
    205  * RETURN:      Pointer to a NS node
    206  *
    207  * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
    208  *              alphanumeric strings.
    209  *
    210  ******************************************************************************/
    211 
    212 ACPI_NAMESPACE_NODE *
    213 AcpiDbConvertToNode (
    214     char                    *InString)
    215 {
    216     ACPI_NAMESPACE_NODE     *Node;
    217     ACPI_SIZE               Address;
    218 
    219 
    220     if ((*InString >= 0x30) && (*InString <= 0x39))
    221     {
    222         /* Numeric argument, convert */
    223 
    224         Address = strtoul (InString, NULL, 16);
    225         Node = ACPI_TO_POINTER (Address);
    226         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
    227         {
    228             AcpiOsPrintf ("Address %p is invalid", Node);
    229             return (NULL);
    230         }
    231 
    232         /* Make sure pointer is valid NS node */
    233 
    234         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
    235         {
    236             AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n",
    237                 Node, AcpiUtGetDescriptorName (Node));
    238             return (NULL);
    239         }
    240     }
    241     else
    242     {
    243         /*
    244          * Alpha argument: The parameter is a name string that must be
    245          * resolved to a Namespace object.
    246          */
    247         Node = AcpiDbLocalNsLookup (InString);
    248         if (!Node)
    249         {
    250             AcpiOsPrintf (
    251                 "Could not find [%s] in namespace, defaulting to root node\n",
    252                 InString);
    253             Node = AcpiGbl_RootNode;
    254         }
    255     }
    256 
    257     return (Node);
    258 }
    259 
    260 
    261 /*******************************************************************************
    262  *
    263  * FUNCTION:    AcpiDbSleep
    264  *
    265  * PARAMETERS:  ObjectArg           - Desired sleep state (0-5). NULL means
    266  *                                    invoke all possible sleep states.
    267  *
    268  * RETURN:      Status
    269  *
    270  * DESCRIPTION: Simulate sleep/wake sequences
    271  *
    272  ******************************************************************************/
    273 
    274 ACPI_STATUS
    275 AcpiDbSleep (
    276     char                    *ObjectArg)
    277 {
    278     UINT8                   SleepState;
    279     UINT32                  i;
    280 
    281 
    282     ACPI_FUNCTION_TRACE (AcpiDbSleep);
    283 
    284 
    285     /* Null input (no arguments) means to invoke all sleep states */
    286 
    287     if (!ObjectArg)
    288     {
    289         AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n",
    290             ACPI_S_STATES_MAX);
    291 
    292         for (i = 0; i <= ACPI_S_STATES_MAX; i++)
    293         {
    294             AcpiDbDoOneSleepState ((UINT8) i);
    295         }
    296 
    297         return_ACPI_STATUS (AE_OK);
    298     }
    299 
    300     /* Convert argument to binary and invoke the sleep state */
    301 
    302     SleepState = (UINT8) strtoul (ObjectArg, NULL, 0);
    303     AcpiDbDoOneSleepState (SleepState);
    304     return_ACPI_STATUS (AE_OK);
    305 }
    306 
    307 
    308 /*******************************************************************************
    309  *
    310  * FUNCTION:    AcpiDbDoOneSleepState
    311  *
    312  * PARAMETERS:  SleepState          - Desired sleep state (0-5)
    313  *
    314  * RETURN:      None
    315  *
    316  * DESCRIPTION: Simulate a sleep/wake sequence
    317  *
    318  ******************************************************************************/
    319 
    320 static void
    321 AcpiDbDoOneSleepState (
    322     UINT8                   SleepState)
    323 {
    324     ACPI_STATUS             Status;
    325     UINT8                   SleepTypeA;
    326     UINT8                   SleepTypeB;
    327 
    328 
    329     /* Validate parameter */
    330 
    331     if (SleepState > ACPI_S_STATES_MAX)
    332     {
    333         AcpiOsPrintf ("Sleep state %d out of range (%d max)\n",
    334             SleepState, ACPI_S_STATES_MAX);
    335         return;
    336     }
    337 
    338     AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n",
    339         SleepState, AcpiGbl_SleepStateNames[SleepState]);
    340 
    341     /* Get the values for the sleep type registers (for display only) */
    342 
    343     Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB);
    344     if (ACPI_FAILURE (Status))
    345     {
    346         AcpiOsPrintf ("Could not evaluate [%s] method, %s\n",
    347             AcpiGbl_SleepStateNames[SleepState],
    348             AcpiFormatException (Status));
    349         return;
    350     }
    351 
    352     AcpiOsPrintf (
    353         "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
    354         SleepState, SleepTypeA, SleepTypeB);
    355 
    356     /* Invoke the various sleep/wake interfaces */
    357 
    358     AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n",
    359         SleepState);
    360     Status = AcpiEnterSleepStatePrep (SleepState);
    361     if (ACPI_FAILURE (Status))
    362     {
    363         goto ErrorExit;
    364     }
    365 
    366     AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n",
    367         SleepState);
    368     Status = AcpiEnterSleepState (SleepState);
    369     if (ACPI_FAILURE (Status))
    370     {
    371         goto ErrorExit;
    372     }
    373 
    374     AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n",
    375         SleepState);
    376     Status = AcpiLeaveSleepStatePrep (SleepState);
    377     if (ACPI_FAILURE (Status))
    378     {
    379         goto ErrorExit;
    380     }
    381 
    382     AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n",
    383         SleepState);
    384     Status = AcpiLeaveSleepState (SleepState);
    385     if (ACPI_FAILURE (Status))
    386     {
    387         goto ErrorExit;
    388     }
    389 
    390     return;
    391 
    392 
    393 ErrorExit:
    394     ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d",
    395         SleepState));
    396 }
    397 
    398 
    399 /*******************************************************************************
    400  *
    401  * FUNCTION:    AcpiDbDisplayLocks
    402  *
    403  * PARAMETERS:  None
    404  *
    405  * RETURN:      None
    406  *
    407  * DESCRIPTION: Display information about internal mutexes.
    408  *
    409  ******************************************************************************/
    410 
    411 void
    412 AcpiDbDisplayLocks (
    413     void)
    414 {
    415     UINT32                  i;
    416 
    417 
    418     for (i = 0; i < ACPI_MAX_MUTEX; i++)
    419     {
    420         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
    421             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
    422                 ? "Locked" : "Unlocked");
    423     }
    424 }
    425 
    426 
    427 /*******************************************************************************
    428  *
    429  * FUNCTION:    AcpiDbDisplayTableInfo
    430  *
    431  * PARAMETERS:  TableArg            - Name of table to be displayed
    432  *
    433  * RETURN:      None
    434  *
    435  * DESCRIPTION: Display information about loaded tables. Current
    436  *              implementation displays all loaded tables.
    437  *
    438  ******************************************************************************/
    439 
    440 void
    441 AcpiDbDisplayTableInfo (
    442     char                    *TableArg)
    443 {
    444     UINT32                  i;
    445     ACPI_TABLE_DESC         *TableDesc;
    446     ACPI_STATUS             Status;
    447 
    448 
    449     /* Header */
    450 
    451     AcpiOsPrintf ("Idx ID    Status Type                    "
    452         "TableHeader (Sig, Address, Length, Misc)\n");
    453 
    454     /* Walk the entire root table list */
    455 
    456     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
    457     {
    458         TableDesc = &AcpiGbl_RootTableList.Tables[i];
    459 
    460         /* Index and Table ID */
    461 
    462         AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
    463 
    464         /* Decode the table flags */
    465 
    466         if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
    467         {
    468             AcpiOsPrintf ("NotLoaded ");
    469         }
    470         else
    471         {
    472             AcpiOsPrintf ("   Loaded ");
    473         }
    474 
    475         switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
    476         {
    477         case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
    478 
    479             AcpiOsPrintf ("External/virtual  ");
    480             break;
    481 
    482         case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
    483 
    484             AcpiOsPrintf ("Internal/physical ");
    485             break;
    486 
    487         case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
    488 
    489             AcpiOsPrintf ("Internal/virtual  ");
    490             break;
    491 
    492         default:
    493 
    494             AcpiOsPrintf ("INVALID TYPE      ");
    495             break;
    496         }
    497 
    498         /* Make sure that the table is mapped */
    499 
    500         Status = AcpiTbValidateTable (TableDesc);
    501         if (ACPI_FAILURE (Status))
    502         {
    503             return;
    504         }
    505 
    506         /* Dump the table header */
    507 
    508         if (TableDesc->Pointer)
    509         {
    510             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
    511         }
    512         else
    513         {
    514             /* If the pointer is null, the table has been unloaded */
    515 
    516             ACPI_INFO (("%4.4s - Table has been unloaded",
    517                 TableDesc->Signature.Ascii));
    518         }
    519     }
    520 }
    521 
    522 
    523 /*******************************************************************************
    524  *
    525  * FUNCTION:    AcpiDbUnloadAcpiTable
    526  *
    527  * PARAMETERS:  ObjectName          - Namespace pathname for an object that
    528  *                                    is owned by the table to be unloaded
    529  *
    530  * RETURN:      None
    531  *
    532  * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
    533  *              by the table.
    534  *
    535  ******************************************************************************/
    536 
    537 void
    538 AcpiDbUnloadAcpiTable (
    539     char                    *ObjectName)
    540 {
    541     ACPI_NAMESPACE_NODE     *Node;
    542     ACPI_STATUS             Status;
    543 
    544 
    545     /* Translate name to an Named object */
    546 
    547     Node = AcpiDbConvertToNode (ObjectName);
    548     if (!Node)
    549     {
    550         return;
    551     }
    552 
    553     Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
    554     if (ACPI_SUCCESS (Status))
    555     {
    556         AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
    557             ObjectName, Node);
    558     }
    559     else
    560     {
    561         AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
    562             AcpiFormatException (Status), ObjectName);
    563     }
    564 }
    565 
    566 
    567 /*******************************************************************************
    568  *
    569  * FUNCTION:    AcpiDbSendNotify
    570  *
    571  * PARAMETERS:  Name                - Name of ACPI object where to send notify
    572  *              Value               - Value of the notify to send.
    573  *
    574  * RETURN:      None
    575  *
    576  * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
    577  *              named object as an ACPI notify.
    578  *
    579  ******************************************************************************/
    580 
    581 void
    582 AcpiDbSendNotify (
    583     char                    *Name,
    584     UINT32                  Value)
    585 {
    586     ACPI_NAMESPACE_NODE     *Node;
    587     ACPI_STATUS             Status;
    588 
    589 
    590     /* Translate name to an Named object */
    591 
    592     Node = AcpiDbConvertToNode (Name);
    593     if (!Node)
    594     {
    595         return;
    596     }
    597 
    598     /* Dispatch the notify if legal */
    599 
    600     if (AcpiEvIsNotifyObject (Node))
    601     {
    602         Status = AcpiEvQueueNotifyRequest (Node, Value);
    603         if (ACPI_FAILURE (Status))
    604         {
    605             AcpiOsPrintf ("Could not queue notify\n");
    606         }
    607     }
    608     else
    609     {
    610         AcpiOsPrintf (
    611             "Named object [%4.4s] Type %s, "
    612             "must be Device/Thermal/Processor type\n",
    613             AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
    614     }
    615 }
    616 
    617 
    618 /*******************************************************************************
    619  *
    620  * FUNCTION:    AcpiDbDisplayInterfaces
    621  *
    622  * PARAMETERS:  ActionArg           - Null, "install", or "remove"
    623  *              InterfaceNameArg    - Name for install/remove options
    624  *
    625  * RETURN:      None
    626  *
    627  * DESCRIPTION: Display or modify the global _OSI interface list
    628  *
    629  ******************************************************************************/
    630 
    631 void
    632 AcpiDbDisplayInterfaces (
    633     char                    *ActionArg,
    634     char                    *InterfaceNameArg)
    635 {
    636     ACPI_INTERFACE_INFO     *NextInterface;
    637     char                    *SubString;
    638     ACPI_STATUS             Status;
    639 
    640 
    641     /* If no arguments, just display current interface list */
    642 
    643     if (!ActionArg)
    644     {
    645         (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
    646 
    647         NextInterface = AcpiGbl_SupportedInterfaces;
    648         while (NextInterface)
    649         {
    650             if (!(NextInterface->Flags & ACPI_OSI_INVALID))
    651             {
    652                 AcpiOsPrintf ("%s\n", NextInterface->Name);
    653             }
    654 
    655             NextInterface = NextInterface->Next;
    656         }
    657 
    658         AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
    659         return;
    660     }
    661 
    662     /* If ActionArg exists, so must InterfaceNameArg */
    663 
    664     if (!InterfaceNameArg)
    665     {
    666         AcpiOsPrintf ("Missing Interface Name argument\n");
    667         return;
    668     }
    669 
    670     /* Uppercase the action for match below */
    671 
    672     AcpiUtStrupr (ActionArg);
    673 
    674     /* Install - install an interface */
    675 
    676     SubString = strstr ("INSTALL", ActionArg);
    677     if (SubString)
    678     {
    679         Status = AcpiInstallInterface (InterfaceNameArg);
    680         if (ACPI_FAILURE (Status))
    681         {
    682             AcpiOsPrintf ("%s, while installing \"%s\"\n",
    683                 AcpiFormatException (Status), InterfaceNameArg);
    684         }
    685         return;
    686     }
    687 
    688     /* Remove - remove an interface */
    689 
    690     SubString = strstr ("REMOVE", ActionArg);
    691     if (SubString)
    692     {
    693         Status = AcpiRemoveInterface (InterfaceNameArg);
    694         if (ACPI_FAILURE (Status))
    695         {
    696             AcpiOsPrintf ("%s, while removing \"%s\"\n",
    697                 AcpiFormatException (Status), InterfaceNameArg);
    698         }
    699         return;
    700     }
    701 
    702     /* Invalid ActionArg */
    703 
    704     AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
    705     return;
    706 }
    707 
    708 
    709 /*******************************************************************************
    710  *
    711  * FUNCTION:    AcpiDbDisplayTemplate
    712  *
    713  * PARAMETERS:  BufferArg           - Buffer name or address
    714  *
    715  * RETURN:      None
    716  *
    717  * DESCRIPTION: Dump a buffer that contains a resource template
    718  *
    719  ******************************************************************************/
    720 
    721 void
    722 AcpiDbDisplayTemplate (
    723     char                    *BufferArg)
    724 {
    725     ACPI_NAMESPACE_NODE     *Node;
    726     ACPI_STATUS             Status;
    727     ACPI_BUFFER             ReturnBuffer;
    728 
    729 
    730     /* Translate BufferArg to an Named object */
    731 
    732     Node = AcpiDbConvertToNode (BufferArg);
    733     if (!Node || (Node == AcpiGbl_RootNode))
    734     {
    735         AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
    736         return;
    737     }
    738 
    739     /* We must have a buffer object */
    740 
    741     if (Node->Type != ACPI_TYPE_BUFFER)
    742     {
    743         AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
    744             BufferArg);
    745         return;
    746     }
    747 
    748     ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
    749     ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
    750 
    751     /* Attempt to convert the raw buffer to a resource list */
    752 
    753     Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer);
    754 
    755     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    756     AcpiDbgLevel |= ACPI_LV_RESOURCES;
    757 
    758     if (ACPI_FAILURE (Status))
    759     {
    760         AcpiOsPrintf (
    761             "Could not convert Buffer to a resource list: %s, %s\n",
    762             BufferArg, AcpiFormatException (Status));
    763         goto DumpBuffer;
    764     }
    765 
    766     /* Now we can dump the resource list */
    767 
    768     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
    769         ReturnBuffer.Pointer));
    770 
    771 DumpBuffer:
    772     AcpiOsPrintf ("\nRaw data buffer:\n");
    773     AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
    774         Node->Object->Buffer.Length,
    775         DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
    776 
    777     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    778     return;
    779 }
    780 
    781 
    782 /*******************************************************************************
    783  *
    784  * FUNCTION:    AcpiDmCompareAmlResources
    785  *
    786  * PARAMETERS:  Aml1Buffer          - Contains first resource list
    787  *              Aml1BufferLength    - Length of first resource list
    788  *              Aml2Buffer          - Contains second resource list
    789  *              Aml2BufferLength    - Length of second resource list
    790  *
    791  * RETURN:      None
    792  *
    793  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
    794  *              order to isolate a miscompare to an individual resource)
    795  *
    796  ******************************************************************************/
    797 
    798 static void
    799 AcpiDmCompareAmlResources (
    800     UINT8                   *Aml1Buffer,
    801     ACPI_RSDESC_SIZE        Aml1BufferLength,
    802     UINT8                   *Aml2Buffer,
    803     ACPI_RSDESC_SIZE        Aml2BufferLength)
    804 {
    805     UINT8                   *Aml1;
    806     UINT8                   *Aml2;
    807     UINT8                   *Aml1End;
    808     UINT8                   *Aml2End;
    809     ACPI_RSDESC_SIZE        Aml1Length;
    810     ACPI_RSDESC_SIZE        Aml2Length;
    811     ACPI_RSDESC_SIZE        Offset = 0;
    812     UINT8                   ResourceType;
    813     UINT32                  Count = 0;
    814     UINT32                  i;
    815 
    816 
    817     /* Compare overall buffer sizes (may be different due to size rounding) */
    818 
    819     if (Aml1BufferLength != Aml2BufferLength)
    820     {
    821         AcpiOsPrintf (
    822             "**** Buffer length mismatch in converted "
    823             "AML: Original %X, New %X ****\n",
    824             Aml1BufferLength, Aml2BufferLength);
    825     }
    826 
    827     Aml1 = Aml1Buffer;
    828     Aml2 = Aml2Buffer;
    829     Aml1End = Aml1Buffer + Aml1BufferLength;
    830     Aml2End = Aml2Buffer + Aml2BufferLength;
    831 
    832     /* Walk the descriptor lists, comparing each descriptor */
    833 
    834     while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
    835     {
    836         /* Get the lengths of each descriptor */
    837 
    838         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
    839         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
    840         ResourceType = AcpiUtGetResourceType (Aml1);
    841 
    842         /* Check for descriptor length match */
    843 
    844         if (Aml1Length != Aml2Length)
    845         {
    846             AcpiOsPrintf (
    847                 "**** Length mismatch in descriptor [%.2X] type %2.2X, "
    848                 "Offset %8.8X Len1 %X, Len2 %X ****\n",
    849                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
    850         }
    851 
    852         /* Check for descriptor byte match */
    853 
    854         else if (memcmp (Aml1, Aml2, Aml1Length))
    855         {
    856             AcpiOsPrintf (
    857                 "**** Data mismatch in descriptor [%.2X] type %2.2X, "
    858                 "Offset %8.8X ****\n",
    859                 Count, ResourceType, Offset);
    860 
    861             for (i = 0; i < Aml1Length; i++)
    862             {
    863                 if (Aml1[i] != Aml2[i])
    864                 {
    865                     AcpiOsPrintf (
    866                         "Mismatch at byte offset %.2X: is %2.2X, "
    867                         "should be %2.2X\n",
    868                         i, Aml2[i], Aml1[i]);
    869                 }
    870             }
    871         }
    872 
    873         /* Exit on EndTag descriptor */
    874 
    875         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
    876         {
    877             return;
    878         }
    879 
    880         /* Point to next descriptor in each buffer */
    881 
    882         Count++;
    883         Offset += Aml1Length;
    884         Aml1 += Aml1Length;
    885         Aml2 += Aml2Length;
    886     }
    887 }
    888 
    889 
    890 /*******************************************************************************
    891  *
    892  * FUNCTION:    AcpiDmTestResourceConversion
    893  *
    894  * PARAMETERS:  Node                - Parent device node
    895  *              Name                - resource method name (_CRS)
    896  *
    897  * RETURN:      Status
    898  *
    899  * DESCRIPTION: Compare the original AML with a conversion of the AML to
    900  *              internal resource list, then back to AML.
    901  *
    902  ******************************************************************************/
    903 
    904 static ACPI_STATUS
    905 AcpiDmTestResourceConversion (
    906     ACPI_NAMESPACE_NODE     *Node,
    907     char                    *Name)
    908 {
    909     ACPI_STATUS             Status;
    910     ACPI_BUFFER             ReturnBuffer;
    911     ACPI_BUFFER             ResourceBuffer;
    912     ACPI_BUFFER             NewAml;
    913     ACPI_OBJECT             *OriginalAml;
    914 
    915 
    916     AcpiOsPrintf ("Resource Conversion Comparison:\n");
    917 
    918     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    919     ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    920     ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    921 
    922     /* Get the original _CRS AML resource template */
    923 
    924     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer);
    925     if (ACPI_FAILURE (Status))
    926     {
    927         AcpiOsPrintf ("Could not obtain %s: %s\n",
    928             Name, AcpiFormatException (Status));
    929         return (Status);
    930     }
    931 
    932     /* Get the AML resource template, converted to internal resource structs */
    933 
    934     Status = AcpiGetCurrentResources (Node, &ResourceBuffer);
    935     if (ACPI_FAILURE (Status))
    936     {
    937         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
    938             AcpiFormatException (Status));
    939         goto Exit1;
    940     }
    941 
    942     /* Convert internal resource list to external AML resource template */
    943 
    944     Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
    945     if (ACPI_FAILURE (Status))
    946     {
    947         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
    948             AcpiFormatException (Status));
    949         goto Exit2;
    950     }
    951 
    952     /* Compare original AML to the newly created AML resource list */
    953 
    954     OriginalAml = ReturnBuffer.Pointer;
    955 
    956     AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
    957         (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
    958         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
    959 
    960     /* Cleanup and exit */
    961 
    962     ACPI_FREE (NewAml.Pointer);
    963 Exit2:
    964     ACPI_FREE (ResourceBuffer.Pointer);
    965 Exit1:
    966     ACPI_FREE (ReturnBuffer.Pointer);
    967     return (Status);
    968 }
    969 
    970 
    971 /*******************************************************************************
    972  *
    973  * FUNCTION:    AcpiDbResourceCallback
    974  *
    975  * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
    976  *
    977  * RETURN:      Status
    978  *
    979  * DESCRIPTION: Simple callback to exercise AcpiWalkResources and
    980  *              AcpiWalkResourceBuffer.
    981  *
    982  ******************************************************************************/
    983 
    984 static ACPI_STATUS
    985 AcpiDbResourceCallback (
    986     ACPI_RESOURCE           *Resource,
    987     void                    *Context)
    988 {
    989 
    990     return (AE_OK);
    991 }
    992 
    993 
    994 /*******************************************************************************
    995  *
    996  * FUNCTION:    AcpiDbDeviceResources
    997  *
    998  * PARAMETERS:  ACPI_WALK_CALLBACK
    999  *
   1000  * RETURN:      Status
   1001  *
   1002  * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
   1003  *
   1004  ******************************************************************************/
   1005 
   1006 static ACPI_STATUS
   1007 AcpiDbDeviceResources (
   1008     ACPI_HANDLE             ObjHandle,
   1009     UINT32                  NestingLevel,
   1010     void                    *Context,
   1011     void                    **ReturnValue)
   1012 {
   1013     ACPI_NAMESPACE_NODE     *Node;
   1014     ACPI_NAMESPACE_NODE     *PrtNode = NULL;
   1015     ACPI_NAMESPACE_NODE     *CrsNode = NULL;
   1016     ACPI_NAMESPACE_NODE     *PrsNode = NULL;
   1017     ACPI_NAMESPACE_NODE     *AeiNode = NULL;
   1018     char                    *ParentPath;
   1019     ACPI_BUFFER             ReturnBuffer;
   1020     ACPI_STATUS             Status;
   1021 
   1022 
   1023     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
   1024     ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
   1025     if (!ParentPath)
   1026     {
   1027         return (AE_NO_MEMORY);
   1028     }
   1029 
   1030     /* Get handles to the resource methods for this device */
   1031 
   1032     (void) AcpiGetHandle (Node, METHOD_NAME__PRT,
   1033         ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
   1034     (void) AcpiGetHandle (Node, METHOD_NAME__CRS,
   1035         ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
   1036     (void) AcpiGetHandle (Node, METHOD_NAME__PRS,
   1037         ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
   1038     (void) AcpiGetHandle (Node, METHOD_NAME__AEI,
   1039         ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
   1040 
   1041     if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
   1042     {
   1043         goto Cleanup;   /* Nothing to do */
   1044     }
   1045 
   1046     AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
   1047 
   1048     /* Prepare for a return object of arbitrary size */
   1049 
   1050     ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1051     ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
   1052 
   1053 
   1054     /* _PRT */
   1055 
   1056     if (PrtNode)
   1057     {
   1058         AcpiOsPrintf ("Evaluating _PRT\n");
   1059 
   1060         Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer);
   1061         if (ACPI_FAILURE (Status))
   1062         {
   1063             AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
   1064                 AcpiFormatException (Status));
   1065             goto GetCrs;
   1066         }
   1067 
   1068         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1069         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
   1070 
   1071         Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer);
   1072         if (ACPI_FAILURE (Status))
   1073         {
   1074             AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
   1075                 AcpiFormatException (Status));
   1076             goto GetCrs;
   1077         }
   1078 
   1079         AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
   1080     }
   1081 
   1082 
   1083     /* _CRS */
   1084 
   1085 GetCrs:
   1086     if (CrsNode)
   1087     {
   1088         AcpiOsPrintf ("Evaluating _CRS\n");
   1089 
   1090         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1091         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
   1092 
   1093         Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer);
   1094         if (ACPI_FAILURE (Status))
   1095         {
   1096             AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
   1097                 AcpiFormatException (Status));
   1098             goto GetPrs;
   1099         }
   1100 
   1101         /* This code exercises the AcpiWalkResources interface */
   1102 
   1103         Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
   1104             AcpiDbResourceCallback, NULL);
   1105         if (ACPI_FAILURE (Status))
   1106         {
   1107             AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
   1108                 AcpiFormatException (Status));
   1109             goto GetPrs;
   1110         }
   1111 
   1112         /* Get the _CRS resource list (test ALLOCATE buffer) */
   1113 
   1114         ReturnBuffer.Pointer = NULL;
   1115         ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
   1116 
   1117         Status = AcpiGetCurrentResources (Node, &ReturnBuffer);
   1118         if (ACPI_FAILURE (Status))
   1119         {
   1120             AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
   1121                 AcpiFormatException (Status));
   1122             goto GetPrs;
   1123         }
   1124 
   1125         /* This code exercises the AcpiWalkResourceBuffer interface */
   1126 
   1127         Status = AcpiWalkResourceBuffer (&ReturnBuffer,
   1128             AcpiDbResourceCallback, NULL);
   1129         if (ACPI_FAILURE (Status))
   1130         {
   1131             AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n",
   1132                 AcpiFormatException (Status));
   1133             goto EndCrs;
   1134         }
   1135 
   1136         /* Dump the _CRS resource list */
   1137 
   1138         AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
   1139             ReturnBuffer.Pointer));
   1140 
   1141         /*
   1142          * Perform comparison of original AML to newly created AML. This
   1143          * tests both the AML->Resource conversion and the Resource->AML
   1144          * conversion.
   1145          */
   1146         (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
   1147 
   1148         /* Execute _SRS with the resource list */
   1149 
   1150         AcpiOsPrintf ("Evaluating _SRS\n");
   1151 
   1152         Status = AcpiSetCurrentResources (Node, &ReturnBuffer);
   1153         if (ACPI_FAILURE (Status))
   1154         {
   1155             AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
   1156                 AcpiFormatException (Status));
   1157             goto EndCrs;
   1158         }
   1159 
   1160 EndCrs:
   1161         ACPI_FREE (ReturnBuffer.Pointer);
   1162     }
   1163 
   1164 
   1165     /* _PRS */
   1166 
   1167 GetPrs:
   1168     if (PrsNode)
   1169     {
   1170         AcpiOsPrintf ("Evaluating _PRS\n");
   1171 
   1172         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1173         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
   1174 
   1175         Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer);
   1176         if (ACPI_FAILURE (Status))
   1177         {
   1178             AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
   1179                 AcpiFormatException (Status));
   1180             goto GetAei;
   1181         }
   1182 
   1183         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1184         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
   1185 
   1186         Status = AcpiGetPossibleResources (Node, &ReturnBuffer);
   1187         if (ACPI_FAILURE (Status))
   1188         {
   1189             AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
   1190                 AcpiFormatException (Status));
   1191             goto GetAei;
   1192         }
   1193 
   1194         AcpiRsDumpResourceList (ACPI_CAST_PTR (
   1195             ACPI_RESOURCE, AcpiGbl_DbBuffer));
   1196     }
   1197 
   1198 
   1199     /* _AEI */
   1200 
   1201 GetAei:
   1202     if (AeiNode)
   1203     {
   1204         AcpiOsPrintf ("Evaluating _AEI\n");
   1205 
   1206         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1207         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
   1208 
   1209         Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer);
   1210         if (ACPI_FAILURE (Status))
   1211         {
   1212             AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
   1213                 AcpiFormatException (Status));
   1214             goto Cleanup;
   1215         }
   1216 
   1217         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
   1218         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
   1219 
   1220         Status = AcpiGetEventResources (Node, &ReturnBuffer);
   1221         if (ACPI_FAILURE (Status))
   1222         {
   1223             AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
   1224                 AcpiFormatException (Status));
   1225             goto Cleanup;
   1226         }
   1227 
   1228         AcpiRsDumpResourceList (ACPI_CAST_PTR (
   1229             ACPI_RESOURCE, AcpiGbl_DbBuffer));
   1230     }
   1231 
   1232 
   1233 Cleanup:
   1234     ACPI_FREE (ParentPath);
   1235     return (AE_OK);
   1236 }
   1237 
   1238 
   1239 /*******************************************************************************
   1240  *
   1241  * FUNCTION:    AcpiDbDisplayResources
   1242  *
   1243  * PARAMETERS:  ObjectArg           - String object name or object pointer.
   1244  *                                    NULL or "*" means "display resources for
   1245  *                                    all devices"
   1246  *
   1247  * RETURN:      None
   1248  *
   1249  * DESCRIPTION: Display the resource objects associated with a device.
   1250  *
   1251  ******************************************************************************/
   1252 
   1253 void
   1254 AcpiDbDisplayResources (
   1255     char                    *ObjectArg)
   1256 {
   1257     ACPI_NAMESPACE_NODE     *Node;
   1258 
   1259 
   1260     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
   1261     AcpiDbgLevel |= ACPI_LV_RESOURCES;
   1262 
   1263     /* Asterisk means "display resources for all devices" */
   1264 
   1265     if (!ObjectArg || (!strcmp (ObjectArg, "*")))
   1266     {
   1267         (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
   1268             ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
   1269     }
   1270     else
   1271     {
   1272         /* Convert string to object pointer */
   1273 
   1274         Node = AcpiDbConvertToNode (ObjectArg);
   1275         if (Node)
   1276         {
   1277             if (Node->Type != ACPI_TYPE_DEVICE)
   1278             {
   1279                 AcpiOsPrintf (
   1280                     "%4.4s: Name is not a device object (%s)\n",
   1281                     Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
   1282             }
   1283             else
   1284             {
   1285                 (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
   1286             }
   1287         }
   1288     }
   1289 
   1290     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
   1291 }
   1292 
   1293 
   1294 /*******************************************************************************
   1295  *
   1296  * FUNCTION:    AcpiDbGenerateGed
   1297  *
   1298  * PARAMETERS:  GedArg              - Raw GED number, ascii string
   1299  *
   1300  * RETURN:      None
   1301  *
   1302  * DESCRIPTION: Simulate firing of a GED
   1303  *
   1304  ******************************************************************************/
   1305 
   1306 void
   1307 AcpiDbGenerateInterrupt (
   1308     char *GsivArg)
   1309 {
   1310     UINT32      GsivNumber;
   1311     ACPI_GED_HANDLER_INFO *GedInfo = AcpiGbl_GedHandlerList;
   1312 
   1313 	if (!GedInfo) {
   1314 		AcpiOsPrintf ("No GED handling present\n");
   1315 	}
   1316 
   1317     GsivNumber = strtoul (GsivArg, NULL, 0);
   1318 
   1319 	while (GedInfo) {
   1320 
   1321 		if (GedInfo->IntId == GsivNumber) {
   1322 			ACPI_OBJECT_LIST ArgList;
   1323 			ACPI_OBJECT Arg0;
   1324 			ACPI_HANDLE EvtHandle = GedInfo->EvtMethod;
   1325 			ACPI_STATUS Status;
   1326 
   1327 			AcpiOsPrintf ("Evaluate GED _EVT (GSIV=%d)\n", GsivNumber);
   1328 
   1329 			if (!EvtHandle) {
   1330 				AcpiOsPrintf ("Undefined _EVT method\n");
   1331 				return;
   1332 			}
   1333 
   1334 			Arg0.Integer.Type = ACPI_TYPE_INTEGER;
   1335 			Arg0.Integer.Value = GsivNumber;
   1336 
   1337 			ArgList.Count = 1;
   1338 			ArgList.Pointer = &Arg0;
   1339 
   1340 			Status = AcpiEvaluateObject (EvtHandle, NULL, &ArgList, NULL);
   1341 			if (ACPI_FAILURE (Status))
   1342 			{
   1343 				AcpiOsPrintf ("Could not evaluate _EVT\n");
   1344 				return;
   1345 			}
   1346 
   1347 		}
   1348 		GedInfo = GedInfo->Next;
   1349 	}
   1350 }
   1351 
   1352 #if (!ACPI_REDUCED_HARDWARE)
   1353 /*******************************************************************************
   1354  *
   1355  * FUNCTION:    AcpiDbGenerateGpe
   1356  *
   1357  * PARAMETERS:  GpeArg              - Raw GPE number, ascii string
   1358  *              BlockArg            - GPE block number, ascii string
   1359  *                                    0 or 1 for FADT GPE blocks
   1360  *
   1361  * RETURN:      None
   1362  *
   1363  * DESCRIPTION: Simulate firing of a GPE
   1364  *
   1365  ******************************************************************************/
   1366 
   1367 void
   1368 AcpiDbGenerateGpe (
   1369     char                    *GpeArg,
   1370     char                    *BlockArg)
   1371 {
   1372     UINT32                  BlockNumber = 0;
   1373     UINT32                  GpeNumber;
   1374     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
   1375 
   1376 
   1377     GpeNumber = strtoul (GpeArg, NULL, 0);
   1378 
   1379     /*
   1380      * If no block arg, or block arg == 0 or 1, use the FADT-defined
   1381      * GPE blocks.
   1382      */
   1383     if (BlockArg)
   1384     {
   1385         BlockNumber = strtoul (BlockArg, NULL, 0);
   1386         if (BlockNumber == 1)
   1387         {
   1388             BlockNumber = 0;
   1389         }
   1390     }
   1391 
   1392     GpeEventInfo = AcpiEvGetGpeEventInfo (
   1393         ACPI_TO_POINTER (BlockNumber), GpeNumber);
   1394     if (!GpeEventInfo)
   1395     {
   1396         AcpiOsPrintf ("Invalid GPE\n");
   1397         return;
   1398     }
   1399 
   1400     (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
   1401 }
   1402 
   1403 
   1404 /*******************************************************************************
   1405  *
   1406  * FUNCTION:    AcpiDbGenerateSci
   1407  *
   1408  * PARAMETERS:  None
   1409  *
   1410  * RETURN:      None
   1411  *
   1412  * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch.
   1413  *
   1414  ******************************************************************************/
   1415 
   1416 void
   1417 AcpiDbGenerateSci (
   1418     void)
   1419 {
   1420     AcpiEvSciDispatch ();
   1421 }
   1422 
   1423 #endif /* !ACPI_REDUCED_HARDWARE */
   1424 
   1425 
   1426 /*******************************************************************************
   1427  *
   1428  * FUNCTION:    AcpiDbTrace
   1429  *
   1430  * PARAMETERS:  EnableArg           - ENABLE/AML to enable tracer
   1431  *                                    DISABLE to disable tracer
   1432  *              MethodArg           - Method to trace
   1433  *              OnceArg             - Whether trace once
   1434  *
   1435  * RETURN:      None
   1436  *
   1437  * DESCRIPTION: Control method tracing facility
   1438  *
   1439  ******************************************************************************/
   1440 
   1441 void
   1442 AcpiDbTrace (
   1443     char                    *EnableArg,
   1444     char                    *MethodArg,
   1445     char                    *OnceArg)
   1446 {
   1447     UINT32                  DebugLevel = 0;
   1448     UINT32                  DebugLayer = 0;
   1449     UINT32                  Flags = 0;
   1450 
   1451 
   1452     AcpiUtStrupr (EnableArg);
   1453     AcpiUtStrupr (OnceArg);
   1454 
   1455     if (MethodArg)
   1456     {
   1457         if (AcpiDbTraceMethodName)
   1458         {
   1459             ACPI_FREE (AcpiDbTraceMethodName);
   1460             AcpiDbTraceMethodName = NULL;
   1461         }
   1462 
   1463         AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1);
   1464         if (!AcpiDbTraceMethodName)
   1465         {
   1466             AcpiOsPrintf ("Failed to allocate method name (%s)\n",
   1467                 MethodArg);
   1468             return;
   1469         }
   1470 
   1471         strcpy (AcpiDbTraceMethodName, MethodArg);
   1472     }
   1473 
   1474     if (!strcmp (EnableArg, "ENABLE") ||
   1475         !strcmp (EnableArg, "METHOD") ||
   1476         !strcmp (EnableArg, "OPCODE"))
   1477     {
   1478         if (!strcmp (EnableArg, "ENABLE"))
   1479         {
   1480             /* Inherit current console settings */
   1481 
   1482             DebugLevel = AcpiGbl_DbConsoleDebugLevel;
   1483             DebugLayer = AcpiDbgLayer;
   1484         }
   1485         else
   1486         {
   1487             /* Restrict console output to trace points only */
   1488 
   1489             DebugLevel = ACPI_LV_TRACE_POINT;
   1490             DebugLayer = ACPI_EXECUTER;
   1491         }
   1492 
   1493         Flags = ACPI_TRACE_ENABLED;
   1494 
   1495         if (!strcmp (EnableArg, "OPCODE"))
   1496         {
   1497             Flags |= ACPI_TRACE_OPCODE;
   1498         }
   1499 
   1500         if (OnceArg && !strcmp (OnceArg, "ONCE"))
   1501         {
   1502             Flags |= ACPI_TRACE_ONESHOT;
   1503         }
   1504     }
   1505 
   1506     (void) AcpiDebugTrace (AcpiDbTraceMethodName,
   1507         DebugLevel, DebugLayer, Flags);
   1508 }
   1509