xref: /freebsd/sys/contrib/dev/acpica/compiler/asllookup.c (revision fba7fc7e34e95963b681b882698b951b35d1ba48)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: asllookup- Namespace lookup
4fba7fc7eSJung-uk Kim  *              $Revision: 1.95 $
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
853289f6aSNate Lawson /******************************************************************************
953289f6aSNate Lawson  *
1053289f6aSNate Lawson  * 1. Copyright Notice
1153289f6aSNate Lawson  *
12fba7fc7eSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
1353289f6aSNate Lawson  * All rights reserved.
1453289f6aSNate Lawson  *
1553289f6aSNate Lawson  * 2. License
1653289f6aSNate Lawson  *
1753289f6aSNate Lawson  * 2.1. This is your license from Intel Corp. under its intellectual property
1853289f6aSNate Lawson  * rights.  You may have additional license terms from the party that provided
1953289f6aSNate Lawson  * you this software, covering your right to use that party's intellectual
2053289f6aSNate Lawson  * property rights.
2153289f6aSNate Lawson  *
2253289f6aSNate Lawson  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2353289f6aSNate Lawson  * copy of the source code appearing in this file ("Covered Code") an
2453289f6aSNate Lawson  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2553289f6aSNate Lawson  * base code distributed originally by Intel ("Original Intel Code") to copy,
2653289f6aSNate Lawson  * make derivatives, distribute, use and display any portion of the Covered
2753289f6aSNate Lawson  * Code in any form, with the right to sublicense such rights; and
2853289f6aSNate Lawson  *
2953289f6aSNate Lawson  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3053289f6aSNate Lawson  * license (with the right to sublicense), under only those claims of Intel
3153289f6aSNate Lawson  * patents that are infringed by the Original Intel Code, to make, use, sell,
3253289f6aSNate Lawson  * offer to sell, and import the Covered Code and derivative works thereof
3353289f6aSNate Lawson  * solely to the minimum extent necessary to exercise the above copyright
3453289f6aSNate Lawson  * license, and in no event shall the patent license extend to any additions
3553289f6aSNate Lawson  * to or modifications of the Original Intel Code.  No other license or right
3653289f6aSNate Lawson  * is granted directly or by implication, estoppel or otherwise;
3753289f6aSNate Lawson  *
3853289f6aSNate Lawson  * The above copyright and patent license is granted only if the following
3953289f6aSNate Lawson  * conditions are met:
4053289f6aSNate Lawson  *
4153289f6aSNate Lawson  * 3. Conditions
4253289f6aSNate Lawson  *
4353289f6aSNate Lawson  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4453289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
4553289f6aSNate Lawson  * Code or modification with rights to further distribute source must include
4653289f6aSNate Lawson  * the above Copyright Notice, the above License, this list of Conditions,
4753289f6aSNate Lawson  * and the following Disclaimer and Export Compliance provision.  In addition,
4853289f6aSNate Lawson  * Licensee must cause all Covered Code to which Licensee contributes to
4953289f6aSNate Lawson  * contain a file documenting the changes Licensee made to create that Covered
5053289f6aSNate Lawson  * Code and the date of any change.  Licensee must include in that file the
5153289f6aSNate Lawson  * documentation of any changes made by any predecessor Licensee.  Licensee
5253289f6aSNate Lawson  * must include a prominent statement that the modification is derived,
5353289f6aSNate Lawson  * directly or indirectly, from Original Intel Code.
5453289f6aSNate Lawson  *
5553289f6aSNate Lawson  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5653289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
5753289f6aSNate Lawson  * Code or modification without rights to further distribute source must
5853289f6aSNate Lawson  * include the following Disclaimer and Export Compliance provision in the
5953289f6aSNate Lawson  * documentation and/or other materials provided with distribution.  In
6053289f6aSNate Lawson  * addition, Licensee may not authorize further sublicense of source of any
6153289f6aSNate Lawson  * portion of the Covered Code, and must include terms to the effect that the
6253289f6aSNate Lawson  * license from Licensee to its licensee is limited to the intellectual
6353289f6aSNate Lawson  * property embodied in the software Licensee provides to its licensee, and
6453289f6aSNate Lawson  * not to intellectual property embodied in modifications its licensee may
6553289f6aSNate Lawson  * make.
6653289f6aSNate Lawson  *
6753289f6aSNate Lawson  * 3.3. Redistribution of Executable. Redistribution in executable form of any
6853289f6aSNate Lawson  * substantial portion of the Covered Code or modification must reproduce the
6953289f6aSNate Lawson  * above Copyright Notice, and the following Disclaimer and Export Compliance
7053289f6aSNate Lawson  * provision in the documentation and/or other materials provided with the
7153289f6aSNate Lawson  * distribution.
7253289f6aSNate Lawson  *
7353289f6aSNate Lawson  * 3.4. Intel retains all right, title, and interest in and to the Original
7453289f6aSNate Lawson  * Intel Code.
7553289f6aSNate Lawson  *
7653289f6aSNate Lawson  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7753289f6aSNate Lawson  * Intel shall be used in advertising or otherwise to promote the sale, use or
7853289f6aSNate Lawson  * other dealings in products derived from or relating to the Covered Code
7953289f6aSNate Lawson  * without prior written authorization from Intel.
8053289f6aSNate Lawson  *
8153289f6aSNate Lawson  * 4. Disclaimer and Export Compliance
8253289f6aSNate Lawson  *
8353289f6aSNate Lawson  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8453289f6aSNate Lawson  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8553289f6aSNate Lawson  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8653289f6aSNate Lawson  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8753289f6aSNate Lawson  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8853289f6aSNate Lawson  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8953289f6aSNate Lawson  * PARTICULAR PURPOSE.
9053289f6aSNate Lawson  *
9153289f6aSNate Lawson  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9253289f6aSNate Lawson  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9353289f6aSNate Lawson  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9453289f6aSNate Lawson  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9553289f6aSNate Lawson  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9653289f6aSNate Lawson  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9753289f6aSNate Lawson  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9853289f6aSNate Lawson  * LIMITED REMEDY.
9953289f6aSNate Lawson  *
10053289f6aSNate Lawson  * 4.3. Licensee shall not export, either directly or indirectly, any of this
10153289f6aSNate Lawson  * software or system incorporating such software without first obtaining any
10253289f6aSNate Lawson  * required license or other approval from the U. S. Department of Commerce or
10353289f6aSNate Lawson  * any other agency or department of the United States Government.  In the
10453289f6aSNate Lawson  * event Licensee exports any such software from the United States or
10553289f6aSNate Lawson  * re-exports any such software from a foreign destination, Licensee shall
10653289f6aSNate Lawson  * ensure that the distribution and export/re-export of the software is in
10753289f6aSNate Lawson  * compliance with all laws, regulations, orders, or other restrictions of the
10853289f6aSNate Lawson  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10953289f6aSNate Lawson  * any of its subsidiaries will export/re-export any technical data, process,
11053289f6aSNate Lawson  * software, or service, directly or indirectly, to any country for which the
11153289f6aSNate Lawson  * United States government or any agency thereof requires an export license,
11253289f6aSNate Lawson  * other governmental approval, or letter of assurance, without first obtaining
11353289f6aSNate Lawson  * such license, approval or letter.
11453289f6aSNate Lawson  *
11553289f6aSNate Lawson  *****************************************************************************/
11653289f6aSNate Lawson 
11753289f6aSNate Lawson 
118fba7fc7eSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
11953289f6aSNate Lawson #include "aslcompiler.y.h"
12053289f6aSNate Lawson 
121fba7fc7eSJung-uk Kim #include <contrib/dev/acpica/acparser.h>
122fba7fc7eSJung-uk Kim #include <contrib/dev/acpica/amlcode.h>
123fba7fc7eSJung-uk Kim #include <contrib/dev/acpica/acnamesp.h>
124fba7fc7eSJung-uk Kim #include <contrib/dev/acpica/acdispat.h>
12553289f6aSNate Lawson 
12653289f6aSNate Lawson 
12753289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
12853289f6aSNate Lawson         ACPI_MODULE_NAME    ("asllookup")
12953289f6aSNate Lawson 
130fba7fc7eSJung-uk Kim /* Local prototypes */
131fba7fc7eSJung-uk Kim 
132fba7fc7eSJung-uk Kim static ACPI_STATUS
133fba7fc7eSJung-uk Kim LsCompareOneNamespaceObject (
134fba7fc7eSJung-uk Kim     ACPI_HANDLE             ObjHandle,
135fba7fc7eSJung-uk Kim     UINT32                  Level,
136fba7fc7eSJung-uk Kim     void                    *Context,
137fba7fc7eSJung-uk Kim     void                    **ReturnValue);
138fba7fc7eSJung-uk Kim 
139fba7fc7eSJung-uk Kim static ACPI_STATUS
140fba7fc7eSJung-uk Kim LsDoOneNamespaceObject (
141fba7fc7eSJung-uk Kim     ACPI_HANDLE             ObjHandle,
142fba7fc7eSJung-uk Kim     UINT32                  Level,
143fba7fc7eSJung-uk Kim     void                    *Context,
144fba7fc7eSJung-uk Kim     void                    **ReturnValue);
145fba7fc7eSJung-uk Kim 
146fba7fc7eSJung-uk Kim static BOOLEAN
147fba7fc7eSJung-uk Kim LkObjectExists (
148fba7fc7eSJung-uk Kim     char                    *Name);
149fba7fc7eSJung-uk Kim 
150fba7fc7eSJung-uk Kim static void
151fba7fc7eSJung-uk Kim LkCheckFieldRange (
152fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
153fba7fc7eSJung-uk Kim     UINT32                  RegionBitLength,
154fba7fc7eSJung-uk Kim     UINT32                  FieldBitOffset,
155fba7fc7eSJung-uk Kim     UINT32                  FieldBitLength,
156fba7fc7eSJung-uk Kim     UINT32                  AccessBitWidth);
157fba7fc7eSJung-uk Kim 
158fba7fc7eSJung-uk Kim static ACPI_STATUS
159fba7fc7eSJung-uk Kim LkNamespaceLocateBegin (
160fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
161fba7fc7eSJung-uk Kim     UINT32                  Level,
162fba7fc7eSJung-uk Kim     void                    *Context);
163fba7fc7eSJung-uk Kim 
164fba7fc7eSJung-uk Kim static ACPI_STATUS
165fba7fc7eSJung-uk Kim LkNamespaceLocateEnd (
166fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
167fba7fc7eSJung-uk Kim     UINT32                  Level,
168fba7fc7eSJung-uk Kim     void                    *Context);
169fba7fc7eSJung-uk Kim 
17053289f6aSNate Lawson 
17153289f6aSNate Lawson /*******************************************************************************
17253289f6aSNate Lawson  *
17353289f6aSNate Lawson  * FUNCTION:    LsDoOneNamespaceObject
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
17653289f6aSNate Lawson  *
17753289f6aSNate Lawson  * RETURN:      Status
17853289f6aSNate Lawson  *
17953289f6aSNate Lawson  * DESCRIPTION: Dump a namespace object to the namespace output file.
18053289f6aSNate Lawson  *              Called during the walk of the namespace to dump all objects.
18153289f6aSNate Lawson  *
18253289f6aSNate Lawson  ******************************************************************************/
18353289f6aSNate Lawson 
184fba7fc7eSJung-uk Kim static ACPI_STATUS
18553289f6aSNate Lawson LsDoOneNamespaceObject (
18653289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
18753289f6aSNate Lawson     UINT32                  Level,
18853289f6aSNate Lawson     void                    *Context,
18953289f6aSNate Lawson     void                    **ReturnValue)
19053289f6aSNate Lawson {
19153289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
192fba7fc7eSJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
19353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op;
19453289f6aSNate Lawson 
19553289f6aSNate Lawson 
19653289f6aSNate Lawson     Gbl_NumNamespaceObjects++;
19753289f6aSNate Lawson 
19853289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5d  [%d]  %*s %4.4s - %s",
19953289f6aSNate Lawson                         Gbl_NumNamespaceObjects, Level, (Level * 3), " ",
20053289f6aSNate Lawson                         &Node->Name,
20153289f6aSNate Lawson                         AcpiUtGetTypeName (Node->Type));
20253289f6aSNate Lawson 
203fba7fc7eSJung-uk Kim     Op = Node->Op;
204fba7fc7eSJung-uk Kim     ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object);
20553289f6aSNate Lawson 
206fba7fc7eSJung-uk Kim     if (!Op)
20753289f6aSNate Lawson     {
208fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
209fba7fc7eSJung-uk Kim         return (AE_OK);
21053289f6aSNate Lawson     }
21153289f6aSNate Lawson 
212fba7fc7eSJung-uk Kim 
213fba7fc7eSJung-uk Kim     if ((ObjDesc) &&
214fba7fc7eSJung-uk Kim         (ObjDesc->Common.Descriptor == ACPI_DESC_TYPE_OPERAND))
215fba7fc7eSJung-uk Kim     {
21653289f6aSNate Lawson         switch (Node->Type)
21753289f6aSNate Lawson         {
21853289f6aSNate Lawson         case ACPI_TYPE_INTEGER:
21953289f6aSNate Lawson 
220fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
221fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
222fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
22353289f6aSNate Lawson             break;
22453289f6aSNate Lawson 
22553289f6aSNate Lawson 
22653289f6aSNate Lawson         case ACPI_TYPE_STRING:
22753289f6aSNate Lawson 
228fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
229fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
230fba7fc7eSJung-uk Kim                 ObjDesc->String.Pointer);
231fba7fc7eSJung-uk Kim             break;
232fba7fc7eSJung-uk Kim 
233fba7fc7eSJung-uk Kim         default:
234fba7fc7eSJung-uk Kim             /* Nothing to do for other types */
235fba7fc7eSJung-uk Kim             break;
236fba7fc7eSJung-uk Kim         }
237fba7fc7eSJung-uk Kim 
238fba7fc7eSJung-uk Kim     }
239fba7fc7eSJung-uk Kim     else
240fba7fc7eSJung-uk Kim     {
241fba7fc7eSJung-uk Kim         switch (Node->Type)
242fba7fc7eSJung-uk Kim         {
243fba7fc7eSJung-uk Kim         case ACPI_TYPE_INTEGER:
244fba7fc7eSJung-uk Kim 
245fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
246fba7fc7eSJung-uk Kim             {
247fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
248fba7fc7eSJung-uk Kim             }
24953289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
25053289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
25153289f6aSNate Lawson             {
25253289f6aSNate Lawson                 Op = Op->Asl.Next;
25353289f6aSNate Lawson             }
254fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
255fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
256fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
257fba7fc7eSJung-uk Kim             break;
25853289f6aSNate Lawson 
259fba7fc7eSJung-uk Kim 
260fba7fc7eSJung-uk Kim         case ACPI_TYPE_STRING:
261fba7fc7eSJung-uk Kim 
262fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
263fba7fc7eSJung-uk Kim             {
264fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
265fba7fc7eSJung-uk Kim             }
266fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
267fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
268fba7fc7eSJung-uk Kim             {
269fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
270fba7fc7eSJung-uk Kim             }
271fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
272fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
27353289f6aSNate Lawson                 Op->Asl.Value.String);
27453289f6aSNate Lawson             break;
27553289f6aSNate Lawson 
27653289f6aSNate Lawson 
27753289f6aSNate Lawson         case ACPI_TYPE_LOCAL_REGION_FIELD:
27853289f6aSNate Lawson 
27953289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
28053289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
28153289f6aSNate Lawson             {
28253289f6aSNate Lawson                 Op = Op->Asl.Child;
28353289f6aSNate Lawson             }
284fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
285fba7fc7eSJung-uk Kim                 "   [Offset 0x%04X   Length 0x%04X bits]",
28653289f6aSNate Lawson                 Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer);
28753289f6aSNate Lawson             break;
28853289f6aSNate Lawson 
28953289f6aSNate Lawson 
290fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER_FIELD:
291fba7fc7eSJung-uk Kim 
292fba7fc7eSJung-uk Kim             switch (Op->Asl.ParseOpcode)
293fba7fc7eSJung-uk Kim             {
294fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBYTEFIELD:
295fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BYTE  ( 8 bit)]");
296fba7fc7eSJung-uk Kim                 break;
297fba7fc7eSJung-uk Kim 
298fba7fc7eSJung-uk Kim             case PARSEOP_CREATEDWORDFIELD:
299fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [DWORD (32 bit)]");
300fba7fc7eSJung-uk Kim                 break;
301fba7fc7eSJung-uk Kim 
302fba7fc7eSJung-uk Kim             case PARSEOP_CREATEQWORDFIELD:
303fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [QWORD (64 bit)]");
304fba7fc7eSJung-uk Kim                 break;
305fba7fc7eSJung-uk Kim 
306fba7fc7eSJung-uk Kim             case PARSEOP_CREATEWORDFIELD:
307fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [WORD  (16 bit)]");
308fba7fc7eSJung-uk Kim                 break;
309fba7fc7eSJung-uk Kim 
310fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBITFIELD:
311fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BIT   ( 1 bit)]");
312fba7fc7eSJung-uk Kim                 break;
313fba7fc7eSJung-uk Kim 
314fba7fc7eSJung-uk Kim             case PARSEOP_CREATEFIELD:
315fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [Arbitrary Bit Field]");
316fba7fc7eSJung-uk Kim                 break;
317fba7fc7eSJung-uk Kim 
318fba7fc7eSJung-uk Kim             default:
319fba7fc7eSJung-uk Kim                 break;
320fba7fc7eSJung-uk Kim 
321fba7fc7eSJung-uk Kim             }
322fba7fc7eSJung-uk Kim             break;
323fba7fc7eSJung-uk Kim 
324fba7fc7eSJung-uk Kim 
325fba7fc7eSJung-uk Kim         case ACPI_TYPE_PACKAGE:
326fba7fc7eSJung-uk Kim 
327fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
328fba7fc7eSJung-uk Kim             {
329fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
330fba7fc7eSJung-uk Kim             }
331fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
332fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
333fba7fc7eSJung-uk Kim             {
334fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
335fba7fc7eSJung-uk Kim             }
336fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
337fba7fc7eSJung-uk Kim 
338fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) ||
339fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA))
340fba7fc7eSJung-uk Kim             {
341fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
342fba7fc7eSJung-uk Kim                     "       [Initial Length  0x%.2X elements]",
343fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
344fba7fc7eSJung-uk Kim             }
345fba7fc7eSJung-uk Kim             break;
346fba7fc7eSJung-uk Kim 
347fba7fc7eSJung-uk Kim 
348fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER:
349fba7fc7eSJung-uk Kim 
350fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
351fba7fc7eSJung-uk Kim             {
352fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
353fba7fc7eSJung-uk Kim             }
354fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
355fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
356fba7fc7eSJung-uk Kim             {
357fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
358fba7fc7eSJung-uk Kim             }
359fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
360fba7fc7eSJung-uk Kim 
361fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_INTEGER)
362fba7fc7eSJung-uk Kim             {
363fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
364fba7fc7eSJung-uk Kim                     "        [Initial Length  0x%.2X bytes]",
365fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
366fba7fc7eSJung-uk Kim             }
367fba7fc7eSJung-uk Kim             break;
368fba7fc7eSJung-uk Kim 
369fba7fc7eSJung-uk Kim 
370fba7fc7eSJung-uk Kim         case ACPI_TYPE_METHOD:
371fba7fc7eSJung-uk Kim 
372fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
373fba7fc7eSJung-uk Kim                 "        [Code Length     0x%.4X bytes]",
374fba7fc7eSJung-uk Kim                 Op->Asl.AmlSubtreeLength);
375fba7fc7eSJung-uk Kim             break;
376fba7fc7eSJung-uk Kim 
377fba7fc7eSJung-uk Kim 
37853289f6aSNate Lawson         default:
37953289f6aSNate Lawson             /* Nothing to do for other types */
38053289f6aSNate Lawson             break;
38153289f6aSNate Lawson         }
38253289f6aSNate Lawson     }
38353289f6aSNate Lawson 
38453289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
38553289f6aSNate Lawson     return (AE_OK);
38653289f6aSNate Lawson }
38753289f6aSNate Lawson 
38853289f6aSNate Lawson 
38953289f6aSNate Lawson /*******************************************************************************
39053289f6aSNate Lawson  *
39153289f6aSNate Lawson  * FUNCTION:    LsDisplayNamespace
39253289f6aSNate Lawson  *
39353289f6aSNate Lawson  * PARAMETERS:  None
39453289f6aSNate Lawson  *
395fba7fc7eSJung-uk Kim  * RETURN:      Status
39653289f6aSNate Lawson  *
39753289f6aSNate Lawson  * DESCRIPTION: Walk the namespace an display information about each node
39853289f6aSNate Lawson  *              in the tree.  Information is written to the optional
39953289f6aSNate Lawson  *              namespace output file.
40053289f6aSNate Lawson  *
40153289f6aSNate Lawson  ******************************************************************************/
40253289f6aSNate Lawson 
40353289f6aSNate Lawson ACPI_STATUS
40453289f6aSNate Lawson LsDisplayNamespace (
40553289f6aSNate Lawson     void)
40653289f6aSNate Lawson {
40753289f6aSNate Lawson     ACPI_STATUS             Status;
40853289f6aSNate Lawson 
40953289f6aSNate Lawson 
41053289f6aSNate Lawson     if (!Gbl_NsOutputFlag)
41153289f6aSNate Lawson     {
41253289f6aSNate Lawson         return (AE_OK);
41353289f6aSNate Lawson     }
41453289f6aSNate Lawson 
41553289f6aSNate Lawson     /* File header */
41653289f6aSNate Lawson 
41753289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n");
41853289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count  Depth    Name - Type\n\n");
41953289f6aSNate Lawson 
42053289f6aSNate Lawson     /* Walk entire namespace from the root */
42153289f6aSNate Lawson 
42253289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
42353289f6aSNate Lawson                 ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject,
42453289f6aSNate Lawson                 NULL, NULL);
42553289f6aSNate Lawson     return (Status);
42653289f6aSNate Lawson }
42753289f6aSNate Lawson 
42853289f6aSNate Lawson 
42953289f6aSNate Lawson /*******************************************************************************
43053289f6aSNate Lawson  *
43153289f6aSNate Lawson  * FUNCTION:    LsCompareOneNamespaceObject
43253289f6aSNate Lawson  *
43353289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
43453289f6aSNate Lawson  *
43553289f6aSNate Lawson  * RETURN:      Status
43653289f6aSNate Lawson  *
43753289f6aSNate Lawson  * DESCRIPTION: Compare name of one object.
43853289f6aSNate Lawson  *
43953289f6aSNate Lawson  ******************************************************************************/
44053289f6aSNate Lawson 
441fba7fc7eSJung-uk Kim static ACPI_STATUS
44253289f6aSNate Lawson LsCompareOneNamespaceObject (
44353289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
44453289f6aSNate Lawson     UINT32                  Level,
44553289f6aSNate Lawson     void                    *Context,
44653289f6aSNate Lawson     void                    **ReturnValue)
44753289f6aSNate Lawson {
44853289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
44953289f6aSNate Lawson 
45053289f6aSNate Lawson 
45153289f6aSNate Lawson     /* Simply check the name */
45253289f6aSNate Lawson 
45353289f6aSNate Lawson     if (*((UINT32 *) (Context)) == Node->Name.Integer)
45453289f6aSNate Lawson     {
45553289f6aSNate Lawson         /* Abort walk if we found one instance */
45653289f6aSNate Lawson 
45753289f6aSNate Lawson         return (AE_CTRL_TRUE);
45853289f6aSNate Lawson     }
45953289f6aSNate Lawson 
46053289f6aSNate Lawson     return (AE_OK);
46153289f6aSNate Lawson }
46253289f6aSNate Lawson 
46353289f6aSNate Lawson 
46453289f6aSNate Lawson /*******************************************************************************
46553289f6aSNate Lawson  *
46653289f6aSNate Lawson  * FUNCTION:    LkObjectExists
46753289f6aSNate Lawson  *
46853289f6aSNate Lawson  * PARAMETERS:  Name            - 4 char ACPI name
46953289f6aSNate Lawson  *
47053289f6aSNate Lawson  * RETURN:      TRUE if name exists in namespace
47153289f6aSNate Lawson  *
47253289f6aSNate Lawson  * DESCRIPTION: Walk the namespace to find an object
47353289f6aSNate Lawson  *
47453289f6aSNate Lawson  ******************************************************************************/
47553289f6aSNate Lawson 
476fba7fc7eSJung-uk Kim static BOOLEAN
47753289f6aSNate Lawson LkObjectExists (
47853289f6aSNate Lawson     char                    *Name)
47953289f6aSNate Lawson {
48053289f6aSNate Lawson     ACPI_STATUS             Status;
48153289f6aSNate Lawson 
48253289f6aSNate Lawson 
48353289f6aSNate Lawson     /* Walk entire namespace from the supplied root */
48453289f6aSNate Lawson 
48553289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
48653289f6aSNate Lawson                 ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject,
48753289f6aSNate Lawson                 Name, NULL);
48853289f6aSNate Lawson     if (Status == AE_CTRL_TRUE)
48953289f6aSNate Lawson     {
49053289f6aSNate Lawson         /* At least one instance of the name was found */
49153289f6aSNate Lawson 
49253289f6aSNate Lawson         return (TRUE);
49353289f6aSNate Lawson     }
49453289f6aSNate Lawson 
49553289f6aSNate Lawson     return (FALSE);
49653289f6aSNate Lawson }
49753289f6aSNate Lawson 
49853289f6aSNate Lawson 
49953289f6aSNate Lawson /*******************************************************************************
50053289f6aSNate Lawson  *
50153289f6aSNate Lawson  * FUNCTION:    LkCrossReferenceNamespace
50253289f6aSNate Lawson  *
50353289f6aSNate Lawson  * PARAMETERS:  None
50453289f6aSNate Lawson  *
50553289f6aSNate Lawson  * RETURN:      Status
50653289f6aSNate Lawson  *
50753289f6aSNate Lawson  * DESCRIPTION: Perform a cross reference check of the parse tree against the
50853289f6aSNate Lawson  *              namespace.  Every named referenced within the parse tree
50953289f6aSNate Lawson  *              should be get resolved with a namespace lookup.  If not, the
51053289f6aSNate Lawson  *              original reference in the ASL code is invalid -- i.e., refers
51153289f6aSNate Lawson  *              to a non-existent object.
51253289f6aSNate Lawson  *
51353289f6aSNate Lawson  * NOTE:  The ASL "External" operator causes the name to be inserted into the
51453289f6aSNate Lawson  *        namespace so that references to the external name will be resolved
51553289f6aSNate Lawson  *        correctly here.
51653289f6aSNate Lawson  *
51753289f6aSNate Lawson  ******************************************************************************/
51853289f6aSNate Lawson 
51953289f6aSNate Lawson ACPI_STATUS
52053289f6aSNate Lawson LkCrossReferenceNamespace (
52153289f6aSNate Lawson     void)
52253289f6aSNate Lawson {
52353289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState;
52453289f6aSNate Lawson 
52553289f6aSNate Lawson 
52653289f6aSNate Lawson     DbgPrint (ASL_DEBUG_OUTPUT, "\nCross referencing namespace\n\n");
52753289f6aSNate Lawson 
52853289f6aSNate Lawson     /*
52953289f6aSNate Lawson      * Create a new walk state for use when looking up names
53053289f6aSNate Lawson      * within the namespace (Passed as context to the callbacks)
53153289f6aSNate Lawson      */
53253289f6aSNate Lawson     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
53353289f6aSNate Lawson     if (!WalkState)
53453289f6aSNate Lawson     {
53553289f6aSNate Lawson         return AE_NO_MEMORY;
53653289f6aSNate Lawson     }
53753289f6aSNate Lawson 
53853289f6aSNate Lawson     /* Walk the entire parse tree */
53953289f6aSNate Lawson 
54053289f6aSNate Lawson     TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE, LkNamespaceLocateBegin,
54153289f6aSNate Lawson                         LkNamespaceLocateEnd, WalkState);
54253289f6aSNate Lawson     return AE_OK;
54353289f6aSNate Lawson }
54453289f6aSNate Lawson 
54553289f6aSNate Lawson 
54653289f6aSNate Lawson /*******************************************************************************
54753289f6aSNate Lawson  *
54853289f6aSNate Lawson  * FUNCTION:    LkCheckFieldRange
54953289f6aSNate Lawson  *
55053289f6aSNate Lawson  * PARAMETERS:  RegionBitLength     - Length of entire parent region
55153289f6aSNate Lawson  *              FieldBitOffset      - Start of the field unit (within region)
55253289f6aSNate Lawson  *              FieldBitLength      - Entire length of field unit
55353289f6aSNate Lawson  *              AccessBitWidth      - Access width of the field unit
55453289f6aSNate Lawson  *
55553289f6aSNate Lawson  * RETURN:      None
55653289f6aSNate Lawson  *
55753289f6aSNate Lawson  * DESCRIPTION: Check one field unit to make sure it fits in the parent
55853289f6aSNate Lawson  *              op region.
55953289f6aSNate Lawson  *
56053289f6aSNate Lawson  * Note: AccessBitWidth must be either 8,16,32, or 64
56153289f6aSNate Lawson  *
56253289f6aSNate Lawson  ******************************************************************************/
56353289f6aSNate Lawson 
564fba7fc7eSJung-uk Kim static void
56553289f6aSNate Lawson LkCheckFieldRange (
56653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
56753289f6aSNate Lawson     UINT32                  RegionBitLength,
56853289f6aSNate Lawson     UINT32                  FieldBitOffset,
56953289f6aSNate Lawson     UINT32                  FieldBitLength,
57053289f6aSNate Lawson     UINT32                  AccessBitWidth)
57153289f6aSNate Lawson {
57253289f6aSNate Lawson     UINT32                  FieldEndBitOffset;
57353289f6aSNate Lawson 
574fba7fc7eSJung-uk Kim 
57553289f6aSNate Lawson     /*
57653289f6aSNate Lawson      * Check each field unit against the region size.  The entire
57753289f6aSNate Lawson      * field unit (start offset plus length) must fit within the
57853289f6aSNate Lawson      * region.
57953289f6aSNate Lawson      */
58053289f6aSNate Lawson     FieldEndBitOffset = FieldBitOffset + FieldBitLength;
58153289f6aSNate Lawson 
58253289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
58353289f6aSNate Lawson     {
58453289f6aSNate Lawson         /* Field definition itself is beyond the end-of-region */
58553289f6aSNate Lawson 
58653289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_OFFSET, Op, NULL);
58753289f6aSNate Lawson         return;
58853289f6aSNate Lawson     }
58953289f6aSNate Lawson 
59053289f6aSNate Lawson     /*
59153289f6aSNate Lawson      * Now check that the field plus AccessWidth doesn't go beyond
59253289f6aSNate Lawson      * the end-of-region.  Assumes AccessBitWidth is a power of 2
59353289f6aSNate Lawson      */
59453289f6aSNate Lawson     FieldEndBitOffset = ACPI_ROUND_UP (FieldEndBitOffset, AccessBitWidth);
59553289f6aSNate Lawson 
59653289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
59753289f6aSNate Lawson     {
59853289f6aSNate Lawson         /* Field definition combined with the access is beyond EOR */
59953289f6aSNate Lawson 
60053289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_ACCESS_WIDTH, Op, NULL);
60153289f6aSNate Lawson     }
60253289f6aSNate Lawson }
60353289f6aSNate Lawson 
60453289f6aSNate Lawson /*******************************************************************************
60553289f6aSNate Lawson  *
60653289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateBegin
60753289f6aSNate Lawson  *
60853289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
60953289f6aSNate Lawson  *
61053289f6aSNate Lawson  * RETURN:      Status
61153289f6aSNate Lawson  *
61253289f6aSNate Lawson  * DESCRIPTION: Descending callback used during cross-reference.  For named
61353289f6aSNate Lawson  *              object references, attempt to locate the name in the
61453289f6aSNate Lawson  *              namespace.
61553289f6aSNate Lawson  *
61653289f6aSNate Lawson  * NOTE: ASL references to named fields within resource descriptors are
61753289f6aSNate Lawson  *       resolved to integer values here.  Therefore, this step is an
61853289f6aSNate Lawson  *       important part of the code generation.  We don't know that the
61953289f6aSNate Lawson  *       name refers to a resource descriptor until now.
62053289f6aSNate Lawson  *
62153289f6aSNate Lawson  ******************************************************************************/
62253289f6aSNate Lawson 
623fba7fc7eSJung-uk Kim static ACPI_STATUS
62453289f6aSNate Lawson LkNamespaceLocateBegin (
62553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
62653289f6aSNate Lawson     UINT32                  Level,
62753289f6aSNate Lawson     void                    *Context)
62853289f6aSNate Lawson {
62953289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
63053289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
63153289f6aSNate Lawson     ACPI_STATUS             Status;
63253289f6aSNate Lawson     ACPI_OBJECT_TYPE        ObjectType;
63353289f6aSNate Lawson     char                    *Path;
63453289f6aSNate Lawson     UINT8                   PassedArgs;
63553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NextOp;
63653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *OwningOp;
63753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *SpaceIdOp;
63853289f6aSNate Lawson     UINT32                  MinimumLength;
63953289f6aSNate Lawson     UINT32                  Temp;
64053289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
64153289f6aSNate Lawson     UINT32                  Flags;
64253289f6aSNate Lawson 
64353289f6aSNate Lawson 
64453289f6aSNate Lawson     ACPI_FUNCTION_TRACE_PTR ("LkNamespaceLocateBegin", Op);
64553289f6aSNate Lawson 
64653289f6aSNate Lawson     /*
64753289f6aSNate Lawson      * If this node is the actual declaration of a name
64853289f6aSNate Lawson      * [such as the XXXX name in "Method (XXXX)"],
64953289f6aSNate Lawson      * we are not interested in it here.  We only care about names that are
65053289f6aSNate Lawson      * references to other objects within the namespace and the parent objects
65153289f6aSNate Lawson      * of name declarations
65253289f6aSNate Lawson      */
65353289f6aSNate Lawson     if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)
65453289f6aSNate Lawson     {
65553289f6aSNate Lawson         return (AE_OK);
65653289f6aSNate Lawson     }
65753289f6aSNate Lawson 
65853289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
65953289f6aSNate Lawson 
66053289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
66153289f6aSNate Lawson 
66253289f6aSNate Lawson     if ((!(OpInfo->Flags & AML_NAMED)) &&
66353289f6aSNate Lawson         (!(OpInfo->Flags & AML_CREATE)) &&
66453289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
66553289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESEG)    &&
66653289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
66753289f6aSNate Lawson     {
66853289f6aSNate Lawson         return (AE_OK);
66953289f6aSNate Lawson     }
67053289f6aSNate Lawson 
67153289f6aSNate Lawson     /*
67253289f6aSNate Lawson      * We must enable the "search-to-root" for single NameSegs, but
67353289f6aSNate Lawson      * we have to be very careful about opening up scopes
67453289f6aSNate Lawson      */
67553289f6aSNate Lawson     Flags = ACPI_NS_SEARCH_PARENT;
67653289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
67753289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
67853289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
67953289f6aSNate Lawson     {
68053289f6aSNate Lawson         /*
68153289f6aSNate Lawson          * These are name references, do not push the scope stack
68253289f6aSNate Lawson          * for them.
68353289f6aSNate Lawson          */
68453289f6aSNate Lawson         Flags |= ACPI_NS_DONT_OPEN_SCOPE;
68553289f6aSNate Lawson     }
68653289f6aSNate Lawson 
68753289f6aSNate Lawson     /* Get the NamePath from the appropriate place */
68853289f6aSNate Lawson 
68953289f6aSNate Lawson     if (OpInfo->Flags & AML_NAMED)
69053289f6aSNate Lawson     {
69153289f6aSNate Lawson         /* For all NAMED operators, the name reference is the first child */
69253289f6aSNate Lawson 
69353289f6aSNate Lawson         Path = Op->Asl.Child->Asl.Value.String;
69453289f6aSNate Lawson         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
69553289f6aSNate Lawson         {
69653289f6aSNate Lawson             /*
69753289f6aSNate Lawson              * ALIAS is the only oddball opcode, the name declaration
69853289f6aSNate Lawson              * (alias name) is the second operand
69953289f6aSNate Lawson              */
70053289f6aSNate Lawson             Path = Op->Asl.Child->Asl.Next->Asl.Value.String;
70153289f6aSNate Lawson         }
70253289f6aSNate Lawson     }
70353289f6aSNate Lawson     else if (OpInfo->Flags & AML_CREATE)
70453289f6aSNate Lawson     {
70553289f6aSNate Lawson         /* Name must appear as the last parameter */
70653289f6aSNate Lawson 
70753289f6aSNate Lawson         NextOp = Op->Asl.Child;
70853289f6aSNate Lawson         while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
70953289f6aSNate Lawson         {
71053289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
71153289f6aSNate Lawson         }
71253289f6aSNate Lawson         Path = NextOp->Asl.Value.String;
71353289f6aSNate Lawson     }
71453289f6aSNate Lawson     else
71553289f6aSNate Lawson     {
71653289f6aSNate Lawson         Path = Op->Asl.Value.String;
71753289f6aSNate Lawson     }
71853289f6aSNate Lawson 
71953289f6aSNate Lawson     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
720fba7fc7eSJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
721fba7fc7eSJung-uk Kim         "Type=%s\n", AcpiUtGetTypeName (ObjectType)));
72253289f6aSNate Lawson 
72353289f6aSNate Lawson     /*
72453289f6aSNate Lawson      * Lookup the name in the namespace.  Name must exist at this point, or it
72553289f6aSNate Lawson      * is an invalid reference.
72653289f6aSNate Lawson      *
72753289f6aSNate Lawson      * The namespace is also used as a lookup table for references to resource
72853289f6aSNate Lawson      * descriptors and the fields within them.
72953289f6aSNate Lawson      */
73053289f6aSNate Lawson     Gbl_NsLookupCount++;
73153289f6aSNate Lawson 
73253289f6aSNate Lawson     Status = AcpiNsLookup (WalkState->ScopeInfo,  Path, ObjectType,
73353289f6aSNate Lawson                 ACPI_IMODE_EXECUTE, Flags, WalkState, &(Node));
73453289f6aSNate Lawson     if (ACPI_FAILURE (Status))
73553289f6aSNate Lawson     {
73653289f6aSNate Lawson         if (Status == AE_NOT_FOUND)
73753289f6aSNate Lawson         {
73853289f6aSNate Lawson             /*
73953289f6aSNate Lawson              * We didn't find the name reference by path -- we can qualify this
74053289f6aSNate Lawson              * a little better before we print an error message
74153289f6aSNate Lawson              */
74253289f6aSNate Lawson             if (strlen (Path) == ACPI_NAME_SIZE)
74353289f6aSNate Lawson             {
74453289f6aSNate Lawson                 /* A simple, one-segment ACPI name */
74553289f6aSNate Lawson 
74653289f6aSNate Lawson                 if (LkObjectExists (Path))
74753289f6aSNate Lawson                 {
748fba7fc7eSJung-uk Kim                     /*
749fba7fc7eSJung-uk Kim                      * There exists such a name, but we couldn't get to it
750fba7fc7eSJung-uk Kim                      * from this scope
751fba7fc7eSJung-uk Kim                      */
752fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_REACHABLE, Op,
753fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
75453289f6aSNate Lawson                 }
75553289f6aSNate Lawson                 else
75653289f6aSNate Lawson                 {
75753289f6aSNate Lawson                     /* The name doesn't exist, period */
75853289f6aSNate Lawson 
759fba7fc7eSJung-uk Kim                     if ((Op->Asl.Parent) &&
760fba7fc7eSJung-uk Kim                         (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
761fba7fc7eSJung-uk Kim                     {
762fba7fc7eSJung-uk Kim                         /* Ignore not found if parent is CondRefOf */
763fba7fc7eSJung-uk Kim 
764fba7fc7eSJung-uk Kim                         return (AE_OK);
765fba7fc7eSJung-uk Kim                     }
766fba7fc7eSJung-uk Kim 
767fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST,
768fba7fc7eSJung-uk Kim                         Op, Op->Asl.ExternalName);
76953289f6aSNate Lawson                 }
77053289f6aSNate Lawson             }
77153289f6aSNate Lawson             else
77253289f6aSNate Lawson             {
77353289f6aSNate Lawson                 /* Check for a fully qualified path */
77453289f6aSNate Lawson 
77553289f6aSNate Lawson                 if (Path[0] == AML_ROOT_PREFIX)
77653289f6aSNate Lawson                 {
77753289f6aSNate Lawson                     /* Gave full path, the object does not exist */
77853289f6aSNate Lawson 
779fba7fc7eSJung-uk Kim                     if ((Op->Asl.Parent) &&
780fba7fc7eSJung-uk Kim                         (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
781fba7fc7eSJung-uk Kim                     {
782fba7fc7eSJung-uk Kim                         /* Ignore not found if parent is CondRefOf */
783fba7fc7eSJung-uk Kim 
784fba7fc7eSJung-uk Kim                         return (AE_OK);
785fba7fc7eSJung-uk Kim                     }
786fba7fc7eSJung-uk Kim 
787fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op,
788fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
78953289f6aSNate Lawson                 }
79053289f6aSNate Lawson                 else
79153289f6aSNate Lawson                 {
792fba7fc7eSJung-uk Kim                     /*
793fba7fc7eSJung-uk Kim                      * We can't tell whether it doesn't exist or just
794fba7fc7eSJung-uk Kim                      * can't be reached.
795fba7fc7eSJung-uk Kim                      */
796fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
797fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
79853289f6aSNate Lawson                 }
79953289f6aSNate Lawson             }
80053289f6aSNate Lawson 
80153289f6aSNate Lawson             Status = AE_OK;
80253289f6aSNate Lawson         }
80353289f6aSNate Lawson         return (Status);
80453289f6aSNate Lawson     }
80553289f6aSNate Lawson 
80653289f6aSNate Lawson     /* Attempt to optimize the NamePath */
80753289f6aSNate Lawson 
80853289f6aSNate Lawson     OptOptimizeNamePath (Op, OpInfo->Flags, WalkState, Path, Node);
80953289f6aSNate Lawson 
81053289f6aSNate Lawson     /*
81153289f6aSNate Lawson      * Dereference an alias. (A name reference that is an alias.)
81253289f6aSNate Lawson      * Aliases are not nested;  The alias always points to the final object
81353289f6aSNate Lawson      */
814fba7fc7eSJung-uk Kim     if ((Op->Asl.ParseOpcode != PARSEOP_ALIAS) &&
815fba7fc7eSJung-uk Kim         (Node->Type == ACPI_TYPE_LOCAL_ALIAS))
81653289f6aSNate Lawson     {
81753289f6aSNate Lawson         /* This node points back to the original PARSEOP_ALIAS */
81853289f6aSNate Lawson 
819fba7fc7eSJung-uk Kim         NextOp = Node->Op;
82053289f6aSNate Lawson 
82153289f6aSNate Lawson         /* The first child is the alias target op */
82253289f6aSNate Lawson 
82353289f6aSNate Lawson         NextOp = NextOp->Asl.Child;
82453289f6aSNate Lawson 
82553289f6aSNate Lawson         /* Who in turn points back to original target alias node */
82653289f6aSNate Lawson 
82753289f6aSNate Lawson         if (NextOp->Asl.Node)
82853289f6aSNate Lawson         {
82953289f6aSNate Lawson             Node = NextOp->Asl.Node;
83053289f6aSNate Lawson         }
83153289f6aSNate Lawson         else
83253289f6aSNate Lawson         {
833fba7fc7eSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
834fba7fc7eSJung-uk Kim                 "Missing alias link");
83553289f6aSNate Lawson         }
83653289f6aSNate Lawson     }
83753289f6aSNate Lawson 
83853289f6aSNate Lawson     /* 1) Check for a reference to a resource descriptor */
83953289f6aSNate Lawson 
84053289f6aSNate Lawson     else if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
84153289f6aSNate Lawson              (Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
84253289f6aSNate Lawson     {
84353289f6aSNate Lawson         /*
84453289f6aSNate Lawson          * This was a reference to a field within a resource descriptor.  Extract
84553289f6aSNate Lawson          * the associated field offset (either a bit or byte offset depending on
84653289f6aSNate Lawson          * the field type) and change the named reference into an integer for
84753289f6aSNate Lawson          * AML code generation
84853289f6aSNate Lawson          */
849fba7fc7eSJung-uk Kim         Temp = Node->Value;
85053289f6aSNate Lawson         if (Node->Flags & ANOBJ_IS_BIT_OFFSET)
85153289f6aSNate Lawson         {
85253289f6aSNate Lawson             Op->Asl.CompileFlags |= NODE_IS_BIT_OFFSET;
85353289f6aSNate Lawson         }
85453289f6aSNate Lawson 
85553289f6aSNate Lawson         /* Perform BitOffset <--> ByteOffset conversion if necessary */
85653289f6aSNate Lawson 
85753289f6aSNate Lawson         switch (Op->Asl.Parent->Asl.AmlOpcode)
85853289f6aSNate Lawson         {
85953289f6aSNate Lawson         case AML_CREATE_FIELD_OP:
86053289f6aSNate Lawson 
86153289f6aSNate Lawson             /* We allow a Byte offset to Bit Offset conversion for this op */
86253289f6aSNate Lawson 
86353289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
86453289f6aSNate Lawson             {
86553289f6aSNate Lawson                 /* Simply multiply byte offset times 8 to get bit offset */
86653289f6aSNate Lawson 
86753289f6aSNate Lawson                 Temp = ACPI_MUL_8 (Temp);
86853289f6aSNate Lawson             }
86953289f6aSNate Lawson             break;
87053289f6aSNate Lawson 
87153289f6aSNate Lawson 
87253289f6aSNate Lawson         case AML_CREATE_BIT_FIELD_OP:
87353289f6aSNate Lawson 
87453289f6aSNate Lawson             /* This op requires a Bit Offset */
87553289f6aSNate Lawson 
87653289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
87753289f6aSNate Lawson             {
87853289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BYTES_TO_BITS, Op, NULL);
87953289f6aSNate Lawson             }
88053289f6aSNate Lawson             break;
88153289f6aSNate Lawson 
88253289f6aSNate Lawson 
88353289f6aSNate Lawson         case AML_CREATE_BYTE_FIELD_OP:
88453289f6aSNate Lawson         case AML_CREATE_WORD_FIELD_OP:
88553289f6aSNate Lawson         case AML_CREATE_DWORD_FIELD_OP:
88653289f6aSNate Lawson         case AML_CREATE_QWORD_FIELD_OP:
88753289f6aSNate Lawson         case AML_INDEX_OP:
88853289f6aSNate Lawson 
88953289f6aSNate Lawson             /* These Ops require Byte offsets */
89053289f6aSNate Lawson 
89153289f6aSNate Lawson             if (Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)
89253289f6aSNate Lawson             {
89353289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BITS_TO_BYTES, Op, NULL);
89453289f6aSNate Lawson             }
89553289f6aSNate Lawson             break;
89653289f6aSNate Lawson 
89753289f6aSNate Lawson 
89853289f6aSNate Lawson         default:
89953289f6aSNate Lawson             /* Nothing to do for other opcodes */
90053289f6aSNate Lawson             break;
90153289f6aSNate Lawson         }
90253289f6aSNate Lawson 
90353289f6aSNate Lawson         /* Now convert this node to an integer whose value is the field offset */
90453289f6aSNate Lawson 
905fba7fc7eSJung-uk Kim         Op->Asl.AmlLength       = 0;
90653289f6aSNate Lawson         Op->Asl.ParseOpcode     = PARSEOP_INTEGER;
90753289f6aSNate Lawson         Op->Asl.Value.Integer   = (UINT64) Temp;
90853289f6aSNate Lawson         Op->Asl.CompileFlags   |= NODE_IS_RESOURCE_FIELD;
90953289f6aSNate Lawson 
91053289f6aSNate Lawson         OpcGenerateAmlOpcode (Op);
91153289f6aSNate Lawson     }
91253289f6aSNate Lawson 
91353289f6aSNate Lawson     /* 2) Check for a method invocation */
91453289f6aSNate Lawson 
91553289f6aSNate Lawson     else if ((((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)) &&
91653289f6aSNate Lawson                 (Node->Type == ACPI_TYPE_METHOD) &&
91753289f6aSNate Lawson                 (Op->Asl.Parent) &&
91853289f6aSNate Lawson                 (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_METHOD))   ||
91953289f6aSNate Lawson 
92053289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
92153289f6aSNate Lawson     {
92253289f6aSNate Lawson 
92353289f6aSNate Lawson         /*
924fba7fc7eSJung-uk Kim          * A reference to a method within one of these opcodes is not an
925fba7fc7eSJung-uk Kim          * invocation of the method, it is simply a reference to the method.
926fba7fc7eSJung-uk Kim          */
927fba7fc7eSJung-uk Kim         if ((Op->Asl.Parent) &&
928fba7fc7eSJung-uk Kim            ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF)      ||
929fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF)    ||
930fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE)))
931fba7fc7eSJung-uk Kim         {
932fba7fc7eSJung-uk Kim             return (AE_OK);
933fba7fc7eSJung-uk Kim         }
934fba7fc7eSJung-uk Kim         /*
93553289f6aSNate Lawson          * There are two types of method invocation:
936fba7fc7eSJung-uk Kim          * 1) Invocation with arguments -- the parser recognizes this
937fba7fc7eSJung-uk Kim          *    as a METHODCALL.
938fba7fc7eSJung-uk Kim          * 2) Invocation with no arguments --the parser cannot determine that
939fba7fc7eSJung-uk Kim          *    this is a method invocation, therefore we have to figure it out
940fba7fc7eSJung-uk Kim          *    here.
94153289f6aSNate Lawson          */
94253289f6aSNate Lawson         if (Node->Type != ACPI_TYPE_METHOD)
94353289f6aSNate Lawson         {
944fba7fc7eSJung-uk Kim             sprintf (MsgBuffer, "%s is a %s",
945fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
94653289f6aSNate Lawson 
94753289f6aSNate Lawson             AslError (ASL_ERROR, ASL_MSG_NOT_METHOD, Op, MsgBuffer);
94853289f6aSNate Lawson             return (AE_OK);
94953289f6aSNate Lawson         }
95053289f6aSNate Lawson 
95153289f6aSNate Lawson         /* Save the method node in the caller's op */
95253289f6aSNate Lawson 
95353289f6aSNate Lawson         Op->Asl.Node = Node;
95453289f6aSNate Lawson         if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF)
95553289f6aSNate Lawson         {
95653289f6aSNate Lawson             return (AE_OK);
95753289f6aSNate Lawson         }
95853289f6aSNate Lawson 
95953289f6aSNate Lawson         /*
96053289f6aSNate Lawson          * This is a method invocation, with or without arguments.
96153289f6aSNate Lawson          * Count the number of arguments, each appears as a child
96253289f6aSNate Lawson          * under the parent node
96353289f6aSNate Lawson          */
96453289f6aSNate Lawson         Op->Asl.ParseOpcode = PARSEOP_METHODCALL;
96553289f6aSNate Lawson         UtSetParseOpName (Op);
96653289f6aSNate Lawson 
96753289f6aSNate Lawson         PassedArgs = 0;
96853289f6aSNate Lawson         NextOp     = Op->Asl.Child;
96953289f6aSNate Lawson 
97053289f6aSNate Lawson         while (NextOp)
97153289f6aSNate Lawson         {
97253289f6aSNate Lawson             PassedArgs++;
97353289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
97453289f6aSNate Lawson         }
97553289f6aSNate Lawson 
976fba7fc7eSJung-uk Kim         if (Node->Value != ASL_EXTERNAL_METHOD)
97753289f6aSNate Lawson         {
97853289f6aSNate Lawson             /*
97953289f6aSNate Lawson              * Check the parsed arguments with the number expected by the
98053289f6aSNate Lawson              * method declaration itself
98153289f6aSNate Lawson              */
982fba7fc7eSJung-uk Kim             if (PassedArgs != Node->Value)
98353289f6aSNate Lawson             {
98453289f6aSNate Lawson                 sprintf (MsgBuffer, "%s requires %d", Op->Asl.ExternalName,
985fba7fc7eSJung-uk Kim                             Node->Value);
98653289f6aSNate Lawson 
987fba7fc7eSJung-uk Kim                 if (PassedArgs < Node->Value)
98853289f6aSNate Lawson                 {
98953289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_LO, Op, MsgBuffer);
99053289f6aSNate Lawson                 }
99153289f6aSNate Lawson                 else
99253289f6aSNate Lawson                 {
99353289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_HI, Op, MsgBuffer);
99453289f6aSNate Lawson                 }
99553289f6aSNate Lawson             }
99653289f6aSNate Lawson         }
99753289f6aSNate Lawson     }
99853289f6aSNate Lawson 
999fba7fc7eSJung-uk Kim     /* 3) Check for an ASL Field definition */
1000fba7fc7eSJung-uk Kim 
100153289f6aSNate Lawson     else if ((Op->Asl.Parent) &&
100253289f6aSNate Lawson             ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_FIELD)     ||
100353289f6aSNate Lawson              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_BANKFIELD)))
100453289f6aSNate Lawson     {
100553289f6aSNate Lawson         /*
100653289f6aSNate Lawson          * Offset checking for fields.  If the parent operation region has a
100753289f6aSNate Lawson          * constant length (known at compile time), we can check fields
100853289f6aSNate Lawson          * defined in that region against the region length.  This will catch
100953289f6aSNate Lawson          * fields and field units that cannot possibly fit within the region.
101053289f6aSNate Lawson          *
101153289f6aSNate Lawson          * Note: Index fields do not directly reference an operation region,
101253289f6aSNate Lawson          * thus they are not included in this check.
101353289f6aSNate Lawson          */
101453289f6aSNate Lawson         if (Op == Op->Asl.Parent->Asl.Child)
101553289f6aSNate Lawson         {
101653289f6aSNate Lawson             /*
101753289f6aSNate Lawson              * This is the first child of the field node, which is
101853289f6aSNate Lawson              * the name of the region.  Get the parse node for the
101953289f6aSNate Lawson              * region -- which contains the length of the region.
102053289f6aSNate Lawson              */
1021fba7fc7eSJung-uk Kim             OwningOp = Node->Op;
1022fba7fc7eSJung-uk Kim             Op->Asl.Parent->Asl.ExtraValue =
1023fba7fc7eSJung-uk Kim                 ACPI_MUL_8 ((UINT32) OwningOp->Asl.Value.Integer);
102453289f6aSNate Lawson 
102553289f6aSNate Lawson             /* Examine the field access width */
102653289f6aSNate Lawson 
102753289f6aSNate Lawson             switch ((UINT8) Op->Asl.Parent->Asl.Value.Integer)
102853289f6aSNate Lawson             {
102953289f6aSNate Lawson             case AML_FIELD_ACCESS_ANY:
103053289f6aSNate Lawson             case AML_FIELD_ACCESS_BYTE:
103153289f6aSNate Lawson             case AML_FIELD_ACCESS_BUFFER:
103253289f6aSNate Lawson             default:
103353289f6aSNate Lawson                 MinimumLength = 1;
103453289f6aSNate Lawson                 break;
103553289f6aSNate Lawson 
103653289f6aSNate Lawson             case AML_FIELD_ACCESS_WORD:
103753289f6aSNate Lawson                 MinimumLength = 2;
103853289f6aSNate Lawson                 break;
103953289f6aSNate Lawson 
104053289f6aSNate Lawson             case AML_FIELD_ACCESS_DWORD:
104153289f6aSNate Lawson                 MinimumLength = 4;
104253289f6aSNate Lawson                 break;
104353289f6aSNate Lawson 
104453289f6aSNate Lawson             case AML_FIELD_ACCESS_QWORD:
104553289f6aSNate Lawson                 MinimumLength = 8;
104653289f6aSNate Lawson                 break;
104753289f6aSNate Lawson             }
104853289f6aSNate Lawson 
104953289f6aSNate Lawson             /*
105053289f6aSNate Lawson              * Is the region at least as big as the access width?
105153289f6aSNate Lawson              * Note: DataTableRegions have 0 length
105253289f6aSNate Lawson              */
105353289f6aSNate Lawson             if (((UINT32) OwningOp->Asl.Value.Integer) &&
105453289f6aSNate Lawson                 ((UINT32) OwningOp->Asl.Value.Integer < MinimumLength))
105553289f6aSNate Lawson             {
105653289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_FIELD_ACCESS_WIDTH, Op, NULL);
105753289f6aSNate Lawson             }
105853289f6aSNate Lawson 
105953289f6aSNate Lawson             /*
106053289f6aSNate Lawson              * Check EC/CMOS/SMBUS fields to make sure that the correct
106153289f6aSNate Lawson              * access type is used (BYTE for EC/CMOS, BUFFER for SMBUS)
106253289f6aSNate Lawson              */
106353289f6aSNate Lawson             SpaceIdOp = OwningOp->Asl.Child->Asl.Next;
106453289f6aSNate Lawson             switch ((UINT32) SpaceIdOp->Asl.Value.Integer)
106553289f6aSNate Lawson             {
106653289f6aSNate Lawson             case REGION_EC:
106753289f6aSNate Lawson             case REGION_CMOS:
106853289f6aSNate Lawson 
106953289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BYTE)
107053289f6aSNate Lawson                 {
107153289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BYTE_ACCESS, Op, NULL);
107253289f6aSNate Lawson                 }
107353289f6aSNate Lawson                 break;
107453289f6aSNate Lawson 
107553289f6aSNate Lawson             case REGION_SMBUS:
107653289f6aSNate Lawson 
107753289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BUFFER)
107853289f6aSNate Lawson                 {
107953289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BUFFER_ACCESS, Op, NULL);
108053289f6aSNate Lawson                 }
108153289f6aSNate Lawson                 break;
108253289f6aSNate Lawson 
108353289f6aSNate Lawson             default:
108453289f6aSNate Lawson 
108553289f6aSNate Lawson                 /* Nothing to do for other address spaces */
108653289f6aSNate Lawson                 break;
108753289f6aSNate Lawson             }
108853289f6aSNate Lawson         }
108953289f6aSNate Lawson         else
109053289f6aSNate Lawson         {
109153289f6aSNate Lawson             /*
109253289f6aSNate Lawson              * This is one element of the field list.  Check to make sure
109353289f6aSNate Lawson              * that it does not go beyond the end of the parent operation region.
109453289f6aSNate Lawson              *
109553289f6aSNate Lawson              * In the code below:
109653289f6aSNate Lawson              *    Op->Asl.Parent->Asl.ExtraValue      - Region Length (bits)
109753289f6aSNate Lawson              *    Op->Asl.ExtraValue                  - Field start offset (bits)
109853289f6aSNate Lawson              *    Op->Asl.Child->Asl.Value.Integer32  - Field length (bits)
109953289f6aSNate Lawson              *    Op->Asl.Child->Asl.ExtraValue       - Field access width (bits)
110053289f6aSNate Lawson              */
110153289f6aSNate Lawson             if (Op->Asl.Parent->Asl.ExtraValue && Op->Asl.Child)
110253289f6aSNate Lawson             {
110353289f6aSNate Lawson                 LkCheckFieldRange (Op,
110453289f6aSNate Lawson                             Op->Asl.Parent->Asl.ExtraValue,
110553289f6aSNate Lawson                             Op->Asl.ExtraValue,
110653289f6aSNate Lawson                             (UINT32) Op->Asl.Child->Asl.Value.Integer,
110753289f6aSNate Lawson                             Op->Asl.Child->Asl.ExtraValue);
110853289f6aSNate Lawson             }
110953289f6aSNate Lawson         }
111053289f6aSNate Lawson     }
111153289f6aSNate Lawson 
111253289f6aSNate Lawson     Op->Asl.Node = Node;
111353289f6aSNate Lawson     return (Status);
111453289f6aSNate Lawson }
111553289f6aSNate Lawson 
111653289f6aSNate Lawson 
111753289f6aSNate Lawson /*******************************************************************************
111853289f6aSNate Lawson  *
111953289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateEnd
112053289f6aSNate Lawson  *
112153289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
112253289f6aSNate Lawson  *
112353289f6aSNate Lawson  * RETURN:      Status
112453289f6aSNate Lawson  *
112553289f6aSNate Lawson  * DESCRIPTION: Ascending callback used during cross reference.  We only
112653289f6aSNate Lawson  *              need to worry about scope management here.
112753289f6aSNate Lawson  *
112853289f6aSNate Lawson  ******************************************************************************/
112953289f6aSNate Lawson 
1130fba7fc7eSJung-uk Kim static ACPI_STATUS
113153289f6aSNate Lawson LkNamespaceLocateEnd (
113253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
113353289f6aSNate Lawson     UINT32                  Level,
113453289f6aSNate Lawson     void                    *Context)
113553289f6aSNate Lawson {
113653289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
113753289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
113853289f6aSNate Lawson 
113953289f6aSNate Lawson 
114053289f6aSNate Lawson     ACPI_FUNCTION_TRACE ("LkNamespaceLocateEnd");
114153289f6aSNate Lawson 
114253289f6aSNate Lawson 
114353289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
114453289f6aSNate Lawson 
114553289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
114653289f6aSNate Lawson     if (!(OpInfo->Flags & AML_NAMED))
114753289f6aSNate Lawson     {
114853289f6aSNate Lawson         return (AE_OK);
114953289f6aSNate Lawson     }
115053289f6aSNate Lawson 
115153289f6aSNate Lawson     /* Not interested in name references, we did not open a scope for them */
115253289f6aSNate Lawson 
115353289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
115453289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
115553289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
115653289f6aSNate Lawson     {
115753289f6aSNate Lawson         return (AE_OK);
115853289f6aSNate Lawson     }
115953289f6aSNate Lawson 
116053289f6aSNate Lawson     /* Pop the scope stack if necessary */
116153289f6aSNate Lawson 
116253289f6aSNate Lawson     if (AcpiNsOpensScope (AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode)))
116353289f6aSNate Lawson     {
116453289f6aSNate Lawson 
116553289f6aSNate Lawson         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
116653289f6aSNate Lawson             "%s: Popping scope for Op %p\n",
116753289f6aSNate Lawson             AcpiUtGetTypeName (OpInfo->ObjectType), Op));
116853289f6aSNate Lawson 
1169fba7fc7eSJung-uk Kim         (void) AcpiDsScopeStackPop (WalkState);
117053289f6aSNate Lawson     }
117153289f6aSNate Lawson 
117253289f6aSNate Lawson     return (AE_OK);
117353289f6aSNate Lawson }
117453289f6aSNate Lawson 
117553289f6aSNate Lawson 
1176