xref: /onnv-gate/usr/src/uts/intel/io/acpica/debugger/dbutils.c (revision 9980:13d7f3eec672)
13446Smrj /*******************************************************************************
23446Smrj  *
33446Smrj  * Module Name: dbutils - AML debugger utilities
43446Smrj  *
53446Smrj  ******************************************************************************/
63446Smrj 
73446Smrj /******************************************************************************
83446Smrj  *
93446Smrj  * 1. Copyright Notice
103446Smrj  *
11*9980SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
123446Smrj  * All rights reserved.
133446Smrj  *
143446Smrj  * 2. License
153446Smrj  *
163446Smrj  * 2.1. This is your license from Intel Corp. under its intellectual property
173446Smrj  * rights.  You may have additional license terms from the party that provided
183446Smrj  * you this software, covering your right to use that party's intellectual
193446Smrj  * property rights.
203446Smrj  *
213446Smrj  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
223446Smrj  * copy of the source code appearing in this file ("Covered Code") an
233446Smrj  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
243446Smrj  * base code distributed originally by Intel ("Original Intel Code") to copy,
253446Smrj  * make derivatives, distribute, use and display any portion of the Covered
263446Smrj  * Code in any form, with the right to sublicense such rights; and
273446Smrj  *
283446Smrj  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
293446Smrj  * license (with the right to sublicense), under only those claims of Intel
303446Smrj  * patents that are infringed by the Original Intel Code, to make, use, sell,
313446Smrj  * offer to sell, and import the Covered Code and derivative works thereof
323446Smrj  * solely to the minimum extent necessary to exercise the above copyright
333446Smrj  * license, and in no event shall the patent license extend to any additions
343446Smrj  * to or modifications of the Original Intel Code.  No other license or right
353446Smrj  * is granted directly or by implication, estoppel or otherwise;
363446Smrj  *
373446Smrj  * The above copyright and patent license is granted only if the following
383446Smrj  * conditions are met:
393446Smrj  *
403446Smrj  * 3. Conditions
413446Smrj  *
423446Smrj  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
433446Smrj  * Redistribution of source code of any substantial portion of the Covered
443446Smrj  * Code or modification with rights to further distribute source must include
453446Smrj  * the above Copyright Notice, the above License, this list of Conditions,
463446Smrj  * and the following Disclaimer and Export Compliance provision.  In addition,
473446Smrj  * Licensee must cause all Covered Code to which Licensee contributes to
483446Smrj  * contain a file documenting the changes Licensee made to create that Covered
493446Smrj  * Code and the date of any change.  Licensee must include in that file the
503446Smrj  * documentation of any changes made by any predecessor Licensee.  Licensee
513446Smrj  * must include a prominent statement that the modification is derived,
523446Smrj  * directly or indirectly, from Original Intel Code.
533446Smrj  *
543446Smrj  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
553446Smrj  * Redistribution of source code of any substantial portion of the Covered
563446Smrj  * Code or modification without rights to further distribute source must
573446Smrj  * include the following Disclaimer and Export Compliance provision in the
583446Smrj  * documentation and/or other materials provided with distribution.  In
593446Smrj  * addition, Licensee may not authorize further sublicense of source of any
603446Smrj  * portion of the Covered Code, and must include terms to the effect that the
613446Smrj  * license from Licensee to its licensee is limited to the intellectual
623446Smrj  * property embodied in the software Licensee provides to its licensee, and
633446Smrj  * not to intellectual property embodied in modifications its licensee may
643446Smrj  * make.
653446Smrj  *
663446Smrj  * 3.3. Redistribution of Executable. Redistribution in executable form of any
673446Smrj  * substantial portion of the Covered Code or modification must reproduce the
683446Smrj  * above Copyright Notice, and the following Disclaimer and Export Compliance
693446Smrj  * provision in the documentation and/or other materials provided with the
703446Smrj  * distribution.
713446Smrj  *
723446Smrj  * 3.4. Intel retains all right, title, and interest in and to the Original
733446Smrj  * Intel Code.
743446Smrj  *
753446Smrj  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
763446Smrj  * Intel shall be used in advertising or otherwise to promote the sale, use or
773446Smrj  * other dealings in products derived from or relating to the Covered Code
783446Smrj  * without prior written authorization from Intel.
793446Smrj  *
803446Smrj  * 4. Disclaimer and Export Compliance
813446Smrj  *
823446Smrj  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
833446Smrj  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
843446Smrj  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
853446Smrj  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
863446Smrj  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
873446Smrj  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
883446Smrj  * PARTICULAR PURPOSE.
893446Smrj  *
903446Smrj  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
913446Smrj  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
923446Smrj  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
933446Smrj  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
943446Smrj  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
953446Smrj  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
963446Smrj  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
973446Smrj  * LIMITED REMEDY.
983446Smrj  *
993446Smrj  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1003446Smrj  * software or system incorporating such software without first obtaining any
1013446Smrj  * required license or other approval from the U. S. Department of Commerce or
1023446Smrj  * any other agency or department of the United States Government.  In the
1033446Smrj  * event Licensee exports any such software from the United States or
1043446Smrj  * re-exports any such software from a foreign destination, Licensee shall
1053446Smrj  * ensure that the distribution and export/re-export of the software is in
1063446Smrj  * compliance with all laws, regulations, orders, or other restrictions of the
1073446Smrj  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1083446Smrj  * any of its subsidiaries will export/re-export any technical data, process,
1093446Smrj  * software, or service, directly or indirectly, to any country for which the
1103446Smrj  * United States government or any agency thereof requires an export license,
1113446Smrj  * other governmental approval, or letter of assurance, without first obtaining
1123446Smrj  * such license, approval or letter.
1133446Smrj  *
1143446Smrj  *****************************************************************************/
1153446Smrj 
1163446Smrj 
1173446Smrj #include "acpi.h"
118*9980SDana.Myers@Sun.COM #include "accommon.h"
1193446Smrj #include "acnamesp.h"
1203446Smrj #include "acdebug.h"
1213446Smrj #include "acdisasm.h"
1223446Smrj 
1233446Smrj 
1243446Smrj #ifdef ACPI_DEBUGGER
1253446Smrj 
1263446Smrj #define _COMPONENT          ACPI_CA_DEBUGGER
1273446Smrj         ACPI_MODULE_NAME    ("dbutils")
1283446Smrj 
1293446Smrj /* Local prototypes */
1303446Smrj 
1313446Smrj #ifdef ACPI_OBSOLETE_FUNCTIONS
1323446Smrj ACPI_STATUS
1333446Smrj AcpiDbSecondPassParse (
1343446Smrj     ACPI_PARSE_OBJECT       *Root);
1353446Smrj 
1363446Smrj void
1373446Smrj AcpiDbDumpBuffer (
1383446Smrj     UINT32                  Address);
1393446Smrj #endif
1403446Smrj 
1417851SDana.Myers@Sun.COM static char                 *Converter = "0123456789ABCDEF";
1427851SDana.Myers@Sun.COM 
1433446Smrj 
1443446Smrj /*******************************************************************************
1453446Smrj  *
1463446Smrj  * FUNCTION:    AcpiDbMatchArgument
1473446Smrj  *
1483446Smrj  * PARAMETERS:  UserArgument            - User command line
1493446Smrj  *              Arguments               - Array of commands to match against
1503446Smrj  *
1513446Smrj  * RETURN:      Index into command array or ACPI_TYPE_NOT_FOUND if not found
1523446Smrj  *
1533446Smrj  * DESCRIPTION: Search command array for a command match
1543446Smrj  *
1553446Smrj  ******************************************************************************/
1563446Smrj 
1573446Smrj ACPI_OBJECT_TYPE
AcpiDbMatchArgument(char * UserArgument,ARGUMENT_INFO * Arguments)1583446Smrj AcpiDbMatchArgument (
1593446Smrj     char                    *UserArgument,
1603446Smrj     ARGUMENT_INFO           *Arguments)
1613446Smrj {
1623446Smrj     UINT32                  i;
1633446Smrj 
1643446Smrj 
1653446Smrj     if (!UserArgument || UserArgument[0] == 0)
1663446Smrj     {
1673446Smrj         return (ACPI_TYPE_NOT_FOUND);
1683446Smrj     }
1693446Smrj 
1703446Smrj     for (i = 0; Arguments[i].Name; i++)
1713446Smrj     {
1723446Smrj         if (ACPI_STRSTR (Arguments[i].Name, UserArgument) == Arguments[i].Name)
1733446Smrj         {
1743446Smrj             return (i);
1753446Smrj         }
1763446Smrj     }
1773446Smrj 
1783446Smrj     /* Argument not recognized */
1793446Smrj 
1803446Smrj     return (ACPI_TYPE_NOT_FOUND);
1813446Smrj }
1823446Smrj 
1833446Smrj 
1843446Smrj /*******************************************************************************
1853446Smrj  *
1863446Smrj  * FUNCTION:    AcpiDbSetOutputDestination
1873446Smrj  *
1883446Smrj  * PARAMETERS:  OutputFlags         - Current flags word
1893446Smrj  *
1903446Smrj  * RETURN:      None
1913446Smrj  *
1923446Smrj  * DESCRIPTION: Set the current destination for debugger output.  Also sets
1933446Smrj  *              the debug output level accordingly.
1943446Smrj  *
1953446Smrj  ******************************************************************************/
1963446Smrj 
1973446Smrj void
AcpiDbSetOutputDestination(UINT32 OutputFlags)1983446Smrj AcpiDbSetOutputDestination (
1993446Smrj     UINT32                  OutputFlags)
2003446Smrj {
2013446Smrj 
2023446Smrj     AcpiGbl_DbOutputFlags = (UINT8) OutputFlags;
2033446Smrj 
2043446Smrj     if ((OutputFlags & ACPI_DB_REDIRECTABLE_OUTPUT) && AcpiGbl_DbOutputToFile)
2053446Smrj     {
2063446Smrj         AcpiDbgLevel = AcpiGbl_DbDebugLevel;
2073446Smrj     }
2083446Smrj     else
2093446Smrj     {
2103446Smrj         AcpiDbgLevel = AcpiGbl_DbConsoleDebugLevel;
2113446Smrj     }
2123446Smrj }
2133446Smrj 
2143446Smrj 
2153446Smrj /*******************************************************************************
2163446Smrj  *
2173446Smrj  * FUNCTION:    AcpiDbDumpExternalObject
2183446Smrj  *
2193446Smrj  * PARAMETERS:  ObjDesc         - External ACPI object to dump
2203446Smrj  *              Level           - Nesting level.
2213446Smrj  *
2223446Smrj  * RETURN:      None
2233446Smrj  *
2243446Smrj  * DESCRIPTION: Dump the contents of an ACPI external object
2253446Smrj  *
2263446Smrj  ******************************************************************************/
2273446Smrj 
2283446Smrj void
AcpiDbDumpExternalObject(ACPI_OBJECT * ObjDesc,UINT32 Level)2293446Smrj AcpiDbDumpExternalObject (
2303446Smrj     ACPI_OBJECT             *ObjDesc,
2313446Smrj     UINT32                  Level)
2323446Smrj {
2333446Smrj     UINT32                  i;
2343446Smrj 
2353446Smrj 
2363446Smrj     if (!ObjDesc)
2373446Smrj     {
2383446Smrj         AcpiOsPrintf ("[Null Object]\n");
2393446Smrj         return;
2403446Smrj     }
2413446Smrj 
2423446Smrj     for (i = 0; i < Level; i++)
2433446Smrj     {
2443446Smrj         AcpiOsPrintf ("  ");
2453446Smrj     }
2463446Smrj 
2473446Smrj     switch (ObjDesc->Type)
2483446Smrj     {
2493446Smrj     case ACPI_TYPE_ANY:
2503446Smrj 
2517851SDana.Myers@Sun.COM         AcpiOsPrintf ("[Null Object] (Type=0)\n");
2523446Smrj         break;
2533446Smrj 
2543446Smrj 
2553446Smrj     case ACPI_TYPE_INTEGER:
2563446Smrj 
2573446Smrj         AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
2583446Smrj                     ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
2593446Smrj         break;
2603446Smrj 
2613446Smrj 
2623446Smrj     case ACPI_TYPE_STRING:
2633446Smrj 
2643446Smrj         AcpiOsPrintf ("[String] Length %.2X = ", ObjDesc->String.Length);
2653446Smrj         for (i = 0; i < ObjDesc->String.Length; i++)
2663446Smrj         {
2673446Smrj             AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
2683446Smrj         }
2693446Smrj         AcpiOsPrintf ("\n");
2703446Smrj         break;
2713446Smrj 
2723446Smrj 
2733446Smrj     case ACPI_TYPE_BUFFER:
2743446Smrj 
2753446Smrj         AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
2763446Smrj         if (ObjDesc->Buffer.Length)
2773446Smrj         {
2783446Smrj             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
2793446Smrj                     ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
2803446Smrj         }
2813446Smrj         else
2823446Smrj         {
2833446Smrj             AcpiOsPrintf ("\n");
2843446Smrj         }
2853446Smrj         break;
2863446Smrj 
2873446Smrj 
2883446Smrj     case ACPI_TYPE_PACKAGE:
2893446Smrj 
2903446Smrj         AcpiOsPrintf ("[Package] Contains %d Elements:\n",
2913446Smrj                 ObjDesc->Package.Count);
2923446Smrj 
2933446Smrj         for (i = 0; i < ObjDesc->Package.Count; i++)
2943446Smrj         {
2953446Smrj             AcpiDbDumpExternalObject (&ObjDesc->Package.Elements[i], Level+1);
2963446Smrj         }
2973446Smrj         break;
2983446Smrj 
2993446Smrj 
3003446Smrj     case ACPI_TYPE_LOCAL_REFERENCE:
3013446Smrj 
3027851SDana.Myers@Sun.COM         AcpiOsPrintf ("[Object Reference] = ");
3033446Smrj         AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
3043446Smrj         break;
3053446Smrj 
3063446Smrj 
3073446Smrj     case ACPI_TYPE_PROCESSOR:
3083446Smrj 
3093446Smrj         AcpiOsPrintf ("[Processor]\n");
3103446Smrj         break;
3113446Smrj 
3123446Smrj 
3133446Smrj     case ACPI_TYPE_POWER:
3143446Smrj 
3153446Smrj         AcpiOsPrintf ("[Power Resource]\n");
3163446Smrj         break;
3173446Smrj 
3183446Smrj 
3193446Smrj     default:
3203446Smrj 
3213446Smrj         AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Type);
3223446Smrj         break;
3233446Smrj     }
3243446Smrj }
3253446Smrj 
3263446Smrj 
3273446Smrj /*******************************************************************************
3283446Smrj  *
3293446Smrj  * FUNCTION:    AcpiDbPrepNamestring
3303446Smrj  *
3313446Smrj  * PARAMETERS:  Name            - String to prepare
3323446Smrj  *
3333446Smrj  * RETURN:      None
3343446Smrj  *
3353446Smrj  * DESCRIPTION: Translate all forward slashes and dots to backslashes.
3363446Smrj  *
3373446Smrj  ******************************************************************************/
3383446Smrj 
3393446Smrj void
AcpiDbPrepNamestring(char * Name)3403446Smrj AcpiDbPrepNamestring (
3413446Smrj     char                    *Name)
3423446Smrj {
3433446Smrj 
3443446Smrj     if (!Name)
3453446Smrj     {
3463446Smrj         return;
3473446Smrj     }
3483446Smrj 
3493446Smrj     AcpiUtStrupr (Name);
3503446Smrj 
3513446Smrj     /* Convert a leading forward slash to a backslash */
3523446Smrj 
3533446Smrj     if (*Name == '/')
3543446Smrj     {
3553446Smrj         *Name = '\\';
3563446Smrj     }
3573446Smrj 
3583446Smrj     /* Ignore a leading backslash, this is the root prefix */
3593446Smrj 
3603446Smrj     if (*Name == '\\')
3613446Smrj     {
3623446Smrj         Name++;
3633446Smrj     }
3643446Smrj 
3653446Smrj     /* Convert all slash path separators to dots */
3663446Smrj 
3673446Smrj     while (*Name)
3683446Smrj     {
3693446Smrj         if ((*Name == '/') ||
3703446Smrj             (*Name == '\\'))
3713446Smrj         {
3723446Smrj             *Name = '.';
3733446Smrj         }
3743446Smrj 
3753446Smrj         Name++;
3763446Smrj     }
3773446Smrj }
3783446Smrj 
3793446Smrj 
3803446Smrj /*******************************************************************************
3813446Smrj  *
3823446Smrj  * FUNCTION:    AcpiDbLocalNsLookup
3833446Smrj  *
3843446Smrj  * PARAMETERS:  Name            - Name to lookup
3853446Smrj  *
3863446Smrj  * RETURN:      Pointer to a namespace node, null on failure
3873446Smrj  *
3883446Smrj  * DESCRIPTION: Lookup a name in the ACPI namespace
3893446Smrj  *
3903446Smrj  * Note: Currently begins search from the root.  Could be enhanced to use
3913446Smrj  * the current prefix (scope) node as the search beginning point.
3923446Smrj  *
3933446Smrj  ******************************************************************************/
3943446Smrj 
3953446Smrj ACPI_NAMESPACE_NODE *
AcpiDbLocalNsLookup(char * Name)3963446Smrj AcpiDbLocalNsLookup (
3973446Smrj     char                    *Name)
3983446Smrj {
3993446Smrj     char                    *InternalPath;
4003446Smrj     ACPI_STATUS             Status;
4013446Smrj     ACPI_NAMESPACE_NODE     *Node = NULL;
4023446Smrj 
4033446Smrj 
4043446Smrj     AcpiDbPrepNamestring (Name);
4053446Smrj 
4063446Smrj     /* Build an internal namestring */
4073446Smrj 
4083446Smrj     Status = AcpiNsInternalizeName (Name, &InternalPath);
4093446Smrj     if (ACPI_FAILURE (Status))
4103446Smrj     {
4113446Smrj         AcpiOsPrintf ("Invalid namestring: %s\n", Name);
4123446Smrj         return (NULL);
4133446Smrj     }
4143446Smrj 
4153446Smrj     /*
4163446Smrj      * Lookup the name.
4173446Smrj      * (Uses root node as the search starting point)
4183446Smrj      */
4193446Smrj     Status = AcpiNsLookup (NULL, InternalPath, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
4203446Smrj                     ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
4213446Smrj     if (ACPI_FAILURE (Status))
4223446Smrj     {
4233446Smrj         AcpiOsPrintf ("Could not locate name: %s, %s\n",
4243446Smrj                 Name, AcpiFormatException (Status));
4253446Smrj     }
4263446Smrj 
4273446Smrj     ACPI_FREE (InternalPath);
4283446Smrj     return (Node);
4293446Smrj }
4303446Smrj 
4313446Smrj 
4327851SDana.Myers@Sun.COM /*******************************************************************************
4337851SDana.Myers@Sun.COM  *
4347851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDbUInt32ToHexString
4357851SDana.Myers@Sun.COM  *
4367851SDana.Myers@Sun.COM  * PARAMETERS:  Value           - The value to be converted to string
4377851SDana.Myers@Sun.COM  *              Buffer          - Buffer for result (not less than 11 bytes)
4387851SDana.Myers@Sun.COM  *
4397851SDana.Myers@Sun.COM  * RETURN:      None
4407851SDana.Myers@Sun.COM  *
4417851SDana.Myers@Sun.COM  * DESCRIPTION: Convert the unsigned 32-bit value to the hexadecimal image
4427851SDana.Myers@Sun.COM  *
4437851SDana.Myers@Sun.COM  * NOTE: It is the caller's responsibility to ensure that the length of buffer
4447851SDana.Myers@Sun.COM  *       is sufficient.
4457851SDana.Myers@Sun.COM  *
4467851SDana.Myers@Sun.COM  ******************************************************************************/
4477851SDana.Myers@Sun.COM 
4487851SDana.Myers@Sun.COM void
AcpiDbUInt32ToHexString(UINT32 Value,char * Buffer)4497851SDana.Myers@Sun.COM AcpiDbUInt32ToHexString (
4507851SDana.Myers@Sun.COM     UINT32                  Value,
4517851SDana.Myers@Sun.COM     char                    *Buffer)
4527851SDana.Myers@Sun.COM {
4537851SDana.Myers@Sun.COM     UINT8                   i;
4547851SDana.Myers@Sun.COM 
4557851SDana.Myers@Sun.COM 
4567851SDana.Myers@Sun.COM     if (Value == 0)
4577851SDana.Myers@Sun.COM     {
4587851SDana.Myers@Sun.COM         ACPI_STRCPY (Buffer, "0");
4597851SDana.Myers@Sun.COM         return;
4607851SDana.Myers@Sun.COM     }
4617851SDana.Myers@Sun.COM 
4627851SDana.Myers@Sun.COM     ACPI_STRCPY (Buffer, "0x");
4637851SDana.Myers@Sun.COM     Buffer[10] = '\0';
4647851SDana.Myers@Sun.COM 
4657851SDana.Myers@Sun.COM     for (i = 9; i > 1; i--)
4667851SDana.Myers@Sun.COM     {
4677851SDana.Myers@Sun.COM         Buffer[i] = Converter [Value & 0x0F];
4687851SDana.Myers@Sun.COM         Value = Value >> 4;
4697851SDana.Myers@Sun.COM     }
4707851SDana.Myers@Sun.COM }
4717851SDana.Myers@Sun.COM 
4727851SDana.Myers@Sun.COM 
4733446Smrj #ifdef ACPI_OBSOLETE_FUNCTIONS
4743446Smrj /*******************************************************************************
4753446Smrj  *
4763446Smrj  * FUNCTION:    AcpiDbSecondPassParse
4773446Smrj  *
4783446Smrj  * PARAMETERS:  Root            - Root of the parse tree
4793446Smrj  *
4803446Smrj  * RETURN:      Status
4813446Smrj  *
4823446Smrj  * DESCRIPTION: Second pass parse of the ACPI tables.  We need to wait until
4833446Smrj  *              second pass to parse the control methods
4843446Smrj  *
4853446Smrj  ******************************************************************************/
4863446Smrj 
4873446Smrj ACPI_STATUS
AcpiDbSecondPassParse(ACPI_PARSE_OBJECT * Root)4883446Smrj AcpiDbSecondPassParse (
4893446Smrj     ACPI_PARSE_OBJECT       *Root)
4903446Smrj {
4913446Smrj     ACPI_PARSE_OBJECT       *Op = Root;
4923446Smrj     ACPI_PARSE_OBJECT       *Method;
4933446Smrj     ACPI_PARSE_OBJECT       *SearchOp;
4943446Smrj     ACPI_PARSE_OBJECT       *StartOp;
4953446Smrj     ACPI_STATUS             Status = AE_OK;
4963446Smrj     UINT32                  BaseAmlOffset;
4973446Smrj     ACPI_WALK_STATE         *WalkState;
4983446Smrj 
4993446Smrj 
5003446Smrj     ACPI_FUNCTION_ENTRY ();
5013446Smrj 
5023446Smrj 
5033446Smrj     AcpiOsPrintf ("Pass two parse ....\n");
5043446Smrj 
5053446Smrj     while (Op)
5063446Smrj     {
5073446Smrj         if (Op->Common.AmlOpcode == AML_METHOD_OP)
5083446Smrj         {
5093446Smrj             Method = Op;
5103446Smrj 
5113446Smrj             /* Create a new walk state for the parse */
5123446Smrj 
5133446Smrj             WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
5143446Smrj             if (!WalkState)
5153446Smrj             {
5163446Smrj                 return (AE_NO_MEMORY);
5173446Smrj             }
5183446Smrj 
5193446Smrj             /* Init the Walk State */
5203446Smrj 
5213446Smrj             WalkState->ParserState.Aml          =
5223446Smrj             WalkState->ParserState.AmlStart     = Method->Named.Data;
5233446Smrj             WalkState->ParserState.AmlEnd       =
5243446Smrj             WalkState->ParserState.PkgEnd       = Method->Named.Data +
5253446Smrj                                                   Method->Named.Length;
5263446Smrj             WalkState->ParserState.StartScope   = Op;
5273446Smrj 
5283446Smrj             WalkState->DescendingCallback       = AcpiDsLoad1BeginOp;
5293446Smrj             WalkState->AscendingCallback        = AcpiDsLoad1EndOp;
5303446Smrj 
5313446Smrj             /* Perform the AML parse */
5323446Smrj 
5333446Smrj             Status = AcpiPsParseAml (WalkState);
5343446Smrj 
5353446Smrj             BaseAmlOffset = (Method->Common.Value.Arg)->Common.AmlOffset + 1;
5363446Smrj             StartOp = (Method->Common.Value.Arg)->Common.Next;
5373446Smrj             SearchOp = StartOp;
5383446Smrj 
5393446Smrj             while (SearchOp)
5403446Smrj             {
5413446Smrj                 SearchOp->Common.AmlOffset += BaseAmlOffset;
5423446Smrj                 SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
5433446Smrj             }
5443446Smrj         }
5453446Smrj 
5463446Smrj         if (Op->Common.AmlOpcode == AML_REGION_OP)
5473446Smrj         {
5483446Smrj             /* TBD: [Investigate] this isn't quite the right thing to do! */
5493446Smrj             /*
5503446Smrj              *
5513446Smrj              * Method = (ACPI_DEFERRED_OP *) Op;
5523446Smrj              * Status = AcpiPsParseAml (Op, Method->Body, Method->BodyLength);
5533446Smrj              */
5543446Smrj         }
5553446Smrj 
5563446Smrj         if (ACPI_FAILURE (Status))
5573446Smrj         {
5583446Smrj             break;
5593446Smrj         }
5603446Smrj 
5613446Smrj         Op = AcpiPsGetDepthNext (Root, Op);
5623446Smrj     }
5633446Smrj 
5643446Smrj     return (Status);
5653446Smrj }
5663446Smrj 
5673446Smrj 
5683446Smrj /*******************************************************************************
5693446Smrj  *
5703446Smrj  * FUNCTION:    AcpiDbDumpBuffer
5713446Smrj  *
5723446Smrj  * PARAMETERS:  Address             - Pointer to the buffer
5733446Smrj  *
5743446Smrj  * RETURN:      None
5753446Smrj  *
5763446Smrj  * DESCRIPTION: Print a portion of a buffer
5773446Smrj  *
5783446Smrj  ******************************************************************************/
5793446Smrj 
5803446Smrj void
AcpiDbDumpBuffer(UINT32 Address)5813446Smrj AcpiDbDumpBuffer (
5823446Smrj     UINT32                  Address)
5833446Smrj {
5843446Smrj 
5853446Smrj     AcpiOsPrintf ("\nLocation %X:\n", Address);
5863446Smrj 
5873446Smrj     AcpiDbgLevel |= ACPI_LV_TABLES;
5883446Smrj     AcpiUtDumpBuffer (ACPI_TO_POINTER (Address), 64, DB_BYTE_DISPLAY,
5893446Smrj             ACPI_UINT32_MAX);
5903446Smrj }
5913446Smrj #endif
5923446Smrj 
5933446Smrj #endif /* ACPI_DEBUGGER */
5943446Smrj 
5953446Smrj 
596