xref: /freebsd/sys/contrib/dev/acpica/compiler/asllookup.c (revision ab6f3bf9cb8ad195aecd9165d8d4b1a93aed3c8d)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: asllookup- Namespace lookup
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
753289f6aSNate Lawson /******************************************************************************
853289f6aSNate Lawson  *
953289f6aSNate Lawson  * 1. Copyright Notice
1053289f6aSNate Lawson  *
11a9f12690SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
1253289f6aSNate Lawson  * All rights reserved.
1353289f6aSNate Lawson  *
1453289f6aSNate Lawson  * 2. License
1553289f6aSNate Lawson  *
1653289f6aSNate Lawson  * 2.1. This is your license from Intel Corp. under its intellectual property
1753289f6aSNate Lawson  * rights.  You may have additional license terms from the party that provided
1853289f6aSNate Lawson  * you this software, covering your right to use that party's intellectual
1953289f6aSNate Lawson  * property rights.
2053289f6aSNate Lawson  *
2153289f6aSNate Lawson  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2253289f6aSNate Lawson  * copy of the source code appearing in this file ("Covered Code") an
2353289f6aSNate Lawson  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2453289f6aSNate Lawson  * base code distributed originally by Intel ("Original Intel Code") to copy,
2553289f6aSNate Lawson  * make derivatives, distribute, use and display any portion of the Covered
2653289f6aSNate Lawson  * Code in any form, with the right to sublicense such rights; and
2753289f6aSNate Lawson  *
2853289f6aSNate Lawson  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
2953289f6aSNate Lawson  * license (with the right to sublicense), under only those claims of Intel
3053289f6aSNate Lawson  * patents that are infringed by the Original Intel Code, to make, use, sell,
3153289f6aSNate Lawson  * offer to sell, and import the Covered Code and derivative works thereof
3253289f6aSNate Lawson  * solely to the minimum extent necessary to exercise the above copyright
3353289f6aSNate Lawson  * license, and in no event shall the patent license extend to any additions
3453289f6aSNate Lawson  * to or modifications of the Original Intel Code.  No other license or right
3553289f6aSNate Lawson  * is granted directly or by implication, estoppel or otherwise;
3653289f6aSNate Lawson  *
3753289f6aSNate Lawson  * The above copyright and patent license is granted only if the following
3853289f6aSNate Lawson  * conditions are met:
3953289f6aSNate Lawson  *
4053289f6aSNate Lawson  * 3. Conditions
4153289f6aSNate Lawson  *
4253289f6aSNate Lawson  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4353289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
4453289f6aSNate Lawson  * Code or modification with rights to further distribute source must include
4553289f6aSNate Lawson  * the above Copyright Notice, the above License, this list of Conditions,
4653289f6aSNate Lawson  * and the following Disclaimer and Export Compliance provision.  In addition,
4753289f6aSNate Lawson  * Licensee must cause all Covered Code to which Licensee contributes to
4853289f6aSNate Lawson  * contain a file documenting the changes Licensee made to create that Covered
4953289f6aSNate Lawson  * Code and the date of any change.  Licensee must include in that file the
5053289f6aSNate Lawson  * documentation of any changes made by any predecessor Licensee.  Licensee
5153289f6aSNate Lawson  * must include a prominent statement that the modification is derived,
5253289f6aSNate Lawson  * directly or indirectly, from Original Intel Code.
5353289f6aSNate Lawson  *
5453289f6aSNate Lawson  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5553289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
5653289f6aSNate Lawson  * Code or modification without rights to further distribute source must
5753289f6aSNate Lawson  * include the following Disclaimer and Export Compliance provision in the
5853289f6aSNate Lawson  * documentation and/or other materials provided with distribution.  In
5953289f6aSNate Lawson  * addition, Licensee may not authorize further sublicense of source of any
6053289f6aSNate Lawson  * portion of the Covered Code, and must include terms to the effect that the
6153289f6aSNate Lawson  * license from Licensee to its licensee is limited to the intellectual
6253289f6aSNate Lawson  * property embodied in the software Licensee provides to its licensee, and
6353289f6aSNate Lawson  * not to intellectual property embodied in modifications its licensee may
6453289f6aSNate Lawson  * make.
6553289f6aSNate Lawson  *
6653289f6aSNate Lawson  * 3.3. Redistribution of Executable. Redistribution in executable form of any
6753289f6aSNate Lawson  * substantial portion of the Covered Code or modification must reproduce the
6853289f6aSNate Lawson  * above Copyright Notice, and the following Disclaimer and Export Compliance
6953289f6aSNate Lawson  * provision in the documentation and/or other materials provided with the
7053289f6aSNate Lawson  * distribution.
7153289f6aSNate Lawson  *
7253289f6aSNate Lawson  * 3.4. Intel retains all right, title, and interest in and to the Original
7353289f6aSNate Lawson  * Intel Code.
7453289f6aSNate Lawson  *
7553289f6aSNate Lawson  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7653289f6aSNate Lawson  * Intel shall be used in advertising or otherwise to promote the sale, use or
7753289f6aSNate Lawson  * other dealings in products derived from or relating to the Covered Code
7853289f6aSNate Lawson  * without prior written authorization from Intel.
7953289f6aSNate Lawson  *
8053289f6aSNate Lawson  * 4. Disclaimer and Export Compliance
8153289f6aSNate Lawson  *
8253289f6aSNate Lawson  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8353289f6aSNate Lawson  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8453289f6aSNate Lawson  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8553289f6aSNate Lawson  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8653289f6aSNate Lawson  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8753289f6aSNate Lawson  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8853289f6aSNate Lawson  * PARTICULAR PURPOSE.
8953289f6aSNate Lawson  *
9053289f6aSNate Lawson  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9153289f6aSNate Lawson  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9253289f6aSNate Lawson  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9353289f6aSNate Lawson  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9453289f6aSNate Lawson  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9553289f6aSNate Lawson  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9653289f6aSNate Lawson  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9753289f6aSNate Lawson  * LIMITED REMEDY.
9853289f6aSNate Lawson  *
9953289f6aSNate Lawson  * 4.3. Licensee shall not export, either directly or indirectly, any of this
10053289f6aSNate Lawson  * software or system incorporating such software without first obtaining any
10153289f6aSNate Lawson  * required license or other approval from the U. S. Department of Commerce or
10253289f6aSNate Lawson  * any other agency or department of the United States Government.  In the
10353289f6aSNate Lawson  * event Licensee exports any such software from the United States or
10453289f6aSNate Lawson  * re-exports any such software from a foreign destination, Licensee shall
10553289f6aSNate Lawson  * ensure that the distribution and export/re-export of the software is in
10653289f6aSNate Lawson  * compliance with all laws, regulations, orders, or other restrictions of the
10753289f6aSNate Lawson  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10853289f6aSNate Lawson  * any of its subsidiaries will export/re-export any technical data, process,
10953289f6aSNate Lawson  * software, or service, directly or indirectly, to any country for which the
11053289f6aSNate Lawson  * United States government or any agency thereof requires an export license,
11153289f6aSNate Lawson  * other governmental approval, or letter of assurance, without first obtaining
11253289f6aSNate Lawson  * such license, approval or letter.
11353289f6aSNate Lawson  *
11453289f6aSNate Lawson  *****************************************************************************/
11553289f6aSNate Lawson 
11653289f6aSNate Lawson 
117ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
11853289f6aSNate Lawson #include "aslcompiler.y.h"
11953289f6aSNate Lawson 
120ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
121ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
122ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
123ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
12453289f6aSNate Lawson 
12553289f6aSNate Lawson 
12653289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
12753289f6aSNate Lawson         ACPI_MODULE_NAME    ("asllookup")
12853289f6aSNate Lawson 
129fba7fc7eSJung-uk Kim /* Local prototypes */
130fba7fc7eSJung-uk Kim 
131fba7fc7eSJung-uk Kim static ACPI_STATUS
132fba7fc7eSJung-uk Kim LsCompareOneNamespaceObject (
133fba7fc7eSJung-uk Kim     ACPI_HANDLE             ObjHandle,
134fba7fc7eSJung-uk Kim     UINT32                  Level,
135fba7fc7eSJung-uk Kim     void                    *Context,
136fba7fc7eSJung-uk Kim     void                    **ReturnValue);
137fba7fc7eSJung-uk Kim 
138fba7fc7eSJung-uk Kim static ACPI_STATUS
139fba7fc7eSJung-uk Kim LsDoOneNamespaceObject (
140fba7fc7eSJung-uk Kim     ACPI_HANDLE             ObjHandle,
141fba7fc7eSJung-uk Kim     UINT32                  Level,
142fba7fc7eSJung-uk Kim     void                    *Context,
143fba7fc7eSJung-uk Kim     void                    **ReturnValue);
144fba7fc7eSJung-uk Kim 
145fba7fc7eSJung-uk Kim static BOOLEAN
146fba7fc7eSJung-uk Kim LkObjectExists (
147fba7fc7eSJung-uk Kim     char                    *Name);
148fba7fc7eSJung-uk Kim 
149fba7fc7eSJung-uk Kim static void
150fba7fc7eSJung-uk Kim LkCheckFieldRange (
151fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
152fba7fc7eSJung-uk Kim     UINT32                  RegionBitLength,
153fba7fc7eSJung-uk Kim     UINT32                  FieldBitOffset,
154fba7fc7eSJung-uk Kim     UINT32                  FieldBitLength,
155fba7fc7eSJung-uk Kim     UINT32                  AccessBitWidth);
156fba7fc7eSJung-uk Kim 
157fba7fc7eSJung-uk Kim static ACPI_STATUS
158fba7fc7eSJung-uk Kim LkNamespaceLocateBegin (
159fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
160fba7fc7eSJung-uk Kim     UINT32                  Level,
161fba7fc7eSJung-uk Kim     void                    *Context);
162fba7fc7eSJung-uk Kim 
163fba7fc7eSJung-uk Kim static ACPI_STATUS
164fba7fc7eSJung-uk Kim LkNamespaceLocateEnd (
165fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
166fba7fc7eSJung-uk Kim     UINT32                  Level,
167fba7fc7eSJung-uk Kim     void                    *Context);
168fba7fc7eSJung-uk Kim 
1691a39cfb0SJung-uk Kim static ACPI_STATUS
1701a39cfb0SJung-uk Kim LkIsObjectUsed (
1711a39cfb0SJung-uk Kim     ACPI_HANDLE             ObjHandle,
1721a39cfb0SJung-uk Kim     UINT32                  Level,
1731a39cfb0SJung-uk Kim     void                    *Context,
1741a39cfb0SJung-uk Kim     void                    **ReturnValue);
1751a39cfb0SJung-uk Kim 
176a9f12690SJung-uk Kim static ACPI_STATUS
177a9f12690SJung-uk Kim LsDoOnePathname (
178a9f12690SJung-uk Kim     ACPI_HANDLE             ObjHandle,
179a9f12690SJung-uk Kim     UINT32                  Level,
180a9f12690SJung-uk Kim     void                    *Context,
181a9f12690SJung-uk Kim     void                    **ReturnValue);
182a9f12690SJung-uk Kim 
183a9f12690SJung-uk Kim void
184a9f12690SJung-uk Kim LsSetupNsList (
185a9f12690SJung-uk Kim     void                    *Handle);
186a9f12690SJung-uk Kim 
187a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *
188a9f12690SJung-uk Kim LkGetNameOp (
189a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
190a9f12690SJung-uk Kim 
19153289f6aSNate Lawson 
19253289f6aSNate Lawson /*******************************************************************************
19353289f6aSNate Lawson  *
19453289f6aSNate Lawson  * FUNCTION:    LsDoOneNamespaceObject
19553289f6aSNate Lawson  *
19653289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
19753289f6aSNate Lawson  *
19853289f6aSNate Lawson  * RETURN:      Status
19953289f6aSNate Lawson  *
20053289f6aSNate Lawson  * DESCRIPTION: Dump a namespace object to the namespace output file.
20153289f6aSNate Lawson  *              Called during the walk of the namespace to dump all objects.
20253289f6aSNate Lawson  *
20353289f6aSNate Lawson  ******************************************************************************/
20453289f6aSNate Lawson 
205fba7fc7eSJung-uk Kim static ACPI_STATUS
20653289f6aSNate Lawson LsDoOneNamespaceObject (
20753289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
20853289f6aSNate Lawson     UINT32                  Level,
20953289f6aSNate Lawson     void                    *Context,
21053289f6aSNate Lawson     void                    **ReturnValue)
21153289f6aSNate Lawson {
21253289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
213fba7fc7eSJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
21453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op;
21553289f6aSNate Lawson 
21653289f6aSNate Lawson 
21753289f6aSNate Lawson     Gbl_NumNamespaceObjects++;
21853289f6aSNate Lawson 
21953289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5d  [%d]  %*s %4.4s - %s",
22053289f6aSNate Lawson         Gbl_NumNamespaceObjects, Level, (Level * 3), " ",
22153289f6aSNate Lawson         &Node->Name,
22253289f6aSNate Lawson         AcpiUtGetTypeName (Node->Type));
22353289f6aSNate Lawson 
224fba7fc7eSJung-uk Kim     Op = Node->Op;
225fba7fc7eSJung-uk Kim     ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object);
22653289f6aSNate Lawson 
227fba7fc7eSJung-uk Kim     if (!Op)
22853289f6aSNate Lawson     {
229fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
230fba7fc7eSJung-uk Kim         return (AE_OK);
23153289f6aSNate Lawson     }
23253289f6aSNate Lawson 
233fba7fc7eSJung-uk Kim 
234fba7fc7eSJung-uk Kim     if ((ObjDesc) &&
2351a39cfb0SJung-uk Kim         (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND))
236fba7fc7eSJung-uk Kim     {
23753289f6aSNate Lawson         switch (Node->Type)
23853289f6aSNate Lawson         {
23953289f6aSNate Lawson         case ACPI_TYPE_INTEGER:
24053289f6aSNate Lawson 
241fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
242fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
243fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
24453289f6aSNate Lawson             break;
24553289f6aSNate Lawson 
24653289f6aSNate Lawson 
24753289f6aSNate Lawson         case ACPI_TYPE_STRING:
24853289f6aSNate Lawson 
249fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
250fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
251fba7fc7eSJung-uk Kim                 ObjDesc->String.Pointer);
252fba7fc7eSJung-uk Kim             break;
253fba7fc7eSJung-uk Kim 
254fba7fc7eSJung-uk Kim         default:
255fba7fc7eSJung-uk Kim             /* Nothing to do for other types */
256fba7fc7eSJung-uk Kim             break;
257fba7fc7eSJung-uk Kim         }
258fba7fc7eSJung-uk Kim 
259fba7fc7eSJung-uk Kim     }
260fba7fc7eSJung-uk Kim     else
261fba7fc7eSJung-uk Kim     {
262fba7fc7eSJung-uk Kim         switch (Node->Type)
263fba7fc7eSJung-uk Kim         {
264fba7fc7eSJung-uk Kim         case ACPI_TYPE_INTEGER:
265fba7fc7eSJung-uk Kim 
266fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
267fba7fc7eSJung-uk Kim             {
268fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
269fba7fc7eSJung-uk Kim             }
27053289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
27153289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
27253289f6aSNate Lawson             {
27353289f6aSNate Lawson                 Op = Op->Asl.Next;
27453289f6aSNate Lawson             }
275fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
276fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
277fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
278fba7fc7eSJung-uk Kim             break;
27953289f6aSNate Lawson 
280fba7fc7eSJung-uk Kim 
281fba7fc7eSJung-uk Kim         case ACPI_TYPE_STRING:
282fba7fc7eSJung-uk Kim 
283fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
284fba7fc7eSJung-uk Kim             {
285fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
286fba7fc7eSJung-uk Kim             }
287fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
288fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
289fba7fc7eSJung-uk Kim             {
290fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
291fba7fc7eSJung-uk Kim             }
292fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
293fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
29453289f6aSNate Lawson                 Op->Asl.Value.String);
29553289f6aSNate Lawson             break;
29653289f6aSNate Lawson 
29753289f6aSNate Lawson 
29853289f6aSNate Lawson         case ACPI_TYPE_LOCAL_REGION_FIELD:
29953289f6aSNate Lawson 
30053289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
30153289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
30253289f6aSNate Lawson             {
30353289f6aSNate Lawson                 Op = Op->Asl.Child;
30453289f6aSNate Lawson             }
305fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
306fba7fc7eSJung-uk Kim                 "   [Offset 0x%04X   Length 0x%04X bits]",
30753289f6aSNate Lawson                 Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer);
30853289f6aSNate Lawson             break;
30953289f6aSNate Lawson 
31053289f6aSNate Lawson 
311fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER_FIELD:
312fba7fc7eSJung-uk Kim 
313fba7fc7eSJung-uk Kim             switch (Op->Asl.ParseOpcode)
314fba7fc7eSJung-uk Kim             {
315fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBYTEFIELD:
316fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BYTE  ( 8 bit)]");
317fba7fc7eSJung-uk Kim                 break;
318fba7fc7eSJung-uk Kim 
319fba7fc7eSJung-uk Kim             case PARSEOP_CREATEDWORDFIELD:
320fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [DWORD (32 bit)]");
321fba7fc7eSJung-uk Kim                 break;
322fba7fc7eSJung-uk Kim 
323fba7fc7eSJung-uk Kim             case PARSEOP_CREATEQWORDFIELD:
324fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [QWORD (64 bit)]");
325fba7fc7eSJung-uk Kim                 break;
326fba7fc7eSJung-uk Kim 
327fba7fc7eSJung-uk Kim             case PARSEOP_CREATEWORDFIELD:
328fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [WORD  (16 bit)]");
329fba7fc7eSJung-uk Kim                 break;
330fba7fc7eSJung-uk Kim 
331fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBITFIELD:
332fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BIT   ( 1 bit)]");
333fba7fc7eSJung-uk Kim                 break;
334fba7fc7eSJung-uk Kim 
335fba7fc7eSJung-uk Kim             case PARSEOP_CREATEFIELD:
336fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [Arbitrary Bit Field]");
337fba7fc7eSJung-uk Kim                 break;
338fba7fc7eSJung-uk Kim 
339fba7fc7eSJung-uk Kim             default:
340fba7fc7eSJung-uk Kim                 break;
341fba7fc7eSJung-uk Kim 
342fba7fc7eSJung-uk Kim             }
343fba7fc7eSJung-uk Kim             break;
344fba7fc7eSJung-uk Kim 
345fba7fc7eSJung-uk Kim 
346fba7fc7eSJung-uk Kim         case ACPI_TYPE_PACKAGE:
347fba7fc7eSJung-uk Kim 
348fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
349fba7fc7eSJung-uk Kim             {
350fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
351fba7fc7eSJung-uk Kim             }
352fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
353fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
354fba7fc7eSJung-uk Kim             {
355fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
356fba7fc7eSJung-uk Kim             }
357fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
358fba7fc7eSJung-uk Kim 
359fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) ||
360fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA))
361fba7fc7eSJung-uk Kim             {
362fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
363fba7fc7eSJung-uk Kim                     "       [Initial Length  0x%.2X elements]",
364fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
365fba7fc7eSJung-uk Kim             }
366fba7fc7eSJung-uk Kim             break;
367fba7fc7eSJung-uk Kim 
368fba7fc7eSJung-uk Kim 
369fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER:
370fba7fc7eSJung-uk Kim 
371fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
372fba7fc7eSJung-uk Kim             {
373fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
374fba7fc7eSJung-uk Kim             }
375fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
376fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
377fba7fc7eSJung-uk Kim             {
378fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
379fba7fc7eSJung-uk Kim             }
380fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
381fba7fc7eSJung-uk Kim 
3821a39cfb0SJung-uk Kim             if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER))
383fba7fc7eSJung-uk Kim             {
384fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
385fba7fc7eSJung-uk Kim                     "        [Initial Length  0x%.2X bytes]",
386fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
387fba7fc7eSJung-uk Kim             }
388fba7fc7eSJung-uk Kim             break;
389fba7fc7eSJung-uk Kim 
390fba7fc7eSJung-uk Kim 
391fba7fc7eSJung-uk Kim         case ACPI_TYPE_METHOD:
392fba7fc7eSJung-uk Kim 
393fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
394fba7fc7eSJung-uk Kim                 "        [Code Length     0x%.4X bytes]",
395fba7fc7eSJung-uk Kim                 Op->Asl.AmlSubtreeLength);
396fba7fc7eSJung-uk Kim             break;
397fba7fc7eSJung-uk Kim 
398fba7fc7eSJung-uk Kim 
3991a39cfb0SJung-uk Kim         case ACPI_TYPE_LOCAL_RESOURCE:
4001a39cfb0SJung-uk Kim 
4011a39cfb0SJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
4021a39cfb0SJung-uk Kim                 "  [Desc Offset     0x%.4X Bytes]", Node->Value);
4031a39cfb0SJung-uk Kim             break;
4041a39cfb0SJung-uk Kim 
4051a39cfb0SJung-uk Kim 
4061a39cfb0SJung-uk Kim         case ACPI_TYPE_LOCAL_RESOURCE_FIELD:
4071a39cfb0SJung-uk Kim 
4081a39cfb0SJung-uk Kim             if (Node->Flags & 0x80)
4091a39cfb0SJung-uk Kim             {
4101a39cfb0SJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
4111a39cfb0SJung-uk Kim                     "   [Field Offset    0x%.4X Bits 0x%.4X Bytes]",
4121a39cfb0SJung-uk Kim                     Node->Value, Node->Value / 8);
4131a39cfb0SJung-uk Kim             }
4141a39cfb0SJung-uk Kim             else
4151a39cfb0SJung-uk Kim             {
4161a39cfb0SJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
4171a39cfb0SJung-uk Kim                     "   [Field Offset    0x%.4X Bytes]", Node->Value);
4181a39cfb0SJung-uk Kim             }
4191a39cfb0SJung-uk Kim             break;
4201a39cfb0SJung-uk Kim 
4211a39cfb0SJung-uk Kim 
42253289f6aSNate Lawson         default:
42353289f6aSNate Lawson             /* Nothing to do for other types */
42453289f6aSNate Lawson             break;
42553289f6aSNate Lawson         }
42653289f6aSNate Lawson     }
42753289f6aSNate Lawson 
42853289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
42953289f6aSNate Lawson     return (AE_OK);
43053289f6aSNate Lawson }
43153289f6aSNate Lawson 
43253289f6aSNate Lawson 
433a9f12690SJung-uk Kim /*******************************************************************************
434a9f12690SJung-uk Kim  *
435a9f12690SJung-uk Kim  * FUNCTION:    LsSetupNsList
436a9f12690SJung-uk Kim  *
437a9f12690SJung-uk Kim  * PARAMETERS:  Handle          - local file handle
438a9f12690SJung-uk Kim  *
439a9f12690SJung-uk Kim  * RETURN:      None
440a9f12690SJung-uk Kim  *
441a9f12690SJung-uk Kim  * DESCRIPTION: Set the namespace output file to the input handle
442a9f12690SJung-uk Kim  *
443a9f12690SJung-uk Kim  ******************************************************************************/
444a9f12690SJung-uk Kim 
4451a39cfb0SJung-uk Kim void
446a9f12690SJung-uk Kim LsSetupNsList (
447a9f12690SJung-uk Kim     void                    *Handle)
4481a39cfb0SJung-uk Kim {
4491a39cfb0SJung-uk Kim 
4501a39cfb0SJung-uk Kim     Gbl_NsOutputFlag = TRUE;
4511a39cfb0SJung-uk Kim     Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle;
4521a39cfb0SJung-uk Kim }
4531a39cfb0SJung-uk Kim 
4541a39cfb0SJung-uk Kim 
45553289f6aSNate Lawson /*******************************************************************************
45653289f6aSNate Lawson  *
457a9f12690SJung-uk Kim  * FUNCTION:    LsDoOnePathname
458a9f12690SJung-uk Kim  *
459a9f12690SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
460a9f12690SJung-uk Kim  *
461a9f12690SJung-uk Kim  * RETURN:      Status
462a9f12690SJung-uk Kim  *
463a9f12690SJung-uk Kim  * DESCRIPTION: Print the full pathname for a namespace node.
464a9f12690SJung-uk Kim  *
465a9f12690SJung-uk Kim  ******************************************************************************/
466a9f12690SJung-uk Kim 
467a9f12690SJung-uk Kim static ACPI_STATUS
468a9f12690SJung-uk Kim LsDoOnePathname (
469a9f12690SJung-uk Kim     ACPI_HANDLE             ObjHandle,
470a9f12690SJung-uk Kim     UINT32                  Level,
471a9f12690SJung-uk Kim     void                    *Context,
472a9f12690SJung-uk Kim     void                    **ReturnValue)
473a9f12690SJung-uk Kim {
474a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
475a9f12690SJung-uk Kim     ACPI_STATUS             Status;
476a9f12690SJung-uk Kim     ACPI_BUFFER             TargetPath;
477a9f12690SJung-uk Kim 
478a9f12690SJung-uk Kim 
479a9f12690SJung-uk Kim     TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
480a9f12690SJung-uk Kim     Status = AcpiNsHandleToPathname (Node, &TargetPath);
481a9f12690SJung-uk Kim     if (ACPI_FAILURE (Status))
482a9f12690SJung-uk Kim     {
483a9f12690SJung-uk Kim         return (Status);
484a9f12690SJung-uk Kim     }
485a9f12690SJung-uk Kim 
486a9f12690SJung-uk Kim     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", TargetPath.Pointer);
487a9f12690SJung-uk Kim     ACPI_FREE (TargetPath.Pointer);
488a9f12690SJung-uk Kim 
489a9f12690SJung-uk Kim     return (AE_OK);
490a9f12690SJung-uk Kim }
491a9f12690SJung-uk Kim 
492a9f12690SJung-uk Kim 
493a9f12690SJung-uk Kim /*******************************************************************************
494a9f12690SJung-uk Kim  *
49553289f6aSNate Lawson  * FUNCTION:    LsDisplayNamespace
49653289f6aSNate Lawson  *
49753289f6aSNate Lawson  * PARAMETERS:  None
49853289f6aSNate Lawson  *
499fba7fc7eSJung-uk Kim  * RETURN:      Status
50053289f6aSNate Lawson  *
50153289f6aSNate Lawson  * DESCRIPTION: Walk the namespace an display information about each node
50253289f6aSNate Lawson  *              in the tree.  Information is written to the optional
50353289f6aSNate Lawson  *              namespace output file.
50453289f6aSNate Lawson  *
50553289f6aSNate Lawson  ******************************************************************************/
50653289f6aSNate Lawson 
50753289f6aSNate Lawson ACPI_STATUS
50853289f6aSNate Lawson LsDisplayNamespace (
50953289f6aSNate Lawson     void)
51053289f6aSNate Lawson {
51153289f6aSNate Lawson     ACPI_STATUS             Status;
51253289f6aSNate Lawson 
51353289f6aSNate Lawson 
51453289f6aSNate Lawson     if (!Gbl_NsOutputFlag)
51553289f6aSNate Lawson     {
51653289f6aSNate Lawson         return (AE_OK);
51753289f6aSNate Lawson     }
51853289f6aSNate Lawson 
5191a39cfb0SJung-uk Kim     Gbl_NumNamespaceObjects = 0;
5201a39cfb0SJung-uk Kim 
52153289f6aSNate Lawson     /* File header */
52253289f6aSNate Lawson 
52353289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n");
52453289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count  Depth    Name - Type\n\n");
52553289f6aSNate Lawson 
52653289f6aSNate Lawson     /* Walk entire namespace from the root */
52753289f6aSNate Lawson 
52853289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
52953289f6aSNate Lawson                 ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject,
53053289f6aSNate Lawson                 NULL, NULL);
531a9f12690SJung-uk Kim 
532a9f12690SJung-uk Kim     /* Print the full pathname for each namespace node */
533a9f12690SJung-uk Kim 
534a9f12690SJung-uk Kim     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n");
535a9f12690SJung-uk Kim 
536a9f12690SJung-uk Kim     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
537a9f12690SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LsDoOnePathname,
538a9f12690SJung-uk Kim                 NULL, NULL);
539a9f12690SJung-uk Kim 
54053289f6aSNate Lawson     return (Status);
54153289f6aSNate Lawson }
54253289f6aSNate Lawson 
54353289f6aSNate Lawson 
54453289f6aSNate Lawson /*******************************************************************************
54553289f6aSNate Lawson  *
54653289f6aSNate Lawson  * FUNCTION:    LsCompareOneNamespaceObject
54753289f6aSNate Lawson  *
54853289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
54953289f6aSNate Lawson  *
55053289f6aSNate Lawson  * RETURN:      Status
55153289f6aSNate Lawson  *
55253289f6aSNate Lawson  * DESCRIPTION: Compare name of one object.
55353289f6aSNate Lawson  *
55453289f6aSNate Lawson  ******************************************************************************/
55553289f6aSNate Lawson 
556fba7fc7eSJung-uk Kim static ACPI_STATUS
55753289f6aSNate Lawson LsCompareOneNamespaceObject (
55853289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
55953289f6aSNate Lawson     UINT32                  Level,
56053289f6aSNate Lawson     void                    *Context,
56153289f6aSNate Lawson     void                    **ReturnValue)
56253289f6aSNate Lawson {
56353289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
56453289f6aSNate Lawson 
56553289f6aSNate Lawson 
56653289f6aSNate Lawson     /* Simply check the name */
56753289f6aSNate Lawson 
56853289f6aSNate Lawson     if (*((UINT32 *) (Context)) == Node->Name.Integer)
56953289f6aSNate Lawson     {
57053289f6aSNate Lawson         /* Abort walk if we found one instance */
57153289f6aSNate Lawson 
57253289f6aSNate Lawson         return (AE_CTRL_TRUE);
57353289f6aSNate Lawson     }
57453289f6aSNate Lawson 
57553289f6aSNate Lawson     return (AE_OK);
57653289f6aSNate Lawson }
57753289f6aSNate Lawson 
57853289f6aSNate Lawson 
57953289f6aSNate Lawson /*******************************************************************************
58053289f6aSNate Lawson  *
58153289f6aSNate Lawson  * FUNCTION:    LkObjectExists
58253289f6aSNate Lawson  *
58353289f6aSNate Lawson  * PARAMETERS:  Name            - 4 char ACPI name
58453289f6aSNate Lawson  *
58553289f6aSNate Lawson  * RETURN:      TRUE if name exists in namespace
58653289f6aSNate Lawson  *
58753289f6aSNate Lawson  * DESCRIPTION: Walk the namespace to find an object
58853289f6aSNate Lawson  *
58953289f6aSNate Lawson  ******************************************************************************/
59053289f6aSNate Lawson 
591fba7fc7eSJung-uk Kim static BOOLEAN
59253289f6aSNate Lawson LkObjectExists (
59353289f6aSNate Lawson     char                    *Name)
59453289f6aSNate Lawson {
59553289f6aSNate Lawson     ACPI_STATUS             Status;
59653289f6aSNate Lawson 
59753289f6aSNate Lawson 
59853289f6aSNate Lawson     /* Walk entire namespace from the supplied root */
59953289f6aSNate Lawson 
60053289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
60153289f6aSNate Lawson                 ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject,
60253289f6aSNate Lawson                 Name, NULL);
60353289f6aSNate Lawson     if (Status == AE_CTRL_TRUE)
60453289f6aSNate Lawson     {
60553289f6aSNate Lawson         /* At least one instance of the name was found */
60653289f6aSNate Lawson 
60753289f6aSNate Lawson         return (TRUE);
60853289f6aSNate Lawson     }
60953289f6aSNate Lawson 
61053289f6aSNate Lawson     return (FALSE);
61153289f6aSNate Lawson }
61253289f6aSNate Lawson 
61353289f6aSNate Lawson 
61453289f6aSNate Lawson /*******************************************************************************
61553289f6aSNate Lawson  *
6161a39cfb0SJung-uk Kim  * FUNCTION:    LkGetNameOp
6171a39cfb0SJung-uk Kim  *
6181a39cfb0SJung-uk Kim  * PARAMETERS:  Op              - Current Op
6191a39cfb0SJung-uk Kim  *
6201a39cfb0SJung-uk Kim  * RETURN:      NameOp associated with the input op
6211a39cfb0SJung-uk Kim  *
6221a39cfb0SJung-uk Kim  * DESCRIPTION: Find the name declaration op associated with the operator
6231a39cfb0SJung-uk Kim  *
6241a39cfb0SJung-uk Kim  ******************************************************************************/
6251a39cfb0SJung-uk Kim 
6261a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *
6271a39cfb0SJung-uk Kim LkGetNameOp (
6281a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
6291a39cfb0SJung-uk Kim {
6301a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6311a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NameOp = Op;
6321a39cfb0SJung-uk Kim 
6331a39cfb0SJung-uk Kim 
6341a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
6351a39cfb0SJung-uk Kim 
6361a39cfb0SJung-uk Kim 
6371a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6381a39cfb0SJung-uk Kim 
6391a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6401a39cfb0SJung-uk Kim     {
6411a39cfb0SJung-uk Kim         /* For nearly all NAMED operators, the name reference is the first child */
6421a39cfb0SJung-uk Kim 
6431a39cfb0SJung-uk Kim         NameOp = Op->Asl.Child;
6441a39cfb0SJung-uk Kim         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
6451a39cfb0SJung-uk Kim         {
6461a39cfb0SJung-uk Kim             /*
6471a39cfb0SJung-uk Kim              * ALIAS is the only oddball opcode, the name declaration
6481a39cfb0SJung-uk Kim              * (alias name) is the second operand
6491a39cfb0SJung-uk Kim              */
6501a39cfb0SJung-uk Kim             NameOp = Op->Asl.Child->Asl.Next;
6511a39cfb0SJung-uk Kim         }
6521a39cfb0SJung-uk Kim     }
6531a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6541a39cfb0SJung-uk Kim     {
6551a39cfb0SJung-uk Kim         /* Name must appear as the last parameter */
6561a39cfb0SJung-uk Kim 
6571a39cfb0SJung-uk Kim         NameOp = Op->Asl.Child;
6581a39cfb0SJung-uk Kim         while (!(NameOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
6591a39cfb0SJung-uk Kim         {
6601a39cfb0SJung-uk Kim             NameOp = NameOp->Asl.Next;
6611a39cfb0SJung-uk Kim         }
6621a39cfb0SJung-uk Kim     }
6631a39cfb0SJung-uk Kim 
6641a39cfb0SJung-uk Kim     return (NameOp);
6651a39cfb0SJung-uk Kim }
6661a39cfb0SJung-uk Kim 
6671a39cfb0SJung-uk Kim 
6681a39cfb0SJung-uk Kim /*******************************************************************************
6691a39cfb0SJung-uk Kim  *
6701a39cfb0SJung-uk Kim  * FUNCTION:    LkIsObjectUsed
6711a39cfb0SJung-uk Kim  *
6721a39cfb0SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
6731a39cfb0SJung-uk Kim  *
6741a39cfb0SJung-uk Kim  * RETURN:      Status
6751a39cfb0SJung-uk Kim  *
6761a39cfb0SJung-uk Kim  * DESCRIPTION: Check for an unreferenced namespace object and emit a warning.
6771a39cfb0SJung-uk Kim  *              We have to be careful, because some types and names are
6781a39cfb0SJung-uk Kim  *              typically or always unreferenced, we don't want to issue
6791a39cfb0SJung-uk Kim  *              excessive warnings.
6801a39cfb0SJung-uk Kim  *
6811a39cfb0SJung-uk Kim  ******************************************************************************/
6821a39cfb0SJung-uk Kim 
6831a39cfb0SJung-uk Kim static ACPI_STATUS
6841a39cfb0SJung-uk Kim LkIsObjectUsed (
6851a39cfb0SJung-uk Kim     ACPI_HANDLE             ObjHandle,
6861a39cfb0SJung-uk Kim     UINT32                  Level,
6871a39cfb0SJung-uk Kim     void                    *Context,
6881a39cfb0SJung-uk Kim     void                    **ReturnValue)
6891a39cfb0SJung-uk Kim {
6901a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
6911a39cfb0SJung-uk Kim 
6921a39cfb0SJung-uk Kim 
6931a39cfb0SJung-uk Kim     /* Referenced flag is set during the namespace xref */
6941a39cfb0SJung-uk Kim 
6951a39cfb0SJung-uk Kim     if (Node->Flags & ANOBJ_IS_REFERENCED)
6961a39cfb0SJung-uk Kim     {
6971a39cfb0SJung-uk Kim         return (AE_OK);
6981a39cfb0SJung-uk Kim     }
6991a39cfb0SJung-uk Kim 
7001a39cfb0SJung-uk Kim     /*
7011a39cfb0SJung-uk Kim      * Ignore names that start with an underscore,
7021a39cfb0SJung-uk Kim      * these are the reserved ACPI names and are typically not referenced,
7031a39cfb0SJung-uk Kim      * they are called by the host OS.
7041a39cfb0SJung-uk Kim      */
7051a39cfb0SJung-uk Kim     if (Node->Name.Ascii[0] == '_')
7061a39cfb0SJung-uk Kim     {
7071a39cfb0SJung-uk Kim         return (AE_OK);
7081a39cfb0SJung-uk Kim     }
7091a39cfb0SJung-uk Kim 
7101a39cfb0SJung-uk Kim     /* There are some types that are typically not referenced, ignore them */
7111a39cfb0SJung-uk Kim 
7121a39cfb0SJung-uk Kim     switch (Node->Type)
7131a39cfb0SJung-uk Kim     {
7141a39cfb0SJung-uk Kim     case ACPI_TYPE_DEVICE:
7151a39cfb0SJung-uk Kim     case ACPI_TYPE_PROCESSOR:
7161a39cfb0SJung-uk Kim     case ACPI_TYPE_POWER:
7171a39cfb0SJung-uk Kim     case ACPI_TYPE_LOCAL_RESOURCE:
7181a39cfb0SJung-uk Kim         return (AE_OK);
7191a39cfb0SJung-uk Kim 
7201a39cfb0SJung-uk Kim     default:
7211a39cfb0SJung-uk Kim         break;
7221a39cfb0SJung-uk Kim     }
7231a39cfb0SJung-uk Kim 
7241a39cfb0SJung-uk Kim     /* All others are valid unreferenced namespace objects */
7251a39cfb0SJung-uk Kim 
7261a39cfb0SJung-uk Kim     if (Node->Op)
7271a39cfb0SJung-uk Kim     {
7281a39cfb0SJung-uk Kim         AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL);
7291a39cfb0SJung-uk Kim     }
7301a39cfb0SJung-uk Kim     return (AE_OK);
7311a39cfb0SJung-uk Kim }
7321a39cfb0SJung-uk Kim 
7331a39cfb0SJung-uk Kim 
7341a39cfb0SJung-uk Kim /*******************************************************************************
7351a39cfb0SJung-uk Kim  *
7361a39cfb0SJung-uk Kim  * FUNCTION:    LkFindUnreferencedObjects
7371a39cfb0SJung-uk Kim  *
7381a39cfb0SJung-uk Kim  * PARAMETERS:  None
7391a39cfb0SJung-uk Kim  *
7401a39cfb0SJung-uk Kim  * RETURN:      None
7411a39cfb0SJung-uk Kim  *
7421a39cfb0SJung-uk Kim  * DESCRIPTION: Namespace walk to find objects that are not referenced in any
7431a39cfb0SJung-uk Kim  *              way. Must be called after the namespace has been cross
7441a39cfb0SJung-uk Kim  *              referenced.
7451a39cfb0SJung-uk Kim  *
7461a39cfb0SJung-uk Kim  ******************************************************************************/
7471a39cfb0SJung-uk Kim 
7481a39cfb0SJung-uk Kim void
7491a39cfb0SJung-uk Kim LkFindUnreferencedObjects (
7501a39cfb0SJung-uk Kim     void)
7511a39cfb0SJung-uk Kim {
7521a39cfb0SJung-uk Kim 
7531a39cfb0SJung-uk Kim     /* Walk entire namespace from the supplied root */
7541a39cfb0SJung-uk Kim 
7551a39cfb0SJung-uk Kim     (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
7561a39cfb0SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LkIsObjectUsed,
7571a39cfb0SJung-uk Kim                 NULL, NULL);
7581a39cfb0SJung-uk Kim }
7591a39cfb0SJung-uk Kim 
7601a39cfb0SJung-uk Kim 
7611a39cfb0SJung-uk Kim /*******************************************************************************
7621a39cfb0SJung-uk Kim  *
76353289f6aSNate Lawson  * FUNCTION:    LkCrossReferenceNamespace
76453289f6aSNate Lawson  *
76553289f6aSNate Lawson  * PARAMETERS:  None
76653289f6aSNate Lawson  *
76753289f6aSNate Lawson  * RETURN:      Status
76853289f6aSNate Lawson  *
76953289f6aSNate Lawson  * DESCRIPTION: Perform a cross reference check of the parse tree against the
77053289f6aSNate Lawson  *              namespace.  Every named referenced within the parse tree
77153289f6aSNate Lawson  *              should be get resolved with a namespace lookup.  If not, the
77253289f6aSNate Lawson  *              original reference in the ASL code is invalid -- i.e., refers
77353289f6aSNate Lawson  *              to a non-existent object.
77453289f6aSNate Lawson  *
77553289f6aSNate Lawson  * NOTE:  The ASL "External" operator causes the name to be inserted into the
77653289f6aSNate Lawson  *        namespace so that references to the external name will be resolved
77753289f6aSNate Lawson  *        correctly here.
77853289f6aSNate Lawson  *
77953289f6aSNate Lawson  ******************************************************************************/
78053289f6aSNate Lawson 
78153289f6aSNate Lawson ACPI_STATUS
78253289f6aSNate Lawson LkCrossReferenceNamespace (
78353289f6aSNate Lawson     void)
78453289f6aSNate Lawson {
78553289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState;
78653289f6aSNate Lawson 
78753289f6aSNate Lawson 
78853289f6aSNate Lawson     DbgPrint (ASL_DEBUG_OUTPUT, "\nCross referencing namespace\n\n");
78953289f6aSNate Lawson 
79053289f6aSNate Lawson     /*
79153289f6aSNate Lawson      * Create a new walk state for use when looking up names
79253289f6aSNate Lawson      * within the namespace (Passed as context to the callbacks)
79353289f6aSNate Lawson      */
79453289f6aSNate Lawson     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
79553289f6aSNate Lawson     if (!WalkState)
79653289f6aSNate Lawson     {
79753289f6aSNate Lawson         return AE_NO_MEMORY;
79853289f6aSNate Lawson     }
79953289f6aSNate Lawson 
80053289f6aSNate Lawson     /* Walk the entire parse tree */
80153289f6aSNate Lawson 
80253289f6aSNate Lawson     TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE, LkNamespaceLocateBegin,
80353289f6aSNate Lawson                         LkNamespaceLocateEnd, WalkState);
80453289f6aSNate Lawson     return AE_OK;
80553289f6aSNate Lawson }
80653289f6aSNate Lawson 
80753289f6aSNate Lawson 
80853289f6aSNate Lawson /*******************************************************************************
80953289f6aSNate Lawson  *
81053289f6aSNate Lawson  * FUNCTION:    LkCheckFieldRange
81153289f6aSNate Lawson  *
81253289f6aSNate Lawson  * PARAMETERS:  RegionBitLength     - Length of entire parent region
81353289f6aSNate Lawson  *              FieldBitOffset      - Start of the field unit (within region)
81453289f6aSNate Lawson  *              FieldBitLength      - Entire length of field unit
81553289f6aSNate Lawson  *              AccessBitWidth      - Access width of the field unit
81653289f6aSNate Lawson  *
81753289f6aSNate Lawson  * RETURN:      None
81853289f6aSNate Lawson  *
81953289f6aSNate Lawson  * DESCRIPTION: Check one field unit to make sure it fits in the parent
82053289f6aSNate Lawson  *              op region.
82153289f6aSNate Lawson  *
82253289f6aSNate Lawson  * Note: AccessBitWidth must be either 8,16,32, or 64
82353289f6aSNate Lawson  *
82453289f6aSNate Lawson  ******************************************************************************/
82553289f6aSNate Lawson 
826fba7fc7eSJung-uk Kim static void
82753289f6aSNate Lawson LkCheckFieldRange (
82853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
82953289f6aSNate Lawson     UINT32                  RegionBitLength,
83053289f6aSNate Lawson     UINT32                  FieldBitOffset,
83153289f6aSNate Lawson     UINT32                  FieldBitLength,
83253289f6aSNate Lawson     UINT32                  AccessBitWidth)
83353289f6aSNate Lawson {
83453289f6aSNate Lawson     UINT32                  FieldEndBitOffset;
83553289f6aSNate Lawson 
836fba7fc7eSJung-uk Kim 
83753289f6aSNate Lawson     /*
83853289f6aSNate Lawson      * Check each field unit against the region size.  The entire
83953289f6aSNate Lawson      * field unit (start offset plus length) must fit within the
84053289f6aSNate Lawson      * region.
84153289f6aSNate Lawson      */
84253289f6aSNate Lawson     FieldEndBitOffset = FieldBitOffset + FieldBitLength;
84353289f6aSNate Lawson 
84453289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
84553289f6aSNate Lawson     {
84653289f6aSNate Lawson         /* Field definition itself is beyond the end-of-region */
84753289f6aSNate Lawson 
84853289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_OFFSET, Op, NULL);
84953289f6aSNate Lawson         return;
85053289f6aSNate Lawson     }
85153289f6aSNate Lawson 
85253289f6aSNate Lawson     /*
85353289f6aSNate Lawson      * Now check that the field plus AccessWidth doesn't go beyond
85453289f6aSNate Lawson      * the end-of-region.  Assumes AccessBitWidth is a power of 2
85553289f6aSNate Lawson      */
85653289f6aSNate Lawson     FieldEndBitOffset = ACPI_ROUND_UP (FieldEndBitOffset, AccessBitWidth);
85753289f6aSNate Lawson 
85853289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
85953289f6aSNate Lawson     {
86053289f6aSNate Lawson         /* Field definition combined with the access is beyond EOR */
86153289f6aSNate Lawson 
86253289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_ACCESS_WIDTH, Op, NULL);
86353289f6aSNate Lawson     }
86453289f6aSNate Lawson }
86553289f6aSNate Lawson 
86653289f6aSNate Lawson /*******************************************************************************
86753289f6aSNate Lawson  *
86853289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateBegin
86953289f6aSNate Lawson  *
87053289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
87153289f6aSNate Lawson  *
87253289f6aSNate Lawson  * RETURN:      Status
87353289f6aSNate Lawson  *
87453289f6aSNate Lawson  * DESCRIPTION: Descending callback used during cross-reference.  For named
87553289f6aSNate Lawson  *              object references, attempt to locate the name in the
87653289f6aSNate Lawson  *              namespace.
87753289f6aSNate Lawson  *
87853289f6aSNate Lawson  * NOTE: ASL references to named fields within resource descriptors are
87953289f6aSNate Lawson  *       resolved to integer values here.  Therefore, this step is an
88053289f6aSNate Lawson  *       important part of the code generation.  We don't know that the
88153289f6aSNate Lawson  *       name refers to a resource descriptor until now.
88253289f6aSNate Lawson  *
88353289f6aSNate Lawson  ******************************************************************************/
88453289f6aSNate Lawson 
885fba7fc7eSJung-uk Kim static ACPI_STATUS
88653289f6aSNate Lawson LkNamespaceLocateBegin (
88753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
88853289f6aSNate Lawson     UINT32                  Level,
88953289f6aSNate Lawson     void                    *Context)
89053289f6aSNate Lawson {
89153289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
89253289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
89353289f6aSNate Lawson     ACPI_STATUS             Status;
89453289f6aSNate Lawson     ACPI_OBJECT_TYPE        ObjectType;
89553289f6aSNate Lawson     char                    *Path;
89653289f6aSNate Lawson     UINT8                   PassedArgs;
89753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NextOp;
89853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *OwningOp;
89953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *SpaceIdOp;
90053289f6aSNate Lawson     UINT32                  MinimumLength;
90153289f6aSNate Lawson     UINT32                  Temp;
90253289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
90353289f6aSNate Lawson     UINT32                  Flags;
90453289f6aSNate Lawson 
90553289f6aSNate Lawson 
9061a39cfb0SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (LkNamespaceLocateBegin, Op);
90753289f6aSNate Lawson 
90853289f6aSNate Lawson     /*
90953289f6aSNate Lawson      * If this node is the actual declaration of a name
91053289f6aSNate Lawson      * [such as the XXXX name in "Method (XXXX)"],
91153289f6aSNate Lawson      * we are not interested in it here.  We only care about names that are
91253289f6aSNate Lawson      * references to other objects within the namespace and the parent objects
91353289f6aSNate Lawson      * of name declarations
91453289f6aSNate Lawson      */
91553289f6aSNate Lawson     if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)
91653289f6aSNate Lawson     {
91753289f6aSNate Lawson         return (AE_OK);
91853289f6aSNate Lawson     }
91953289f6aSNate Lawson 
92053289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
92153289f6aSNate Lawson 
92253289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
92353289f6aSNate Lawson 
92453289f6aSNate Lawson     if ((!(OpInfo->Flags & AML_NAMED)) &&
92553289f6aSNate Lawson         (!(OpInfo->Flags & AML_CREATE)) &&
92653289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
92753289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESEG)    &&
92853289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
92953289f6aSNate Lawson     {
93053289f6aSNate Lawson         return (AE_OK);
93153289f6aSNate Lawson     }
93253289f6aSNate Lawson 
93353289f6aSNate Lawson     /*
934a9f12690SJung-uk Kim      * One special case: CondRefOf operator - we don't care if the name exists
935a9f12690SJung-uk Kim      * or not at this point, just ignore it, the point of the operator is to
936a9f12690SJung-uk Kim      * determine if the name exists at runtime.
937a9f12690SJung-uk Kim      */
938a9f12690SJung-uk Kim     if ((Op->Asl.Parent) &&
939a9f12690SJung-uk Kim         (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
940a9f12690SJung-uk Kim     {
941a9f12690SJung-uk Kim         return (AE_OK);
942a9f12690SJung-uk Kim     }
943a9f12690SJung-uk Kim 
944a9f12690SJung-uk Kim     /*
94553289f6aSNate Lawson      * We must enable the "search-to-root" for single NameSegs, but
94653289f6aSNate Lawson      * we have to be very careful about opening up scopes
94753289f6aSNate Lawson      */
94853289f6aSNate Lawson     Flags = ACPI_NS_SEARCH_PARENT;
94953289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
95053289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
95153289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
95253289f6aSNate Lawson     {
95353289f6aSNate Lawson         /*
95453289f6aSNate Lawson          * These are name references, do not push the scope stack
95553289f6aSNate Lawson          * for them.
95653289f6aSNate Lawson          */
95753289f6aSNate Lawson         Flags |= ACPI_NS_DONT_OPEN_SCOPE;
95853289f6aSNate Lawson     }
95953289f6aSNate Lawson 
96053289f6aSNate Lawson     /* Get the NamePath from the appropriate place */
96153289f6aSNate Lawson 
96253289f6aSNate Lawson     if (OpInfo->Flags & AML_NAMED)
96353289f6aSNate Lawson     {
9641a39cfb0SJung-uk Kim         /* For nearly all NAMED operators, the name reference is the first child */
96553289f6aSNate Lawson 
96653289f6aSNate Lawson         Path = Op->Asl.Child->Asl.Value.String;
96753289f6aSNate Lawson         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
96853289f6aSNate Lawson         {
96953289f6aSNate Lawson             /*
97053289f6aSNate Lawson              * ALIAS is the only oddball opcode, the name declaration
97153289f6aSNate Lawson              * (alias name) is the second operand
97253289f6aSNate Lawson              */
97353289f6aSNate Lawson             Path = Op->Asl.Child->Asl.Next->Asl.Value.String;
97453289f6aSNate Lawson         }
97553289f6aSNate Lawson     }
97653289f6aSNate Lawson     else if (OpInfo->Flags & AML_CREATE)
97753289f6aSNate Lawson     {
97853289f6aSNate Lawson         /* Name must appear as the last parameter */
97953289f6aSNate Lawson 
98053289f6aSNate Lawson         NextOp = Op->Asl.Child;
98153289f6aSNate Lawson         while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
98253289f6aSNate Lawson         {
98353289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
98453289f6aSNate Lawson         }
98553289f6aSNate Lawson         Path = NextOp->Asl.Value.String;
98653289f6aSNate Lawson     }
98753289f6aSNate Lawson     else
98853289f6aSNate Lawson     {
98953289f6aSNate Lawson         Path = Op->Asl.Value.String;
99053289f6aSNate Lawson     }
99153289f6aSNate Lawson 
99253289f6aSNate Lawson     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
993fba7fc7eSJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
994fba7fc7eSJung-uk Kim         "Type=%s\n", AcpiUtGetTypeName (ObjectType)));
99553289f6aSNate Lawson 
99653289f6aSNate Lawson     /*
99753289f6aSNate Lawson      * Lookup the name in the namespace.  Name must exist at this point, or it
99853289f6aSNate Lawson      * is an invalid reference.
99953289f6aSNate Lawson      *
100053289f6aSNate Lawson      * The namespace is also used as a lookup table for references to resource
100153289f6aSNate Lawson      * descriptors and the fields within them.
100253289f6aSNate Lawson      */
100353289f6aSNate Lawson     Gbl_NsLookupCount++;
100453289f6aSNate Lawson 
100553289f6aSNate Lawson     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
100653289f6aSNate Lawson                 ACPI_IMODE_EXECUTE, Flags, WalkState, &(Node));
100753289f6aSNate Lawson     if (ACPI_FAILURE (Status))
100853289f6aSNate Lawson     {
100953289f6aSNate Lawson         if (Status == AE_NOT_FOUND)
101053289f6aSNate Lawson         {
101153289f6aSNate Lawson             /*
101253289f6aSNate Lawson              * We didn't find the name reference by path -- we can qualify this
101353289f6aSNate Lawson              * a little better before we print an error message
101453289f6aSNate Lawson              */
101553289f6aSNate Lawson             if (strlen (Path) == ACPI_NAME_SIZE)
101653289f6aSNate Lawson             {
101753289f6aSNate Lawson                 /* A simple, one-segment ACPI name */
101853289f6aSNate Lawson 
101953289f6aSNate Lawson                 if (LkObjectExists (Path))
102053289f6aSNate Lawson                 {
1021fba7fc7eSJung-uk Kim                     /*
1022fba7fc7eSJung-uk Kim                      * There exists such a name, but we couldn't get to it
1023fba7fc7eSJung-uk Kim                      * from this scope
1024fba7fc7eSJung-uk Kim                      */
1025fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_REACHABLE, Op,
1026fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
102753289f6aSNate Lawson                 }
102853289f6aSNate Lawson                 else
102953289f6aSNate Lawson                 {
103053289f6aSNate Lawson                     /* The name doesn't exist, period */
103153289f6aSNate Lawson 
1032fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST,
1033fba7fc7eSJung-uk Kim                         Op, Op->Asl.ExternalName);
103453289f6aSNate Lawson                 }
103553289f6aSNate Lawson             }
103653289f6aSNate Lawson             else
103753289f6aSNate Lawson             {
103853289f6aSNate Lawson                 /* Check for a fully qualified path */
103953289f6aSNate Lawson 
104053289f6aSNate Lawson                 if (Path[0] == AML_ROOT_PREFIX)
104153289f6aSNate Lawson                 {
104253289f6aSNate Lawson                     /* Gave full path, the object does not exist */
104353289f6aSNate Lawson 
1044fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op,
1045fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
104653289f6aSNate Lawson                 }
104753289f6aSNate Lawson                 else
104853289f6aSNate Lawson                 {
1049fba7fc7eSJung-uk Kim                     /*
1050fba7fc7eSJung-uk Kim                      * We can't tell whether it doesn't exist or just
1051fba7fc7eSJung-uk Kim                      * can't be reached.
1052fba7fc7eSJung-uk Kim                      */
1053fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
1054fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
105553289f6aSNate Lawson                 }
105653289f6aSNate Lawson             }
105753289f6aSNate Lawson 
105853289f6aSNate Lawson             Status = AE_OK;
105953289f6aSNate Lawson         }
106053289f6aSNate Lawson         return (Status);
106153289f6aSNate Lawson     }
106253289f6aSNate Lawson 
10631a39cfb0SJung-uk Kim     /* Check for a reference vs. name declaration */
10641a39cfb0SJung-uk Kim 
10651a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
10661a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
10671a39cfb0SJung-uk Kim     {
10681a39cfb0SJung-uk Kim         /* This node has been referenced, mark it for reference check */
10691a39cfb0SJung-uk Kim 
10701a39cfb0SJung-uk Kim         Node->Flags |= ANOBJ_IS_REFERENCED;
10711a39cfb0SJung-uk Kim     }
10721a39cfb0SJung-uk Kim 
107353289f6aSNate Lawson     /* Attempt to optimize the NamePath */
107453289f6aSNate Lawson 
107553289f6aSNate Lawson     OptOptimizeNamePath (Op, OpInfo->Flags, WalkState, Path, Node);
107653289f6aSNate Lawson 
107753289f6aSNate Lawson     /*
10781a39cfb0SJung-uk Kim      * 1) Dereference an alias (A name reference that is an alias)
10791a39cfb0SJung-uk Kim      *    Aliases are not nested, the alias always points to the final object
108053289f6aSNate Lawson      */
1081fba7fc7eSJung-uk Kim     if ((Op->Asl.ParseOpcode != PARSEOP_ALIAS) &&
1082fba7fc7eSJung-uk Kim         (Node->Type == ACPI_TYPE_LOCAL_ALIAS))
108353289f6aSNate Lawson     {
108453289f6aSNate Lawson         /* This node points back to the original PARSEOP_ALIAS */
108553289f6aSNate Lawson 
1086fba7fc7eSJung-uk Kim         NextOp = Node->Op;
108753289f6aSNate Lawson 
108853289f6aSNate Lawson         /* The first child is the alias target op */
108953289f6aSNate Lawson 
109053289f6aSNate Lawson         NextOp = NextOp->Asl.Child;
109153289f6aSNate Lawson 
10921a39cfb0SJung-uk Kim         /* That in turn points back to original target alias node */
109353289f6aSNate Lawson 
109453289f6aSNate Lawson         if (NextOp->Asl.Node)
109553289f6aSNate Lawson         {
109653289f6aSNate Lawson             Node = NextOp->Asl.Node;
109753289f6aSNate Lawson         }
10981a39cfb0SJung-uk Kim 
10991a39cfb0SJung-uk Kim         /* Else - forward reference to alias, will be resolved later */
110053289f6aSNate Lawson     }
110153289f6aSNate Lawson 
11021a39cfb0SJung-uk Kim     /* 2) Check for a reference to a resource descriptor */
110353289f6aSNate Lawson 
11041a39cfb0SJung-uk Kim     if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
110553289f6aSNate Lawson              (Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
110653289f6aSNate Lawson     {
110753289f6aSNate Lawson         /*
110853289f6aSNate Lawson          * This was a reference to a field within a resource descriptor.  Extract
110953289f6aSNate Lawson          * the associated field offset (either a bit or byte offset depending on
111053289f6aSNate Lawson          * the field type) and change the named reference into an integer for
111153289f6aSNate Lawson          * AML code generation
111253289f6aSNate Lawson          */
1113fba7fc7eSJung-uk Kim         Temp = Node->Value;
111453289f6aSNate Lawson         if (Node->Flags & ANOBJ_IS_BIT_OFFSET)
111553289f6aSNate Lawson         {
111653289f6aSNate Lawson             Op->Asl.CompileFlags |= NODE_IS_BIT_OFFSET;
111753289f6aSNate Lawson         }
111853289f6aSNate Lawson 
111953289f6aSNate Lawson         /* Perform BitOffset <--> ByteOffset conversion if necessary */
112053289f6aSNate Lawson 
112153289f6aSNate Lawson         switch (Op->Asl.Parent->Asl.AmlOpcode)
112253289f6aSNate Lawson         {
112353289f6aSNate Lawson         case AML_CREATE_FIELD_OP:
112453289f6aSNate Lawson 
112553289f6aSNate Lawson             /* We allow a Byte offset to Bit Offset conversion for this op */
112653289f6aSNate Lawson 
112753289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
112853289f6aSNate Lawson             {
112953289f6aSNate Lawson                 /* Simply multiply byte offset times 8 to get bit offset */
113053289f6aSNate Lawson 
113153289f6aSNate Lawson                 Temp = ACPI_MUL_8 (Temp);
113253289f6aSNate Lawson             }
113353289f6aSNate Lawson             break;
113453289f6aSNate Lawson 
113553289f6aSNate Lawson 
113653289f6aSNate Lawson         case AML_CREATE_BIT_FIELD_OP:
113753289f6aSNate Lawson 
113853289f6aSNate Lawson             /* This op requires a Bit Offset */
113953289f6aSNate Lawson 
114053289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
114153289f6aSNate Lawson             {
114253289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BYTES_TO_BITS, Op, NULL);
114353289f6aSNate Lawson             }
114453289f6aSNate Lawson             break;
114553289f6aSNate Lawson 
114653289f6aSNate Lawson 
114753289f6aSNate Lawson         case AML_CREATE_BYTE_FIELD_OP:
114853289f6aSNate Lawson         case AML_CREATE_WORD_FIELD_OP:
114953289f6aSNate Lawson         case AML_CREATE_DWORD_FIELD_OP:
115053289f6aSNate Lawson         case AML_CREATE_QWORD_FIELD_OP:
115153289f6aSNate Lawson         case AML_INDEX_OP:
115253289f6aSNate Lawson 
115353289f6aSNate Lawson             /* These Ops require Byte offsets */
115453289f6aSNate Lawson 
115553289f6aSNate Lawson             if (Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)
115653289f6aSNate Lawson             {
115753289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BITS_TO_BYTES, Op, NULL);
115853289f6aSNate Lawson             }
115953289f6aSNate Lawson             break;
116053289f6aSNate Lawson 
116153289f6aSNate Lawson 
116253289f6aSNate Lawson         default:
116353289f6aSNate Lawson             /* Nothing to do for other opcodes */
116453289f6aSNate Lawson             break;
116553289f6aSNate Lawson         }
116653289f6aSNate Lawson 
116753289f6aSNate Lawson         /* Now convert this node to an integer whose value is the field offset */
116853289f6aSNate Lawson 
1169fba7fc7eSJung-uk Kim         Op->Asl.AmlLength       = 0;
117053289f6aSNate Lawson         Op->Asl.ParseOpcode     = PARSEOP_INTEGER;
117153289f6aSNate Lawson         Op->Asl.Value.Integer   = (UINT64) Temp;
117253289f6aSNate Lawson         Op->Asl.CompileFlags   |= NODE_IS_RESOURCE_FIELD;
117353289f6aSNate Lawson 
117453289f6aSNate Lawson         OpcGenerateAmlOpcode (Op);
117553289f6aSNate Lawson     }
117653289f6aSNate Lawson 
11771a39cfb0SJung-uk Kim     /* 3) Check for a method invocation */
117853289f6aSNate Lawson 
117953289f6aSNate Lawson     else if ((((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)) &&
118053289f6aSNate Lawson                 (Node->Type == ACPI_TYPE_METHOD) &&
118153289f6aSNate Lawson                 (Op->Asl.Parent) &&
118253289f6aSNate Lawson                 (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_METHOD))   ||
118353289f6aSNate Lawson 
118453289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
118553289f6aSNate Lawson     {
118653289f6aSNate Lawson 
118753289f6aSNate Lawson         /*
1188fba7fc7eSJung-uk Kim          * A reference to a method within one of these opcodes is not an
1189fba7fc7eSJung-uk Kim          * invocation of the method, it is simply a reference to the method.
1190fba7fc7eSJung-uk Kim          */
1191fba7fc7eSJung-uk Kim         if ((Op->Asl.Parent) &&
1192fba7fc7eSJung-uk Kim            ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF)      ||
1193fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF)    ||
1194fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE)))
1195fba7fc7eSJung-uk Kim         {
1196fba7fc7eSJung-uk Kim             return (AE_OK);
1197fba7fc7eSJung-uk Kim         }
1198fba7fc7eSJung-uk Kim         /*
119953289f6aSNate Lawson          * There are two types of method invocation:
1200fba7fc7eSJung-uk Kim          * 1) Invocation with arguments -- the parser recognizes this
1201fba7fc7eSJung-uk Kim          *    as a METHODCALL.
1202fba7fc7eSJung-uk Kim          * 2) Invocation with no arguments --the parser cannot determine that
1203fba7fc7eSJung-uk Kim          *    this is a method invocation, therefore we have to figure it out
1204fba7fc7eSJung-uk Kim          *    here.
120553289f6aSNate Lawson          */
120653289f6aSNate Lawson         if (Node->Type != ACPI_TYPE_METHOD)
120753289f6aSNate Lawson         {
1208fba7fc7eSJung-uk Kim             sprintf (MsgBuffer, "%s is a %s",
1209fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
121053289f6aSNate Lawson 
121153289f6aSNate Lawson             AslError (ASL_ERROR, ASL_MSG_NOT_METHOD, Op, MsgBuffer);
121253289f6aSNate Lawson             return (AE_OK);
121353289f6aSNate Lawson         }
121453289f6aSNate Lawson 
121553289f6aSNate Lawson         /* Save the method node in the caller's op */
121653289f6aSNate Lawson 
121753289f6aSNate Lawson         Op->Asl.Node = Node;
121853289f6aSNate Lawson         if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF)
121953289f6aSNate Lawson         {
122053289f6aSNate Lawson             return (AE_OK);
122153289f6aSNate Lawson         }
122253289f6aSNate Lawson 
122353289f6aSNate Lawson         /*
122453289f6aSNate Lawson          * This is a method invocation, with or without arguments.
122553289f6aSNate Lawson          * Count the number of arguments, each appears as a child
122653289f6aSNate Lawson          * under the parent node
122753289f6aSNate Lawson          */
122853289f6aSNate Lawson         Op->Asl.ParseOpcode = PARSEOP_METHODCALL;
122953289f6aSNate Lawson         UtSetParseOpName (Op);
123053289f6aSNate Lawson 
123153289f6aSNate Lawson         PassedArgs = 0;
123253289f6aSNate Lawson         NextOp     = Op->Asl.Child;
123353289f6aSNate Lawson 
123453289f6aSNate Lawson         while (NextOp)
123553289f6aSNate Lawson         {
123653289f6aSNate Lawson             PassedArgs++;
123753289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
123853289f6aSNate Lawson         }
123953289f6aSNate Lawson 
1240fba7fc7eSJung-uk Kim         if (Node->Value != ASL_EXTERNAL_METHOD)
124153289f6aSNate Lawson         {
124253289f6aSNate Lawson             /*
124353289f6aSNate Lawson              * Check the parsed arguments with the number expected by the
124453289f6aSNate Lawson              * method declaration itself
124553289f6aSNate Lawson              */
1246fba7fc7eSJung-uk Kim             if (PassedArgs != Node->Value)
124753289f6aSNate Lawson             {
124853289f6aSNate Lawson                 sprintf (MsgBuffer, "%s requires %d", Op->Asl.ExternalName,
1249fba7fc7eSJung-uk Kim                             Node->Value);
125053289f6aSNate Lawson 
1251fba7fc7eSJung-uk Kim                 if (PassedArgs < Node->Value)
125253289f6aSNate Lawson                 {
125353289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_LO, Op, MsgBuffer);
125453289f6aSNate Lawson                 }
125553289f6aSNate Lawson                 else
125653289f6aSNate Lawson                 {
125753289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_HI, Op, MsgBuffer);
125853289f6aSNate Lawson                 }
125953289f6aSNate Lawson             }
126053289f6aSNate Lawson         }
126153289f6aSNate Lawson     }
126253289f6aSNate Lawson 
12631a39cfb0SJung-uk Kim     /* 4) Check for an ASL Field definition */
1264fba7fc7eSJung-uk Kim 
126553289f6aSNate Lawson     else if ((Op->Asl.Parent) &&
126653289f6aSNate Lawson             ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_FIELD)     ||
126753289f6aSNate Lawson              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_BANKFIELD)))
126853289f6aSNate Lawson     {
126953289f6aSNate Lawson         /*
127053289f6aSNate Lawson          * Offset checking for fields.  If the parent operation region has a
127153289f6aSNate Lawson          * constant length (known at compile time), we can check fields
127253289f6aSNate Lawson          * defined in that region against the region length.  This will catch
127353289f6aSNate Lawson          * fields and field units that cannot possibly fit within the region.
127453289f6aSNate Lawson          *
127553289f6aSNate Lawson          * Note: Index fields do not directly reference an operation region,
127653289f6aSNate Lawson          * thus they are not included in this check.
127753289f6aSNate Lawson          */
127853289f6aSNate Lawson         if (Op == Op->Asl.Parent->Asl.Child)
127953289f6aSNate Lawson         {
128053289f6aSNate Lawson             /*
128153289f6aSNate Lawson              * This is the first child of the field node, which is
128253289f6aSNate Lawson              * the name of the region.  Get the parse node for the
128353289f6aSNate Lawson              * region -- which contains the length of the region.
128453289f6aSNate Lawson              */
1285fba7fc7eSJung-uk Kim             OwningOp = Node->Op;
1286fba7fc7eSJung-uk Kim             Op->Asl.Parent->Asl.ExtraValue =
1287fba7fc7eSJung-uk Kim                 ACPI_MUL_8 ((UINT32) OwningOp->Asl.Value.Integer);
128853289f6aSNate Lawson 
128953289f6aSNate Lawson             /* Examine the field access width */
129053289f6aSNate Lawson 
129153289f6aSNate Lawson             switch ((UINT8) Op->Asl.Parent->Asl.Value.Integer)
129253289f6aSNate Lawson             {
129353289f6aSNate Lawson             case AML_FIELD_ACCESS_ANY:
129453289f6aSNate Lawson             case AML_FIELD_ACCESS_BYTE:
129553289f6aSNate Lawson             case AML_FIELD_ACCESS_BUFFER:
129653289f6aSNate Lawson             default:
129753289f6aSNate Lawson                 MinimumLength = 1;
129853289f6aSNate Lawson                 break;
129953289f6aSNate Lawson 
130053289f6aSNate Lawson             case AML_FIELD_ACCESS_WORD:
130153289f6aSNate Lawson                 MinimumLength = 2;
130253289f6aSNate Lawson                 break;
130353289f6aSNate Lawson 
130453289f6aSNate Lawson             case AML_FIELD_ACCESS_DWORD:
130553289f6aSNate Lawson                 MinimumLength = 4;
130653289f6aSNate Lawson                 break;
130753289f6aSNate Lawson 
130853289f6aSNate Lawson             case AML_FIELD_ACCESS_QWORD:
130953289f6aSNate Lawson                 MinimumLength = 8;
131053289f6aSNate Lawson                 break;
131153289f6aSNate Lawson             }
131253289f6aSNate Lawson 
131353289f6aSNate Lawson             /*
131453289f6aSNate Lawson              * Is the region at least as big as the access width?
131553289f6aSNate Lawson              * Note: DataTableRegions have 0 length
131653289f6aSNate Lawson              */
131753289f6aSNate Lawson             if (((UINT32) OwningOp->Asl.Value.Integer) &&
131853289f6aSNate Lawson                 ((UINT32) OwningOp->Asl.Value.Integer < MinimumLength))
131953289f6aSNate Lawson             {
132053289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_FIELD_ACCESS_WIDTH, Op, NULL);
132153289f6aSNate Lawson             }
132253289f6aSNate Lawson 
132353289f6aSNate Lawson             /*
132453289f6aSNate Lawson              * Check EC/CMOS/SMBUS fields to make sure that the correct
132553289f6aSNate Lawson              * access type is used (BYTE for EC/CMOS, BUFFER for SMBUS)
132653289f6aSNate Lawson              */
132753289f6aSNate Lawson             SpaceIdOp = OwningOp->Asl.Child->Asl.Next;
132853289f6aSNate Lawson             switch ((UINT32) SpaceIdOp->Asl.Value.Integer)
132953289f6aSNate Lawson             {
133053289f6aSNate Lawson             case REGION_EC:
133153289f6aSNate Lawson             case REGION_CMOS:
133253289f6aSNate Lawson 
133353289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BYTE)
133453289f6aSNate Lawson                 {
133553289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BYTE_ACCESS, Op, NULL);
133653289f6aSNate Lawson                 }
133753289f6aSNate Lawson                 break;
133853289f6aSNate Lawson 
133953289f6aSNate Lawson             case REGION_SMBUS:
134053289f6aSNate Lawson 
134153289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BUFFER)
134253289f6aSNate Lawson                 {
134353289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BUFFER_ACCESS, Op, NULL);
134453289f6aSNate Lawson                 }
134553289f6aSNate Lawson                 break;
134653289f6aSNate Lawson 
134753289f6aSNate Lawson             default:
134853289f6aSNate Lawson 
134953289f6aSNate Lawson                 /* Nothing to do for other address spaces */
135053289f6aSNate Lawson                 break;
135153289f6aSNate Lawson             }
135253289f6aSNate Lawson         }
135353289f6aSNate Lawson         else
135453289f6aSNate Lawson         {
135553289f6aSNate Lawson             /*
135653289f6aSNate Lawson              * This is one element of the field list.  Check to make sure
135753289f6aSNate Lawson              * that it does not go beyond the end of the parent operation region.
135853289f6aSNate Lawson              *
135953289f6aSNate Lawson              * In the code below:
136053289f6aSNate Lawson              *    Op->Asl.Parent->Asl.ExtraValue      - Region Length (bits)
136153289f6aSNate Lawson              *    Op->Asl.ExtraValue                  - Field start offset (bits)
136253289f6aSNate Lawson              *    Op->Asl.Child->Asl.Value.Integer32  - Field length (bits)
136353289f6aSNate Lawson              *    Op->Asl.Child->Asl.ExtraValue       - Field access width (bits)
136453289f6aSNate Lawson              */
136553289f6aSNate Lawson             if (Op->Asl.Parent->Asl.ExtraValue && Op->Asl.Child)
136653289f6aSNate Lawson             {
136753289f6aSNate Lawson                 LkCheckFieldRange (Op,
136853289f6aSNate Lawson                             Op->Asl.Parent->Asl.ExtraValue,
136953289f6aSNate Lawson                             Op->Asl.ExtraValue,
137053289f6aSNate Lawson                             (UINT32) Op->Asl.Child->Asl.Value.Integer,
137153289f6aSNate Lawson                             Op->Asl.Child->Asl.ExtraValue);
137253289f6aSNate Lawson             }
137353289f6aSNate Lawson         }
137453289f6aSNate Lawson     }
137553289f6aSNate Lawson 
137653289f6aSNate Lawson     Op->Asl.Node = Node;
137753289f6aSNate Lawson     return (Status);
137853289f6aSNate Lawson }
137953289f6aSNate Lawson 
138053289f6aSNate Lawson 
138153289f6aSNate Lawson /*******************************************************************************
138253289f6aSNate Lawson  *
138353289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateEnd
138453289f6aSNate Lawson  *
138553289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
138653289f6aSNate Lawson  *
138753289f6aSNate Lawson  * RETURN:      Status
138853289f6aSNate Lawson  *
138953289f6aSNate Lawson  * DESCRIPTION: Ascending callback used during cross reference.  We only
139053289f6aSNate Lawson  *              need to worry about scope management here.
139153289f6aSNate Lawson  *
139253289f6aSNate Lawson  ******************************************************************************/
139353289f6aSNate Lawson 
1394fba7fc7eSJung-uk Kim static ACPI_STATUS
139553289f6aSNate Lawson LkNamespaceLocateEnd (
139653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
139753289f6aSNate Lawson     UINT32                  Level,
139853289f6aSNate Lawson     void                    *Context)
139953289f6aSNate Lawson {
140053289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
140153289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
140253289f6aSNate Lawson 
140353289f6aSNate Lawson 
14041a39cfb0SJung-uk Kim     ACPI_FUNCTION_TRACE (LkNamespaceLocateEnd);
140553289f6aSNate Lawson 
140653289f6aSNate Lawson 
140753289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
140853289f6aSNate Lawson 
140953289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
141053289f6aSNate Lawson     if (!(OpInfo->Flags & AML_NAMED))
141153289f6aSNate Lawson     {
141253289f6aSNate Lawson         return (AE_OK);
141353289f6aSNate Lawson     }
141453289f6aSNate Lawson 
141553289f6aSNate Lawson     /* Not interested in name references, we did not open a scope for them */
141653289f6aSNate Lawson 
141753289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
141853289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
141953289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
142053289f6aSNate Lawson     {
142153289f6aSNate Lawson         return (AE_OK);
142253289f6aSNate Lawson     }
142353289f6aSNate Lawson 
142453289f6aSNate Lawson     /* Pop the scope stack if necessary */
142553289f6aSNate Lawson 
142653289f6aSNate Lawson     if (AcpiNsOpensScope (AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode)))
142753289f6aSNate Lawson     {
142853289f6aSNate Lawson 
142953289f6aSNate Lawson         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
143053289f6aSNate Lawson             "%s: Popping scope for Op %p\n",
143153289f6aSNate Lawson             AcpiUtGetTypeName (OpInfo->ObjectType), Op));
143253289f6aSNate Lawson 
1433fba7fc7eSJung-uk Kim         (void) AcpiDsScopeStackPop (WalkState);
143453289f6aSNate Lawson     }
143553289f6aSNate Lawson 
143653289f6aSNate Lawson     return (AE_OK);
143753289f6aSNate Lawson }
143853289f6aSNate Lawson 
143953289f6aSNate Lawson 
1440