Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbcmds - 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 - 2010, 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.  
  117. #include "acpi.h"
  118. #include "accommon.h"
  119. #include "acdispat.h"
  120. #include "acnamesp.h"
  121. #include "acevents.h"
  122. #include "acdebug.h"
  123. #include "acresrc.h"
  124. #include "acdisasm.h"
  125. #include "actables.h"
  126. #include "acparser.h"
  127.  
  128. #ifdef ACPI_DEBUGGER
  129.  
  130. #define _COMPONENT          ACPI_CA_DEBUGGER
  131.         ACPI_MODULE_NAME    ("dbcmds")
  132.  
  133.  
  134. /* Local prototypes */
  135.  
  136. static ACPI_STATUS
  137. AcpiDbIntegrityWalk (
  138.     ACPI_HANDLE             ObjHandle,
  139.     UINT32                  NestingLevel,
  140.     void                    *Context,
  141.     void                    **ReturnValue);
  142.  
  143. static ACPI_STATUS
  144. AcpiDbWalkAndMatchName (
  145.     ACPI_HANDLE             ObjHandle,
  146.     UINT32                  NestingLevel,
  147.     void                    *Context,
  148.     void                    **ReturnValue);
  149.  
  150. static ACPI_STATUS
  151. AcpiDbWalkForReferences (
  152.     ACPI_HANDLE             ObjHandle,
  153.     UINT32                  NestingLevel,
  154.     void                    *Context,
  155.     void                    **ReturnValue);
  156.  
  157. static ACPI_STATUS
  158. AcpiDbWalkForSpecificObjects (
  159.     ACPI_HANDLE             ObjHandle,
  160.     UINT32                  NestingLevel,
  161.     void                    *Context,
  162.     void                    **ReturnValue);
  163.  
  164. static ACPI_NAMESPACE_NODE *
  165. AcpiDbConvertToNode (
  166.     char                    *InString);
  167.  
  168. static void
  169. AcpiDmCompareAmlResources (
  170.     UINT8                   *Aml1Buffer,
  171.     ACPI_RSDESC_SIZE        Aml1BufferLength,
  172.     UINT8                   *Aml2Buffer,
  173.     ACPI_RSDESC_SIZE        Aml2BufferLength);
  174.  
  175. static ACPI_STATUS
  176. AcpiDmTestResourceConversion (
  177.     ACPI_NAMESPACE_NODE     *Node,
  178.     char                    *Name);
  179.  
  180.  
  181. /*
  182.  * Arguments for the Objects command
  183.  * These object types map directly to the ACPI_TYPES
  184.  */
  185. static ARGUMENT_INFO        AcpiDbObjectTypes [] =
  186. {
  187.     {"ANY"},
  188.     {"INTEGERS"},
  189.     {"STRINGS"},
  190.     {"BUFFERS"},
  191.     {"PACKAGES"},
  192.     {"FIELDS"},
  193.     {"DEVICES"},
  194.     {"EVENTS"},
  195.     {"METHODS"},
  196.     {"MUTEXES"},
  197.     {"REGIONS"},
  198.     {"POWERRESOURCES"},
  199.     {"PROCESSORS"},
  200.     {"THERMALZONES"},
  201.     {"BUFFERFIELDS"},
  202.     {"DDBHANDLES"},
  203.     {"DEBUG"},
  204.     {"REGIONFIELDS"},
  205.     {"BANKFIELDS"},
  206.     {"INDEXFIELDS"},
  207.     {"REFERENCES"},
  208.     {"ALIAS"},
  209.     {NULL}           /* Must be null terminated */
  210. };
  211.  
  212.  
  213. /*******************************************************************************
  214.  *
  215.  * FUNCTION:    AcpiDbConvertToNode
  216.  *
  217.  * PARAMETERS:  InString        - String to convert
  218.  *
  219.  * RETURN:      Pointer to a NS node
  220.  *
  221.  * DESCRIPTION: Convert a string to a valid NS pointer.  Handles numeric or
  222.  *              alpha strings.
  223.  *
  224.  ******************************************************************************/
  225.  
  226. static ACPI_NAMESPACE_NODE *
  227. AcpiDbConvertToNode (
  228.     char                    *InString)
  229. {
  230.     ACPI_NAMESPACE_NODE     *Node;
  231.  
  232.  
  233.     if ((*InString >= 0x30) && (*InString <= 0x39))
  234.     {
  235.         /* Numeric argument, convert */
  236.  
  237.         Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
  238.         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
  239.         {
  240.             AcpiOsPrintf ("Address %p is invalid in this address space\n",
  241.                 Node);
  242.             return (NULL);
  243.         }
  244.  
  245.         /* Make sure pointer is valid NS node */
  246.  
  247.         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
  248.         {
  249.             AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
  250.                     Node, AcpiUtGetDescriptorName (Node));
  251.             return (NULL);
  252.         }
  253.     }
  254.     else
  255.     {
  256.         /* Alpha argument */
  257.         /* The parameter is a name string that must be resolved to a
  258.          * Named obj
  259.          */
  260.         Node = AcpiDbLocalNsLookup (InString);
  261.         if (!Node)
  262.         {
  263.             Node = AcpiGbl_RootNode;
  264.         }
  265.     }
  266.  
  267.     return (Node);
  268. }
  269.  
  270.  
  271. /*******************************************************************************
  272.  *
  273.  * FUNCTION:    AcpiDbSleep
  274.  *
  275.  * PARAMETERS:  ObjectArg       - Desired sleep state (0-5)
  276.  *
  277.  * RETURN:      Status
  278.  *
  279.  * DESCRIPTION: Simulate a sleep/wake sequence
  280.  *
  281.  ******************************************************************************/
  282.  
  283. ACPI_STATUS
  284. AcpiDbSleep (
  285.     char                    *ObjectArg)
  286. {
  287.     ACPI_STATUS             Status;
  288.     UINT8                   SleepState;
  289.  
  290.  
  291.     SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
  292.  
  293.     AcpiOsPrintf ("**** Prepare to sleep ****\n");
  294.     Status = AcpiEnterSleepStatePrep (SleepState);
  295.     if (ACPI_FAILURE (Status))
  296.     {
  297.         return (Status);
  298.     }
  299.  
  300.     AcpiOsPrintf ("**** Going to sleep ****\n");
  301.     Status = AcpiEnterSleepState (SleepState);
  302.     if (ACPI_FAILURE (Status))
  303.     {
  304.         return (Status);
  305.     }
  306.  
  307.     AcpiOsPrintf ("**** returning from sleep ****\n");
  308.     Status = AcpiLeaveSleepState (SleepState);
  309.  
  310.     return (Status);
  311. }
  312.  
  313.  
  314. /*******************************************************************************
  315.  *
  316.  * FUNCTION:    AcpiDbWalkForReferences
  317.  *
  318.  * PARAMETERS:  Callback from WalkNamespace
  319.  *
  320.  * RETURN:      Status
  321.  *
  322.  * DESCRIPTION: Check if this namespace object refers to the target object
  323.  *              that is passed in as the context value.
  324.  *
  325.  * Note: Currently doesn't check subobjects within the Node's object
  326.  *
  327.  ******************************************************************************/
  328.  
  329. static ACPI_STATUS
  330. AcpiDbWalkForReferences (
  331.     ACPI_HANDLE             ObjHandle,
  332.     UINT32                  NestingLevel,
  333.     void                    *Context,
  334.     void                    **ReturnValue)
  335. {
  336.     ACPI_OPERAND_OBJECT     *ObjDesc = (ACPI_OPERAND_OBJECT  *) Context;
  337.     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  338.  
  339.  
  340.     /* Check for match against the namespace node itself */
  341.  
  342.     if (Node == (void *) ObjDesc)
  343.     {
  344.         AcpiOsPrintf ("Object is a Node [%4.4s]\n",
  345.             AcpiUtGetNodeName (Node));
  346.     }
  347.  
  348.     /* Check for match against the object attached to the node */
  349.  
  350.     if (AcpiNsGetAttachedObject (Node) == ObjDesc)
  351.     {
  352.         AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
  353.             Node, AcpiUtGetNodeName (Node));
  354.     }
  355.  
  356.     return (AE_OK);
  357. }
  358.  
  359.  
  360. /*******************************************************************************
  361.  *
  362.  * FUNCTION:    AcpiDbFindReferences
  363.  *
  364.  * PARAMETERS:  ObjectArg       - String with hex value of the object
  365.  *
  366.  * RETURN:      None
  367.  *
  368.  * DESCRIPTION: Search namespace for all references to the input object
  369.  *
  370.  ******************************************************************************/
  371.  
  372. void
  373. AcpiDbFindReferences (
  374.     char                    *ObjectArg)
  375. {
  376.     ACPI_OPERAND_OBJECT     *ObjDesc;
  377.  
  378.  
  379.     /* Convert string to object pointer */
  380.  
  381.     ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
  382.  
  383.     /* Search all nodes in namespace */
  384.  
  385.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  386.                     AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL);
  387. }
  388.  
  389.  
  390. /*******************************************************************************
  391.  *
  392.  * FUNCTION:    AcpiDbWalkForPredefinedNames
  393.  *
  394.  * PARAMETERS:  Callback from WalkNamespace
  395.  *
  396.  * RETURN:      Status
  397.  *
  398.  * DESCRIPTION: Detect and display predefined ACPI names (names that start with
  399.  *              an underscore)
  400.  *
  401.  ******************************************************************************/
  402.  
  403. static ACPI_STATUS
  404. AcpiDbWalkForPredefinedNames (
  405.     ACPI_HANDLE             ObjHandle,
  406.     UINT32                  NestingLevel,
  407.     void                    *Context,
  408.     void                    **ReturnValue)
  409. {
  410.     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  411.     UINT32                      *Count = (UINT32 *) Context;
  412.     const ACPI_PREDEFINED_INFO  *Predefined;
  413.     const ACPI_PREDEFINED_INFO  *Package = NULL;
  414.     char                        *Pathname;
  415.  
  416.  
  417.     Predefined = AcpiNsCheckForPredefinedName (Node);
  418.     if (!Predefined)
  419.     {
  420.         return (AE_OK);
  421.     }
  422.  
  423.     Pathname = AcpiNsGetExternalPathname (Node);
  424.     if (!Pathname)
  425.     {
  426.         return (AE_OK);
  427.     }
  428.  
  429.     /* If method returns a package, the info is in the next table entry */
  430.  
  431.     if (Predefined->Info.ExpectedBtypes & ACPI_BTYPE_PACKAGE)
  432.     {
  433.         Package = Predefined + 1;
  434.     }
  435.  
  436.     AcpiOsPrintf ("%-32s arg %X ret %2.2X", Pathname,
  437.         Predefined->Info.ParamCount, Predefined->Info.ExpectedBtypes);
  438.  
  439.     if (Package)
  440.     {
  441.         AcpiOsPrintf (" PkgType %2.2X ObjType %2.2X Count %2.2X",
  442.             Package->RetInfo.Type, Package->RetInfo.ObjectType1,
  443.             Package->RetInfo.Count1);
  444.     }
  445.  
  446.     AcpiOsPrintf("\n");
  447.  
  448.     AcpiNsCheckParameterCount (Pathname, Node, ACPI_UINT32_MAX, Predefined);
  449.     ACPI_FREE (Pathname);
  450.     (*Count)++;
  451.  
  452.     return (AE_OK);
  453. }
  454.  
  455.  
  456. /*******************************************************************************
  457.  *
  458.  * FUNCTION:    AcpiDbCheckPredefinedNames
  459.  *
  460.  * PARAMETERS:  None
  461.  *
  462.  * RETURN:      None
  463.  *
  464.  * DESCRIPTION: Validate all predefined names in the namespace
  465.  *
  466.  ******************************************************************************/
  467.  
  468. void
  469. AcpiDbCheckPredefinedNames (
  470.     void)
  471. {
  472.     UINT32                  Count = 0;
  473.  
  474.  
  475.     /* Search all nodes in namespace */
  476.  
  477.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  478.                 AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL);
  479.  
  480.     AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
  481. }
  482.  
  483.  
  484. /*******************************************************************************
  485.  *
  486.  * FUNCTION:    AcpiDbWalkForExecute
  487.  *
  488.  * PARAMETERS:  Callback from WalkNamespace
  489.  *
  490.  * RETURN:      Status
  491.  *
  492.  * DESCRIPTION: Batch execution module. Currently only executes predefined
  493.  *              ACPI names.
  494.  *
  495.  ******************************************************************************/
  496.  
  497. static ACPI_STATUS
  498. AcpiDbWalkForExecute (
  499.     ACPI_HANDLE             ObjHandle,
  500.     UINT32                  NestingLevel,
  501.     void                    *Context,
  502.     void                    **ReturnValue)
  503. {
  504.     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  505.     ACPI_EXECUTE_WALK       *Info = (ACPI_EXECUTE_WALK *) Context;
  506.     ACPI_BUFFER             ReturnObj;
  507.     ACPI_STATUS             Status;
  508.     char                    *Pathname;
  509.     UINT32                  i;
  510.     ACPI_DEVICE_INFO        *ObjInfo;
  511.     ACPI_OBJECT_LIST        ParamObjects;
  512.     ACPI_OBJECT             Params[ACPI_METHOD_NUM_ARGS];
  513.     const ACPI_PREDEFINED_INFO *Predefined;
  514.  
  515.  
  516.     Predefined = AcpiNsCheckForPredefinedName (Node);
  517.     if (!Predefined)
  518.     {
  519.         return (AE_OK);
  520.     }
  521.  
  522.     if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
  523.     {
  524.         return (AE_OK);
  525.     }
  526.  
  527.     Pathname = AcpiNsGetExternalPathname (Node);
  528.     if (!Pathname)
  529.     {
  530.         return (AE_OK);
  531.     }
  532.  
  533.     /* Get the object info for number of method parameters */
  534.  
  535.     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
  536.     if (ACPI_FAILURE (Status))
  537.     {
  538.         return (Status);
  539.     }
  540.  
  541.     ParamObjects.Pointer = NULL;
  542.     ParamObjects.Count   = 0;
  543.  
  544.     if (ObjInfo->Type == ACPI_TYPE_METHOD)
  545.     {
  546.         /* Setup default parameters */
  547.  
  548.         for (i = 0; i < ObjInfo->ParamCount; i++)
  549.         {
  550.             Params[i].Type           = ACPI_TYPE_INTEGER;
  551.             Params[i].Integer.Value  = 1;
  552.         }
  553.  
  554.         ParamObjects.Pointer     = Params;
  555.         ParamObjects.Count       = ObjInfo->ParamCount;
  556.     }
  557.  
  558.     ACPI_FREE (ObjInfo);
  559.     ReturnObj.Pointer = NULL;
  560.     ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
  561.  
  562.     /* Do the actual method execution */
  563.  
  564.     AcpiGbl_MethodExecuting = TRUE;
  565.  
  566.     Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
  567.  
  568.     AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
  569.     AcpiGbl_MethodExecuting = FALSE;
  570.     ACPI_FREE (Pathname);
  571.  
  572.     /* Ignore status from method execution */
  573.  
  574.     Status = AE_OK;
  575.  
  576.     /* Update count, check if we have executed enough methods */
  577.  
  578.     Info->Count++;
  579.     if (Info->Count >= Info->MaxCount)
  580.     {
  581.         Status = AE_CTRL_TERMINATE;
  582.     }
  583.  
  584.     return (Status);
  585. }
  586.  
  587.  
  588. /*******************************************************************************
  589.  *
  590.  * FUNCTION:    AcpiDbBatchExecute
  591.  *
  592.  * PARAMETERS:  CountArg            - Max number of methods to execute
  593.  *
  594.  * RETURN:      None
  595.  *
  596.  * DESCRIPTION: Namespace batch execution. Execute predefined names in the
  597.  *              namespace, up to the max count, if specified.
  598.  *
  599.  ******************************************************************************/
  600.  
  601. void
  602. AcpiDbBatchExecute (
  603.     char                    *CountArg)
  604. {
  605.     ACPI_EXECUTE_WALK       Info;
  606.  
  607.  
  608.     Info.Count = 0;
  609.     Info.MaxCount = ACPI_UINT32_MAX;
  610.  
  611.     if (CountArg)
  612.     {
  613.         Info.MaxCount = ACPI_STRTOUL (CountArg, NULL, 0);
  614.     }
  615.  
  616.  
  617.     /* Search all nodes in namespace */
  618.  
  619.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  620.                 AcpiDbWalkForExecute, NULL, (void *) &Info, NULL);
  621.  
  622.     AcpiOsPrintf ("Executed %u predefined names in the namespace\n", Info.Count);
  623. }
  624.  
  625.  
  626. /*******************************************************************************
  627.  *
  628.  * FUNCTION:    AcpiDbDisplayLocks
  629.  *
  630.  * PARAMETERS:  None
  631.  *
  632.  * RETURN:      None
  633.  *
  634.  * DESCRIPTION: Display information about internal mutexes.
  635.  *
  636.  ******************************************************************************/
  637.  
  638. void
  639. AcpiDbDisplayLocks (
  640.     void)
  641. {
  642.     UINT32                  i;
  643.  
  644.  
  645.     for (i = 0; i < ACPI_MAX_MUTEX; i++)
  646.     {
  647.         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
  648.             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
  649.                 ? "Locked" : "Unlocked");
  650.     }
  651. }
  652.  
  653.  
  654. /*******************************************************************************
  655.  *
  656.  * FUNCTION:    AcpiDbDisplayTableInfo
  657.  *
  658.  * PARAMETERS:  TableArg        - String with name of table to be displayed
  659.  *
  660.  * RETURN:      None
  661.  *
  662.  * DESCRIPTION: Display information about loaded tables.  Current
  663.  *              implementation displays all loaded tables.
  664.  *
  665.  ******************************************************************************/
  666.  
  667. void
  668. AcpiDbDisplayTableInfo (
  669.     char                    *TableArg)
  670. {
  671.     UINT32                  i;
  672.     ACPI_TABLE_DESC         *TableDesc;
  673.     ACPI_STATUS             Status;
  674.  
  675.  
  676.     /* Walk the entire root table list */
  677.  
  678.     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
  679.     {
  680.         TableDesc = &AcpiGbl_RootTableList.Tables[i];
  681.         AcpiOsPrintf ("%u ", i);
  682.  
  683.         /* Make sure that the table is mapped */
  684.  
  685.         Status = AcpiTbVerifyTable (TableDesc);
  686.         if (ACPI_FAILURE (Status))
  687.         {
  688.             return;
  689.         }
  690.  
  691.         /* Dump the table header */
  692.  
  693.         if (TableDesc->Pointer)
  694.         {
  695.             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
  696.         }
  697.         else
  698.         {
  699.             /* If the pointer is null, the table has been unloaded */
  700.  
  701.             ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
  702.                 TableDesc->Signature.Ascii));
  703.         }
  704.     }
  705. }
  706.  
  707.  
  708. /*******************************************************************************
  709.  *
  710.  * FUNCTION:    AcpiDbUnloadAcpiTable
  711.  *
  712.  * PARAMETERS:  TableArg        - Name of the table to be unloaded
  713.  *              InstanceArg     - Which instance of the table to unload (if
  714.  *                                there are multiple tables of the same type)
  715.  *
  716.  * RETURN:      Nonde
  717.  *
  718.  * DESCRIPTION: Unload an ACPI table.
  719.  *              Instance is not implemented
  720.  *
  721.  ******************************************************************************/
  722.  
  723. void
  724. AcpiDbUnloadAcpiTable (
  725.     char                    *TableArg,
  726.     char                    *InstanceArg)
  727. {
  728. /* TBD: Need to reimplement for new data structures */
  729.  
  730. #if 0
  731.     UINT32                  i;
  732.     ACPI_STATUS             Status;
  733.  
  734.  
  735.     /* Search all tables for the target type */
  736.  
  737.     for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
  738.     {
  739.         if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
  740.                 AcpiGbl_TableData[i].SigLength))
  741.         {
  742.             /* Found the table, unload it */
  743.  
  744.             Status = AcpiUnloadTable (i);
  745.             if (ACPI_SUCCESS (Status))
  746.             {
  747.                 AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
  748.             }
  749.             else
  750.             {
  751.                 AcpiOsPrintf ("%s, while unloading [%s]\n",
  752.                     AcpiFormatException (Status), TableArg);
  753.             }
  754.  
  755.             return;
  756.         }
  757.     }
  758.  
  759.     AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
  760. #endif
  761. }
  762.  
  763.  
  764. /*******************************************************************************
  765.  *
  766.  * FUNCTION:    AcpiDbSetMethodBreakpoint
  767.  *
  768.  * PARAMETERS:  Location            - AML offset of breakpoint
  769.  *              WalkState           - Current walk info
  770.  *              Op                  - Current Op (from parse walk)
  771.  *
  772.  * RETURN:      None
  773.  *
  774.  * DESCRIPTION: Set a breakpoint in a control method at the specified
  775.  *              AML offset
  776.  *
  777.  ******************************************************************************/
  778.  
  779. void
  780. AcpiDbSetMethodBreakpoint (
  781.     char                    *Location,
  782.     ACPI_WALK_STATE         *WalkState,
  783.     ACPI_PARSE_OBJECT       *Op)
  784. {
  785.     UINT32                  Address;
  786.  
  787.  
  788.     if (!Op)
  789.     {
  790.         AcpiOsPrintf ("There is no method currently executing\n");
  791.         return;
  792.     }
  793.  
  794.     /* Get and verify the breakpoint address */
  795.  
  796.     Address = ACPI_STRTOUL (Location, NULL, 16);
  797.     if (Address <= Op->Common.AmlOffset)
  798.     {
  799.         AcpiOsPrintf ("Breakpoint %X is beyond current address %X\n",
  800.             Address, Op->Common.AmlOffset);
  801.     }
  802.  
  803.     /* Save breakpoint in current walk */
  804.  
  805.     WalkState->UserBreakpoint = Address;
  806.     AcpiOsPrintf ("Breakpoint set at AML offset %X\n", Address);
  807. }
  808.  
  809.  
  810. /*******************************************************************************
  811.  *
  812.  * FUNCTION:    AcpiDbSetMethodCallBreakpoint
  813.  *
  814.  * PARAMETERS:  Op                  - Current Op (from parse walk)
  815.  *
  816.  * RETURN:      None
  817.  *
  818.  * DESCRIPTION: Set a breakpoint in a control method at the specified
  819.  *              AML offset
  820.  *
  821.  ******************************************************************************/
  822.  
  823. void
  824. AcpiDbSetMethodCallBreakpoint (
  825.     ACPI_PARSE_OBJECT       *Op)
  826. {
  827.  
  828.  
  829.     if (!Op)
  830.     {
  831.         AcpiOsPrintf ("There is no method currently executing\n");
  832.         return;
  833.     }
  834.  
  835.     AcpiGbl_StepToNextCall = TRUE;
  836. }
  837.  
  838.  
  839. /*******************************************************************************
  840.  *
  841.  * FUNCTION:    AcpiDbDisassembleAml
  842.  *
  843.  * PARAMETERS:  Statements          - Number of statements to disassemble
  844.  *              Op                  - Current Op (from parse walk)
  845.  *
  846.  * RETURN:      None
  847.  *
  848.  * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
  849.  *              of statements specified.
  850.  *
  851.  ******************************************************************************/
  852.  
  853. void
  854. AcpiDbDisassembleAml (
  855.     char                    *Statements,
  856.     ACPI_PARSE_OBJECT       *Op)
  857. {
  858.     UINT32                  NumStatements = 8;
  859.  
  860.  
  861.     if (!Op)
  862.     {
  863.         AcpiOsPrintf ("There is no method currently executing\n");
  864.         return;
  865.     }
  866.  
  867.     if (Statements)
  868.     {
  869.         NumStatements = ACPI_STRTOUL (Statements, NULL, 0);
  870.     }
  871.  
  872.     AcpiDmDisassemble (NULL, Op, NumStatements);
  873. }
  874.  
  875.  
  876. /*******************************************************************************
  877.  *
  878.  * FUNCTION:    AcpiDbDisassembleMethod
  879.  *
  880.  * PARAMETERS:  Name            - Name of control method
  881.  *
  882.  * RETURN:      None
  883.  *
  884.  * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
  885.  *              of statements specified.
  886.  *
  887.  ******************************************************************************/
  888.  
  889. ACPI_STATUS
  890. AcpiDbDisassembleMethod (
  891.     char                    *Name)
  892. {
  893.     ACPI_STATUS             Status;
  894.     ACPI_PARSE_OBJECT       *Op;
  895.     ACPI_WALK_STATE         *WalkState;
  896.     ACPI_OPERAND_OBJECT     *ObjDesc;
  897.     ACPI_NAMESPACE_NODE     *Method;
  898.  
  899.  
  900.     Method = AcpiDbConvertToNode (Name);
  901.     if (!Method)
  902.     {
  903.         return (AE_BAD_PARAMETER);
  904.     }
  905.  
  906.     ObjDesc = Method->Object;
  907.  
  908.     Op = AcpiPsCreateScopeOp ();
  909.     if (!Op)
  910.     {
  911.         return (AE_NO_MEMORY);
  912.     }
  913.  
  914.     /* Create and initialize a new walk state */
  915.  
  916.     WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
  917.     if (!WalkState)
  918.     {
  919.         return (AE_NO_MEMORY);
  920.     }
  921.  
  922.     Status = AcpiDsInitAmlWalk (WalkState, Op, NULL,
  923.                     ObjDesc->Method.AmlStart,
  924.                     ObjDesc->Method.AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
  925.     if (ACPI_FAILURE (Status))
  926.     {
  927.         return (Status);
  928.     }
  929.  
  930.     /* Parse the AML */
  931.  
  932.     WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
  933.     WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
  934.     Status = AcpiPsParseAml (WalkState);
  935.  
  936.     AcpiDmDisassemble (NULL, Op, 0);
  937.     AcpiPsDeleteParseTree (Op);
  938.     return (AE_OK);
  939. }
  940.  
  941.  
  942. /*******************************************************************************
  943.  *
  944.  * FUNCTION:    AcpiDbDumpNamespace
  945.  *
  946.  * PARAMETERS:  StartArg        - Node to begin namespace dump
  947.  *              DepthArg        - Maximum tree depth to be dumped
  948.  *
  949.  * RETURN:      None
  950.  *
  951.  * DESCRIPTION: Dump entire namespace or a subtree.  Each node is displayed
  952.  *              with type and other information.
  953.  *
  954.  ******************************************************************************/
  955.  
  956. void
  957. AcpiDbDumpNamespace (
  958.     char                    *StartArg,
  959.     char                    *DepthArg)
  960. {
  961.     ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
  962.     UINT32                  MaxDepth = ACPI_UINT32_MAX;
  963.  
  964.  
  965.     /* No argument given, just start at the root and dump entire namespace */
  966.  
  967.     if (StartArg)
  968.     {
  969.         SubtreeEntry = AcpiDbConvertToNode (StartArg);
  970.         if (!SubtreeEntry)
  971.         {
  972.             return;
  973.         }
  974.  
  975.         /* Now we can check for the depth argument */
  976.  
  977.         if (DepthArg)
  978.         {
  979.             MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
  980.         }
  981.     }
  982.  
  983.     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
  984.     AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
  985.         ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
  986.  
  987.     /* Display the subtree */
  988.  
  989.     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
  990.     AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
  991.         ACPI_OWNER_ID_MAX, SubtreeEntry);
  992.     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
  993. }
  994.  
  995.  
  996. /*******************************************************************************
  997.  *
  998.  * FUNCTION:    AcpiDbDumpNamespaceByOwner
  999.  *
  1000.  * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed
  1001.  *              DepthArg        - Maximum tree depth to be dumped
  1002.  *
  1003.  * RETURN:      None
  1004.  *
  1005.  * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
  1006.  *
  1007.  ******************************************************************************/
  1008.  
  1009. void
  1010. AcpiDbDumpNamespaceByOwner (
  1011.     char                    *OwnerArg,
  1012.     char                    *DepthArg)
  1013. {
  1014.     ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
  1015.     UINT32                  MaxDepth = ACPI_UINT32_MAX;
  1016.     ACPI_OWNER_ID           OwnerId;
  1017.  
  1018.  
  1019.     OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0);
  1020.  
  1021.     /* Now we can check for the depth argument */
  1022.  
  1023.     if (DepthArg)
  1024.     {
  1025.         MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
  1026.     }
  1027.  
  1028.     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
  1029.     AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
  1030.  
  1031.     /* Display the subtree */
  1032.  
  1033.     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
  1034.     AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId,
  1035.         SubtreeEntry);
  1036.     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
  1037. }
  1038.  
  1039.  
  1040. /*******************************************************************************
  1041.  *
  1042.  * FUNCTION:    AcpiDbSendNotify
  1043.  *
  1044.  * PARAMETERS:  Name            - Name of ACPI object to send the notify to
  1045.  *              Value           - Value of the notify to send.
  1046.  *
  1047.  * RETURN:      None
  1048.  *
  1049.  * DESCRIPTION: Send an ACPI notification.  The value specified is sent to the
  1050.  *              named object as an ACPI notify.
  1051.  *
  1052.  ******************************************************************************/
  1053.  
  1054. void
  1055. AcpiDbSendNotify (
  1056.     char                    *Name,
  1057.     UINT32                  Value)
  1058. {
  1059.     ACPI_NAMESPACE_NODE     *Node;
  1060.     ACPI_STATUS             Status;
  1061.  
  1062.  
  1063.     /* Translate name to an Named object */
  1064.  
  1065.     Node = AcpiDbConvertToNode (Name);
  1066.     if (!Node)
  1067.     {
  1068.         return;
  1069.     }
  1070.  
  1071.     /* Decode Named object type */
  1072.  
  1073.     switch (Node->Type)
  1074.     {
  1075.     case ACPI_TYPE_DEVICE:
  1076.     case ACPI_TYPE_THERMAL:
  1077.  
  1078.          /* Send the notify */
  1079.  
  1080.         Status = AcpiEvQueueNotifyRequest (Node, Value);
  1081.         if (ACPI_FAILURE (Status))
  1082.         {
  1083.             AcpiOsPrintf ("Could not queue notify\n");
  1084.         }
  1085.         break;
  1086.  
  1087.     default:
  1088.         AcpiOsPrintf ("Named object is not a device or a thermal object\n");
  1089.         break;
  1090.     }
  1091. }
  1092.  
  1093.  
  1094. /*******************************************************************************
  1095.  *
  1096.  * FUNCTION:    AcpiDbSetMethodData
  1097.  *
  1098.  * PARAMETERS:  TypeArg         - L for local, A for argument
  1099.  *              IndexArg        - which one
  1100.  *              ValueArg        - Value to set.
  1101.  *
  1102.  * RETURN:      None
  1103.  *
  1104.  * DESCRIPTION: Set a local or argument for the running control method.
  1105.  *              NOTE: only object supported is Number.
  1106.  *
  1107.  ******************************************************************************/
  1108.  
  1109. void
  1110. AcpiDbSetMethodData (
  1111.     char                    *TypeArg,
  1112.     char                    *IndexArg,
  1113.     char                    *ValueArg)
  1114. {
  1115.     char                    Type;
  1116.     UINT32                  Index;
  1117.     UINT32                  Value;
  1118.     ACPI_WALK_STATE         *WalkState;
  1119.     ACPI_OPERAND_OBJECT     *ObjDesc;
  1120.     ACPI_STATUS             Status;
  1121.     ACPI_NAMESPACE_NODE     *Node;
  1122.  
  1123.  
  1124.     /* Validate TypeArg */
  1125.  
  1126.     AcpiUtStrupr (TypeArg);
  1127.     Type = TypeArg[0];
  1128.     if ((Type != 'L') &&
  1129.         (Type != 'A') &&
  1130.         (Type != 'N'))
  1131.     {
  1132.         AcpiOsPrintf ("Invalid SET operand: %s\n", TypeArg);
  1133.         return;
  1134.     }
  1135.  
  1136.     Value = ACPI_STRTOUL (ValueArg, NULL, 16);
  1137.  
  1138.     if (Type == 'N')
  1139.     {
  1140.         Node = AcpiDbConvertToNode (IndexArg);
  1141.         if (Node->Type != ACPI_TYPE_INTEGER)
  1142.         {
  1143.             AcpiOsPrintf ("Can only set Integer nodes\n");
  1144.             return;
  1145.         }
  1146.         ObjDesc = Node->Object;
  1147.         ObjDesc->Integer.Value = Value;
  1148.         return;
  1149.     }
  1150.  
  1151.     /* Get the index and value */
  1152.  
  1153.     Index = ACPI_STRTOUL (IndexArg, NULL, 16);
  1154.  
  1155.     WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
  1156.     if (!WalkState)
  1157.     {
  1158.         AcpiOsPrintf ("There is no method currently executing\n");
  1159.         return;
  1160.     }
  1161.  
  1162.     /* Create and initialize the new object */
  1163.  
  1164.     ObjDesc = AcpiUtCreateIntegerObject ((UINT64) Value);
  1165.     if (!ObjDesc)
  1166.     {
  1167.         AcpiOsPrintf ("Could not create an internal object\n");
  1168.         return;
  1169.     }
  1170.  
  1171.     /* Store the new object into the target */
  1172.  
  1173.     switch (Type)
  1174.     {
  1175.     case 'A':
  1176.  
  1177.         /* Set a method argument */
  1178.  
  1179.         if (Index > ACPI_METHOD_MAX_ARG)
  1180.         {
  1181.             AcpiOsPrintf ("Arg%u - Invalid argument name\n", Index);
  1182.             goto Cleanup;
  1183.         }
  1184.  
  1185.         Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_ARG, Index, ObjDesc,
  1186.                     WalkState);
  1187.         if (ACPI_FAILURE (Status))
  1188.         {
  1189.             goto Cleanup;
  1190.         }
  1191.  
  1192.         ObjDesc = WalkState->Arguments[Index].Object;
  1193.  
  1194.         AcpiOsPrintf ("Arg%u: ", Index);
  1195.         AcpiDmDisplayInternalObject (ObjDesc, WalkState);
  1196.         break;
  1197.  
  1198.     case 'L':
  1199.  
  1200.         /* Set a method local */
  1201.  
  1202.         if (Index > ACPI_METHOD_MAX_LOCAL)
  1203.         {
  1204.             AcpiOsPrintf ("Local%u - Invalid local variable name\n", Index);
  1205.             goto Cleanup;
  1206.         }
  1207.  
  1208.         Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_LOCAL, Index, ObjDesc,
  1209.                     WalkState);
  1210.         if (ACPI_FAILURE (Status))
  1211.         {
  1212.             goto Cleanup;
  1213.         }
  1214.  
  1215.         ObjDesc = WalkState->LocalVariables[Index].Object;
  1216.  
  1217.         AcpiOsPrintf ("Local%u: ", Index);
  1218.         AcpiDmDisplayInternalObject (ObjDesc, WalkState);
  1219.         break;
  1220.  
  1221.     default:
  1222.         break;
  1223.     }
  1224.  
  1225. Cleanup:
  1226.     AcpiUtRemoveReference (ObjDesc);
  1227. }
  1228.  
  1229.  
  1230. /*******************************************************************************
  1231.  *
  1232.  * FUNCTION:    AcpiDbWalkForSpecificObjects
  1233.  *
  1234.  * PARAMETERS:  Callback from WalkNamespace
  1235.  *
  1236.  * RETURN:      Status
  1237.  *
  1238.  * DESCRIPTION: Display short info about objects in the namespace
  1239.  *
  1240.  ******************************************************************************/
  1241.  
  1242. static ACPI_STATUS
  1243. AcpiDbWalkForSpecificObjects (
  1244.     ACPI_HANDLE             ObjHandle,
  1245.     UINT32                  NestingLevel,
  1246.     void                    *Context,
  1247.     void                    **ReturnValue)
  1248. {
  1249.     ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
  1250.     ACPI_BUFFER             Buffer;
  1251.     ACPI_STATUS             Status;
  1252.  
  1253.  
  1254.     Info->Count++;
  1255.  
  1256.     /* Get and display the full pathname to this object */
  1257.  
  1258.     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  1259.     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
  1260.     if (ACPI_FAILURE (Status))
  1261.     {
  1262.         AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
  1263.         return (AE_OK);
  1264.     }
  1265.  
  1266.     AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
  1267.     ACPI_FREE (Buffer.Pointer);
  1268.  
  1269.     /* Dump short info about the object */
  1270.  
  1271.     (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
  1272.     return (AE_OK);
  1273. }
  1274.  
  1275.  
  1276. /*******************************************************************************
  1277.  *
  1278.  * FUNCTION:    AcpiDbDisplayObjects
  1279.  *
  1280.  * PARAMETERS:  ObjTypeArg          - Type of object to display
  1281.  *              DisplayCountArg     - Max depth to display
  1282.  *
  1283.  * RETURN:      None
  1284.  *
  1285.  * DESCRIPTION: Display objects in the namespace of the requested type
  1286.  *
  1287.  ******************************************************************************/
  1288.  
  1289. ACPI_STATUS
  1290. AcpiDbDisplayObjects (
  1291.     char                    *ObjTypeArg,
  1292.     char                    *DisplayCountArg)
  1293. {
  1294.     ACPI_WALK_INFO          Info;
  1295.     ACPI_OBJECT_TYPE        Type;
  1296.  
  1297.  
  1298.     /* Get the object type */
  1299.  
  1300.     Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
  1301.     if (Type == ACPI_TYPE_NOT_FOUND)
  1302.     {
  1303.         AcpiOsPrintf ("Invalid or unsupported argument\n");
  1304.         return (AE_OK);
  1305.     }
  1306.  
  1307.     AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
  1308.     AcpiOsPrintf (
  1309.         "Objects of type [%s] defined in the current ACPI Namespace:\n",
  1310.         AcpiUtGetTypeName (Type));
  1311.  
  1312.     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
  1313.  
  1314.     Info.Count = 0;
  1315.     Info.OwnerId = ACPI_OWNER_ID_MAX;
  1316.     Info.DebugLevel = ACPI_UINT32_MAX;
  1317.     Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
  1318.  
  1319.     /* Walk the namespace from the root */
  1320.  
  1321.     (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  1322.                 AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
  1323.  
  1324.     AcpiOsPrintf (
  1325.         "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
  1326.         Info.Count, AcpiUtGetTypeName (Type));
  1327.  
  1328.     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
  1329.     return (AE_OK);
  1330. }
  1331.  
  1332.  
  1333. /*******************************************************************************
  1334.  *
  1335.  * FUNCTION:    AcpiDbWalkAndMatchName
  1336.  *
  1337.  * PARAMETERS:  Callback from WalkNamespace
  1338.  *
  1339.  * RETURN:      Status
  1340.  *
  1341.  * DESCRIPTION: Find a particular name/names within the namespace.  Wildcards
  1342.  *              are supported -- '?' matches any character.
  1343.  *
  1344.  ******************************************************************************/
  1345.  
  1346. static ACPI_STATUS
  1347. AcpiDbWalkAndMatchName (
  1348.     ACPI_HANDLE             ObjHandle,
  1349.     UINT32                  NestingLevel,
  1350.     void                    *Context,
  1351.     void                    **ReturnValue)
  1352. {
  1353.     ACPI_STATUS             Status;
  1354.     char                    *RequestedName = (char *) Context;
  1355.     UINT32                  i;
  1356.     ACPI_BUFFER             Buffer;
  1357.     ACPI_WALK_INFO          Info;
  1358.  
  1359.  
  1360.     /* Check for a name match */
  1361.  
  1362.     for (i = 0; i < 4; i++)
  1363.     {
  1364.         /* Wildcard support */
  1365.  
  1366.         if ((RequestedName[i] != '?') &&
  1367.             (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i]))
  1368.         {
  1369.             /* No match, just exit */
  1370.  
  1371.             return (AE_OK);
  1372.         }
  1373.     }
  1374.  
  1375.     /* Get the full pathname to this object */
  1376.  
  1377.     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  1378.     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
  1379.     if (ACPI_FAILURE (Status))
  1380.     {
  1381.         AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
  1382.     }
  1383.     else
  1384.     {
  1385.         Info.OwnerId = ACPI_OWNER_ID_MAX;
  1386.         Info.DebugLevel = ACPI_UINT32_MAX;
  1387.         Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
  1388.  
  1389.         AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
  1390.         (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
  1391.         ACPI_FREE (Buffer.Pointer);
  1392.     }
  1393.  
  1394.     return (AE_OK);
  1395. }
  1396.  
  1397.  
  1398. /*******************************************************************************
  1399.  *
  1400.  * FUNCTION:    AcpiDbFindNameInNamespace
  1401.  *
  1402.  * PARAMETERS:  NameArg         - The 4-character ACPI name to find.
  1403.  *                                wildcards are supported.
  1404.  *
  1405.  * RETURN:      None
  1406.  *
  1407.  * DESCRIPTION: Search the namespace for a given name (with wildcards)
  1408.  *
  1409.  ******************************************************************************/
  1410.  
  1411. ACPI_STATUS
  1412. AcpiDbFindNameInNamespace (
  1413.     char                    *NameArg)
  1414. {
  1415.     char                    AcpiName[5] = "____";
  1416.     char                    *AcpiNamePtr = AcpiName;
  1417.  
  1418.  
  1419.     if (ACPI_STRLEN (NameArg) > 4)
  1420.     {
  1421.         AcpiOsPrintf ("Name must be no longer than 4 characters\n");
  1422.         return (AE_OK);
  1423.     }
  1424.  
  1425.     /* Pad out name with underscores as necessary to create a 4-char name */
  1426.  
  1427.     AcpiUtStrupr (NameArg);
  1428.     while (*NameArg)
  1429.     {
  1430.         *AcpiNamePtr = *NameArg;
  1431.         AcpiNamePtr++;
  1432.         NameArg++;
  1433.     }
  1434.  
  1435.     /* Walk the namespace from the root */
  1436.  
  1437.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  1438.                         AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
  1439.  
  1440.     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
  1441.     return (AE_OK);
  1442. }
  1443.  
  1444.  
  1445. /*******************************************************************************
  1446.  *
  1447.  * FUNCTION:    AcpiDbSetScope
  1448.  *
  1449.  * PARAMETERS:  Name                - New scope path
  1450.  *
  1451.  * RETURN:      Status
  1452.  *
  1453.  * DESCRIPTION: Set the "current scope" as maintained by this utility.
  1454.  *              The scope is used as a prefix to ACPI paths.
  1455.  *
  1456.  ******************************************************************************/
  1457.  
  1458. void
  1459. AcpiDbSetScope (
  1460.     char                    *Name)
  1461. {
  1462.     ACPI_STATUS             Status;
  1463.     ACPI_NAMESPACE_NODE     *Node;
  1464.  
  1465.  
  1466.     if (!Name || Name[0] == 0)
  1467.     {
  1468.         AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
  1469.         return;
  1470.     }
  1471.  
  1472.     AcpiDbPrepNamestring (Name);
  1473.  
  1474.     if (Name[0] == '\\')
  1475.     {
  1476.         /* Validate new scope from the root */
  1477.  
  1478.         Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH,
  1479.                     &Node);
  1480.         if (ACPI_FAILURE (Status))
  1481.         {
  1482.             goto ErrorExit;
  1483.         }
  1484.  
  1485.         ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
  1486.         ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
  1487.     }
  1488.     else
  1489.     {
  1490.         /* Validate new scope relative to old scope */
  1491.  
  1492.         Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH,
  1493.                     &Node);
  1494.         if (ACPI_FAILURE (Status))
  1495.         {
  1496.             goto ErrorExit;
  1497.         }
  1498.  
  1499.         ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
  1500.         ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
  1501.     }
  1502.  
  1503.     AcpiGbl_DbScopeNode = Node;
  1504.     AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
  1505.     return;
  1506.  
  1507. ErrorExit:
  1508.  
  1509.     AcpiOsPrintf ("Could not attach scope: %s, %s\n",
  1510.         Name, AcpiFormatException (Status));
  1511. }
  1512.  
  1513.  
  1514. /*******************************************************************************
  1515.  *
  1516.  * FUNCTION:    AcpiDmCompareAmlResources
  1517.  *
  1518.  * PARAMETERS:  Aml1Buffer          - Contains first resource list
  1519.  *              Aml1BufferLength    - Length of first resource list
  1520.  *              Aml2Buffer          - Contains second resource list
  1521.  *              Aml2BufferLength    - Length of second resource list
  1522.  *
  1523.  * RETURN:      None
  1524.  *
  1525.  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
  1526.  *              order to isolate a miscompare to an individual resource)
  1527.  *
  1528.  ******************************************************************************/
  1529.  
  1530. static void
  1531. AcpiDmCompareAmlResources (
  1532.     UINT8                   *Aml1Buffer,
  1533.     ACPI_RSDESC_SIZE        Aml1BufferLength,
  1534.     UINT8                   *Aml2Buffer,
  1535.     ACPI_RSDESC_SIZE        Aml2BufferLength)
  1536. {
  1537.     UINT8                   *Aml1;
  1538.     UINT8                   *Aml2;
  1539.     ACPI_RSDESC_SIZE        Aml1Length;
  1540.     ACPI_RSDESC_SIZE        Aml2Length;
  1541.     ACPI_RSDESC_SIZE        Offset = 0;
  1542.     UINT8                   ResourceType;
  1543.     UINT32                  Count = 0;
  1544.  
  1545.  
  1546.     /* Compare overall buffer sizes (may be different due to size rounding) */
  1547.  
  1548.     if (Aml1BufferLength != Aml2BufferLength)
  1549.     {
  1550.         AcpiOsPrintf (
  1551.             "**** Buffer length mismatch in converted AML: original %X new %X ****\n",
  1552.             Aml1BufferLength, Aml2BufferLength);
  1553.     }
  1554.  
  1555.     Aml1 = Aml1Buffer;
  1556.     Aml2 = Aml2Buffer;
  1557.  
  1558.     /* Walk the descriptor lists, comparing each descriptor */
  1559.  
  1560.     while (Aml1 < (Aml1Buffer + Aml1BufferLength))
  1561.     {
  1562.         /* Get the lengths of each descriptor */
  1563.  
  1564.         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
  1565.         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
  1566.         ResourceType = AcpiUtGetResourceType (Aml1);
  1567.  
  1568.         /* Check for descriptor length match */
  1569.  
  1570.         if (Aml1Length != Aml2Length)
  1571.         {
  1572.             AcpiOsPrintf (
  1573.                 "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X L1 %X L2 %X ****\n",
  1574.                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
  1575.         }
  1576.  
  1577.         /* Check for descriptor byte match */
  1578.  
  1579.         else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
  1580.         {
  1581.             AcpiOsPrintf (
  1582.                 "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
  1583.                 Count, ResourceType, Offset);
  1584.         }
  1585.  
  1586.         /* Exit on EndTag descriptor */
  1587.  
  1588.         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
  1589.         {
  1590.             return;
  1591.         }
  1592.  
  1593.         /* Point to next descriptor in each buffer */
  1594.  
  1595.         Count++;
  1596.         Offset += Aml1Length;
  1597.         Aml1 += Aml1Length;
  1598.         Aml2 += Aml2Length;
  1599.     }
  1600. }
  1601.  
  1602.  
  1603. /*******************************************************************************
  1604.  *
  1605.  * FUNCTION:    AcpiDmTestResourceConversion
  1606.  *
  1607.  * PARAMETERS:  Node            - Parent device node
  1608.  *              Name            - resource method name (_CRS)
  1609.  *
  1610.  * RETURN:      Status
  1611.  *
  1612.  * DESCRIPTION: Compare the original AML with a conversion of the AML to
  1613.  *              internal resource list, then back to AML.
  1614.  *
  1615.  ******************************************************************************/
  1616.  
  1617. static ACPI_STATUS
  1618. AcpiDmTestResourceConversion (
  1619.     ACPI_NAMESPACE_NODE     *Node,
  1620.     char                    *Name)
  1621. {
  1622.     ACPI_STATUS             Status;
  1623.     ACPI_BUFFER             ReturnObj;
  1624.     ACPI_BUFFER             ResourceObj;
  1625.     ACPI_BUFFER             NewAml;
  1626.     ACPI_OBJECT             *OriginalAml;
  1627.  
  1628.  
  1629.     AcpiOsPrintf ("Resource Conversion Comparison:\n");
  1630.  
  1631.     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  1632.     ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  1633.     ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  1634.  
  1635.     /* Get the original _CRS AML resource template */
  1636.  
  1637.     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
  1638.     if (ACPI_FAILURE (Status))
  1639.     {
  1640.         AcpiOsPrintf ("Could not obtain %s: %s\n",
  1641.             Name, AcpiFormatException (Status));
  1642.         return (Status);
  1643.     }
  1644.  
  1645.     /* Get the AML resource template, converted to internal resource structs */
  1646.  
  1647.     Status = AcpiGetCurrentResources (Node, &ResourceObj);
  1648.     if (ACPI_FAILURE (Status))
  1649.     {
  1650.         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
  1651.             AcpiFormatException (Status));
  1652.         goto Exit1;
  1653.     }
  1654.  
  1655.     /* Convert internal resource list to external AML resource template */
  1656.  
  1657.     Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
  1658.     if (ACPI_FAILURE (Status))
  1659.     {
  1660.         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
  1661.             AcpiFormatException (Status));
  1662.         goto Exit2;
  1663.     }
  1664.  
  1665.     /* Compare original AML to the newly created AML resource list */
  1666.  
  1667.     OriginalAml = ReturnObj.Pointer;
  1668.  
  1669.     AcpiDmCompareAmlResources (
  1670.         OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
  1671.         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
  1672.  
  1673.     /* Cleanup and exit */
  1674.  
  1675.     ACPI_FREE (NewAml.Pointer);
  1676. Exit2:
  1677.     ACPI_FREE (ResourceObj.Pointer);
  1678. Exit1:
  1679.     ACPI_FREE (ReturnObj.Pointer);
  1680.     return (Status);
  1681. }
  1682.  
  1683.  
  1684. /*******************************************************************************
  1685.  *
  1686.  * FUNCTION:    AcpiDbDisplayResources
  1687.  *
  1688.  * PARAMETERS:  ObjectArg       - String with hex value of the object
  1689.  *
  1690.  * RETURN:      None
  1691.  *
  1692.  * DESCRIPTION: Display the resource objects associated with a device.
  1693.  *
  1694.  ******************************************************************************/
  1695.  
  1696. void
  1697. AcpiDbDisplayResources (
  1698.     char                    *ObjectArg)
  1699. {
  1700.     ACPI_NAMESPACE_NODE     *Node;
  1701.     ACPI_STATUS             Status;
  1702.     ACPI_BUFFER             ReturnObj;
  1703.  
  1704.  
  1705.     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
  1706.     AcpiDbgLevel |= ACPI_LV_RESOURCES;
  1707.  
  1708.     /* Convert string to object pointer */
  1709.  
  1710.     Node = AcpiDbConvertToNode (ObjectArg);
  1711.     if (!Node)
  1712.     {
  1713.         return;
  1714.     }
  1715.  
  1716.     /* Prepare for a return object of arbitrary size */
  1717.  
  1718.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1719.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1720.  
  1721.     /* _PRT */
  1722.  
  1723.     AcpiOsPrintf ("Evaluating _PRT\n");
  1724.  
  1725.     /* Check if _PRT exists */
  1726.  
  1727.     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRT, NULL, &ReturnObj);
  1728.     if (ACPI_FAILURE (Status))
  1729.     {
  1730.         AcpiOsPrintf ("Could not obtain _PRT: %s\n",
  1731.             AcpiFormatException (Status));
  1732.         goto GetCrs;
  1733.     }
  1734.  
  1735.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1736.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1737.  
  1738.     Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
  1739.     if (ACPI_FAILURE (Status))
  1740.     {
  1741.         AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
  1742.             AcpiFormatException (Status));
  1743.         goto GetCrs;
  1744.     }
  1745.  
  1746.     AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
  1747.  
  1748.  
  1749.     /* _CRS */
  1750.  
  1751. GetCrs:
  1752.     AcpiOsPrintf ("Evaluating _CRS\n");
  1753.  
  1754.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1755.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1756.  
  1757.     /* Check if _CRS exists */
  1758.  
  1759.     Status = AcpiEvaluateObject (Node, METHOD_NAME__CRS, NULL, &ReturnObj);
  1760.     if (ACPI_FAILURE (Status))
  1761.     {
  1762.         AcpiOsPrintf ("Could not obtain _CRS: %s\n",
  1763.             AcpiFormatException (Status));
  1764.         goto GetPrs;
  1765.     }
  1766.  
  1767.     /* Get the _CRS resource list */
  1768.  
  1769.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1770.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1771.  
  1772.     Status = AcpiGetCurrentResources (Node, &ReturnObj);
  1773.     if (ACPI_FAILURE (Status))
  1774.     {
  1775.         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
  1776.             AcpiFormatException (Status));
  1777.         goto GetPrs;
  1778.     }
  1779.  
  1780.     /* Dump the _CRS resource list */
  1781.  
  1782.     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
  1783.         ReturnObj.Pointer));
  1784.  
  1785.     /*
  1786.      * Perform comparison of original AML to newly created AML. This tests both
  1787.      * the AML->Resource conversion and the Resource->Aml conversion.
  1788.      */
  1789.     Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
  1790.  
  1791.     /* Execute _SRS with the resource list */
  1792.  
  1793.     Status = AcpiSetCurrentResources (Node, &ReturnObj);
  1794.     if (ACPI_FAILURE (Status))
  1795.     {
  1796.         AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
  1797.             AcpiFormatException (Status));
  1798.         goto GetPrs;
  1799.     }
  1800.  
  1801.  
  1802.     /* _PRS */
  1803.  
  1804. GetPrs:
  1805.     AcpiOsPrintf ("Evaluating _PRS\n");
  1806.  
  1807.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1808.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1809.  
  1810.     /* Check if _PRS exists */
  1811.  
  1812.     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRS, NULL, &ReturnObj);
  1813.     if (ACPI_FAILURE (Status))
  1814.     {
  1815.         AcpiOsPrintf ("Could not obtain _PRS: %s\n",
  1816.             AcpiFormatException (Status));
  1817.         goto Cleanup;
  1818.     }
  1819.  
  1820.     ReturnObj.Pointer = AcpiGbl_DbBuffer;
  1821.     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
  1822.  
  1823.     Status = AcpiGetPossibleResources (Node, &ReturnObj);
  1824.     if (ACPI_FAILURE (Status))
  1825.     {
  1826.         AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
  1827.             AcpiFormatException (Status));
  1828.         goto Cleanup;
  1829.     }
  1830.  
  1831.     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
  1832.  
  1833. Cleanup:
  1834.  
  1835.     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
  1836.     return;
  1837. }
  1838.  
  1839.  
  1840. /*******************************************************************************
  1841.  *
  1842.  * FUNCTION:    AcpiDbIntegrityWalk
  1843.  *
  1844.  * PARAMETERS:  Callback from WalkNamespace
  1845.  *
  1846.  * RETURN:      Status
  1847.  *
  1848.  * DESCRIPTION: Examine one NS node for valid values.
  1849.  *
  1850.  ******************************************************************************/
  1851.  
  1852. static ACPI_STATUS
  1853. AcpiDbIntegrityWalk (
  1854.     ACPI_HANDLE             ObjHandle,
  1855.     UINT32                  NestingLevel,
  1856.     void                    *Context,
  1857.     void                    **ReturnValue)
  1858. {
  1859.     ACPI_INTEGRITY_INFO     *Info = (ACPI_INTEGRITY_INFO *) Context;
  1860.     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  1861.     ACPI_OPERAND_OBJECT     *Object;
  1862.     BOOLEAN                 Alias = TRUE;
  1863.  
  1864.  
  1865.     Info->Nodes++;
  1866.  
  1867.     /* Verify the NS node, and dereference aliases */
  1868.  
  1869.     while (Alias)
  1870.     {
  1871.         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
  1872.         {
  1873.             AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n",
  1874.                 Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node),
  1875.                 ACPI_DESC_TYPE_NAMED);
  1876.             return (AE_OK);
  1877.         }
  1878.  
  1879.         if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
  1880.             (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
  1881.         {
  1882.             Node = (ACPI_NAMESPACE_NODE *) Node->Object;
  1883.         }
  1884.         else
  1885.         {
  1886.             Alias = FALSE;
  1887.         }
  1888.     }
  1889.  
  1890.     if (Node->Type > ACPI_TYPE_LOCAL_MAX)
  1891.     {
  1892.         AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
  1893.             Node, Node->Type);
  1894.         return (AE_OK);
  1895.     }
  1896.  
  1897.     if (!AcpiUtValidAcpiName (Node->Name.Integer))
  1898.     {
  1899.         AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
  1900.         return (AE_OK);
  1901.     }
  1902.  
  1903.     Object = AcpiNsGetAttachedObject (Node);
  1904.     if (Object)
  1905.     {
  1906.         Info->Objects++;
  1907.         if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
  1908.         {
  1909.             AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
  1910.                 Object, AcpiUtGetDescriptorName (Object));
  1911.         }
  1912.     }
  1913.  
  1914.     return (AE_OK);
  1915. }
  1916.  
  1917.  
  1918. /*******************************************************************************
  1919.  *
  1920.  * FUNCTION:    AcpiDbCheckIntegrity
  1921.  *
  1922.  * PARAMETERS:  None
  1923.  *
  1924.  * RETURN:      None
  1925.  *
  1926.  * DESCRIPTION: Check entire namespace for data structure integrity
  1927.  *
  1928.  ******************************************************************************/
  1929.  
  1930. void
  1931. AcpiDbCheckIntegrity (
  1932.     void)
  1933. {
  1934.     ACPI_INTEGRITY_INFO     Info = {0,0};
  1935.  
  1936.     /* Search all nodes in namespace */
  1937.  
  1938.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  1939.                     AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
  1940.  
  1941.     AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
  1942.         Info.Nodes, Info.Objects);
  1943. }
  1944.  
  1945.  
  1946. /*******************************************************************************
  1947.  *
  1948.  * FUNCTION:    AcpiDbGenerateGpe
  1949.  *
  1950.  * PARAMETERS:  GpeArg          - Raw GPE number, ascii string
  1951.  *              BlockArg        - GPE block number, ascii string
  1952.  *                                0 or 1 for FADT GPE blocks
  1953.  *
  1954.  * RETURN:      None
  1955.  *
  1956.  * DESCRIPTION: Generate a GPE
  1957.  *
  1958.  ******************************************************************************/
  1959.  
  1960. void
  1961. AcpiDbGenerateGpe (
  1962.     char                    *GpeArg,
  1963.     char                    *BlockArg)
  1964. {
  1965.     UINT32                  BlockNumber;
  1966.     UINT32                  GpeNumber;
  1967.     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
  1968.  
  1969.  
  1970.     GpeNumber   = ACPI_STRTOUL (GpeArg, NULL, 0);
  1971.     BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
  1972.  
  1973.  
  1974.     GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
  1975.         GpeNumber);
  1976.     if (!GpeEventInfo)
  1977.     {
  1978.         AcpiOsPrintf ("Invalid GPE\n");
  1979.         return;
  1980.     }
  1981.  
  1982.     (void) AcpiEvGpeDispatch (GpeEventInfo, GpeNumber);
  1983. }
  1984.  
  1985.  
  1986. /*******************************************************************************
  1987.  *
  1988.  * FUNCTION:    AcpiDbBusWalk
  1989.  *
  1990.  * PARAMETERS:  Callback from WalkNamespace
  1991.  *
  1992.  * RETURN:      Status
  1993.  *
  1994.  * DESCRIPTION: Display info about device objects that have a corresponding
  1995.  *              _PRT method.
  1996.  *
  1997.  ******************************************************************************/
  1998.  
  1999. static ACPI_STATUS
  2000. AcpiDbBusWalk (
  2001.     ACPI_HANDLE             ObjHandle,
  2002.     UINT32                  NestingLevel,
  2003.     void                    *Context,
  2004.     void                    **ReturnValue)
  2005. {
  2006.     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  2007.     ACPI_STATUS             Status;
  2008.     ACPI_BUFFER             Buffer;
  2009.     ACPI_NAMESPACE_NODE     *TempNode;
  2010.     ACPI_DEVICE_INFO        *Info;
  2011.     UINT32                  i;
  2012.  
  2013.  
  2014.     if ((Node->Type != ACPI_TYPE_DEVICE) &&
  2015.         (Node->Type != ACPI_TYPE_PROCESSOR))
  2016.     {
  2017.         return (AE_OK);
  2018.     }
  2019.  
  2020.     /* Exit if there is no _PRT under this device */
  2021.  
  2022.     Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
  2023.                 ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
  2024.     if (ACPI_FAILURE (Status))
  2025.     {
  2026.         return (AE_OK);
  2027.     }
  2028.  
  2029.     /* Get the full path to this device object */
  2030.  
  2031.     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  2032.     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
  2033.     if (ACPI_FAILURE (Status))
  2034.     {
  2035.         AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
  2036.         return (AE_OK);
  2037.     }
  2038.  
  2039.     Status = AcpiGetObjectInfo (ObjHandle, &Info);
  2040.     if (ACPI_FAILURE (Status))
  2041.     {
  2042.         return (AE_OK);
  2043.     }
  2044.  
  2045.     /* Display the full path */
  2046.  
  2047.     AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
  2048.     ACPI_FREE (Buffer.Pointer);
  2049.  
  2050.     if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
  2051.     {
  2052.         AcpiOsPrintf ("  - Is PCI Root Bridge");
  2053.     }
  2054.     AcpiOsPrintf ("\n");
  2055.  
  2056.     /* _PRT info */
  2057.  
  2058.     AcpiOsPrintf ("_PRT: %p\n", TempNode);
  2059.  
  2060.     /* Dump _ADR, _HID, _UID, _CID */
  2061.  
  2062.     if (Info->Valid & ACPI_VALID_ADR)
  2063.     {
  2064.         AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address));
  2065.     }
  2066.     else
  2067.     {
  2068.         AcpiOsPrintf ("_ADR: <Not Present>\n");
  2069.     }
  2070.  
  2071.     if (Info->Valid & ACPI_VALID_HID)
  2072.     {
  2073.         AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
  2074.     }
  2075.     else
  2076.     {
  2077.         AcpiOsPrintf ("_HID: <Not Present>\n");
  2078.     }
  2079.  
  2080.     if (Info->Valid & ACPI_VALID_UID)
  2081.     {
  2082.         AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
  2083.     }
  2084.     else
  2085.     {
  2086.         AcpiOsPrintf ("_UID: <Not Present>\n");
  2087.     }
  2088.  
  2089.     if (Info->Valid & ACPI_VALID_CID)
  2090.     {
  2091.         for (i = 0; i < Info->CompatibleIdList.Count; i++)
  2092.         {
  2093.             AcpiOsPrintf ("_CID: %s\n",
  2094.                 Info->CompatibleIdList.Ids[i].String);
  2095.         }
  2096.     }
  2097.     else
  2098.     {
  2099.         AcpiOsPrintf ("_CID: <Not Present>\n");
  2100.     }
  2101.  
  2102.     ACPI_FREE (Info);
  2103.     return (AE_OK);
  2104. }
  2105.  
  2106.  
  2107. /*******************************************************************************
  2108.  *
  2109.  * FUNCTION:    AcpiDbGetBusInfo
  2110.  *
  2111.  * PARAMETERS:  None
  2112.  *
  2113.  * RETURN:      None
  2114.  *
  2115.  * DESCRIPTION: Display info about system busses.
  2116.  *
  2117.  ******************************************************************************/
  2118.  
  2119. void
  2120. AcpiDbGetBusInfo (
  2121.     void)
  2122. {
  2123.     /* Search all nodes in namespace */
  2124.  
  2125.     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  2126.                     AcpiDbBusWalk, NULL, NULL, NULL);
  2127. }
  2128.  
  2129. #endif /* ACPI_DEBUGGER */
  2130.