xref: /freebsd/sys/contrib/dev/acpica/compiler/asllookup.c (revision 42fecd1294987e8ba9dc23c31c3f55307aca6406)
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  *
119a179dd8SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2010, 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 
183*42fecd12SJung-uk Kim static ACPI_PARSE_OBJECT *
184a9f12690SJung-uk Kim LkGetNameOp (
185a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
186a9f12690SJung-uk Kim 
18753289f6aSNate Lawson 
18853289f6aSNate Lawson /*******************************************************************************
18953289f6aSNate Lawson  *
19053289f6aSNate Lawson  * FUNCTION:    LsDoOneNamespaceObject
19153289f6aSNate Lawson  *
19253289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
19353289f6aSNate Lawson  *
19453289f6aSNate Lawson  * RETURN:      Status
19553289f6aSNate Lawson  *
19653289f6aSNate Lawson  * DESCRIPTION: Dump a namespace object to the namespace output file.
19753289f6aSNate Lawson  *              Called during the walk of the namespace to dump all objects.
19853289f6aSNate Lawson  *
19953289f6aSNate Lawson  ******************************************************************************/
20053289f6aSNate Lawson 
201fba7fc7eSJung-uk Kim static ACPI_STATUS
20253289f6aSNate Lawson LsDoOneNamespaceObject (
20353289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
20453289f6aSNate Lawson     UINT32                  Level,
20553289f6aSNate Lawson     void                    *Context,
20653289f6aSNate Lawson     void                    **ReturnValue)
20753289f6aSNate Lawson {
20853289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
209fba7fc7eSJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
21053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op;
21153289f6aSNate Lawson 
21253289f6aSNate Lawson 
21353289f6aSNate Lawson     Gbl_NumNamespaceObjects++;
21453289f6aSNate Lawson 
215a88e22b7SJung-uk Kim     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5u  [%u]  %*s %4.4s - %s",
21653289f6aSNate Lawson         Gbl_NumNamespaceObjects, Level, (Level * 3), " ",
21753289f6aSNate Lawson         &Node->Name,
21853289f6aSNate Lawson         AcpiUtGetTypeName (Node->Type));
21953289f6aSNate Lawson 
220fba7fc7eSJung-uk Kim     Op = Node->Op;
221fba7fc7eSJung-uk Kim     ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object);
22253289f6aSNate Lawson 
223fba7fc7eSJung-uk Kim     if (!Op)
22453289f6aSNate Lawson     {
225fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
226fba7fc7eSJung-uk Kim         return (AE_OK);
22753289f6aSNate Lawson     }
22853289f6aSNate Lawson 
229fba7fc7eSJung-uk Kim 
230fba7fc7eSJung-uk Kim     if ((ObjDesc) &&
2311a39cfb0SJung-uk Kim         (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND))
232fba7fc7eSJung-uk Kim     {
23353289f6aSNate Lawson         switch (Node->Type)
23453289f6aSNate Lawson         {
23553289f6aSNate Lawson         case ACPI_TYPE_INTEGER:
23653289f6aSNate Lawson 
237fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
238fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
239fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
24053289f6aSNate Lawson             break;
24153289f6aSNate Lawson 
24253289f6aSNate Lawson 
24353289f6aSNate Lawson         case ACPI_TYPE_STRING:
24453289f6aSNate Lawson 
245fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
246fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
247fba7fc7eSJung-uk Kim                 ObjDesc->String.Pointer);
248fba7fc7eSJung-uk Kim             break;
249fba7fc7eSJung-uk Kim 
250fba7fc7eSJung-uk Kim         default:
251fba7fc7eSJung-uk Kim             /* Nothing to do for other types */
252fba7fc7eSJung-uk Kim             break;
253fba7fc7eSJung-uk Kim         }
254fba7fc7eSJung-uk Kim 
255fba7fc7eSJung-uk Kim     }
256fba7fc7eSJung-uk Kim     else
257fba7fc7eSJung-uk Kim     {
258fba7fc7eSJung-uk Kim         switch (Node->Type)
259fba7fc7eSJung-uk Kim         {
260fba7fc7eSJung-uk Kim         case ACPI_TYPE_INTEGER:
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             }
26653289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
26753289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
26853289f6aSNate Lawson             {
26953289f6aSNate Lawson                 Op = Op->Asl.Next;
27053289f6aSNate Lawson             }
271fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
272fba7fc7eSJung-uk Kim                 "       [Initial Value   0x%8.8X%8.8X]",
273fba7fc7eSJung-uk Kim                 ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
274fba7fc7eSJung-uk Kim             break;
27553289f6aSNate Lawson 
276fba7fc7eSJung-uk Kim 
277fba7fc7eSJung-uk Kim         case ACPI_TYPE_STRING:
278fba7fc7eSJung-uk Kim 
279fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
280fba7fc7eSJung-uk Kim             {
281fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
282fba7fc7eSJung-uk Kim             }
283fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
284fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
285fba7fc7eSJung-uk Kim             {
286fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
287fba7fc7eSJung-uk Kim             }
288fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
289fba7fc7eSJung-uk Kim                 "        [Initial Value   \"%s\"]",
29053289f6aSNate Lawson                 Op->Asl.Value.String);
29153289f6aSNate Lawson             break;
29253289f6aSNate Lawson 
29353289f6aSNate Lawson 
29453289f6aSNate Lawson         case ACPI_TYPE_LOCAL_REGION_FIELD:
29553289f6aSNate Lawson 
29653289f6aSNate Lawson             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
29753289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
29853289f6aSNate Lawson             {
29953289f6aSNate Lawson                 Op = Op->Asl.Child;
30053289f6aSNate Lawson             }
301fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
302fba7fc7eSJung-uk Kim                 "   [Offset 0x%04X   Length 0x%04X bits]",
30353289f6aSNate Lawson                 Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer);
30453289f6aSNate Lawson             break;
30553289f6aSNate Lawson 
30653289f6aSNate Lawson 
307fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER_FIELD:
308fba7fc7eSJung-uk Kim 
309fba7fc7eSJung-uk Kim             switch (Op->Asl.ParseOpcode)
310fba7fc7eSJung-uk Kim             {
311fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBYTEFIELD:
312fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BYTE  ( 8 bit)]");
313fba7fc7eSJung-uk Kim                 break;
314fba7fc7eSJung-uk Kim 
315fba7fc7eSJung-uk Kim             case PARSEOP_CREATEDWORDFIELD:
316fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [DWORD (32 bit)]");
317fba7fc7eSJung-uk Kim                 break;
318fba7fc7eSJung-uk Kim 
319fba7fc7eSJung-uk Kim             case PARSEOP_CREATEQWORDFIELD:
320fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [QWORD (64 bit)]");
321fba7fc7eSJung-uk Kim                 break;
322fba7fc7eSJung-uk Kim 
323fba7fc7eSJung-uk Kim             case PARSEOP_CREATEWORDFIELD:
324fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [WORD  (16 bit)]");
325fba7fc7eSJung-uk Kim                 break;
326fba7fc7eSJung-uk Kim 
327fba7fc7eSJung-uk Kim             case PARSEOP_CREATEBITFIELD:
328fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BIT   ( 1 bit)]");
329fba7fc7eSJung-uk Kim                 break;
330fba7fc7eSJung-uk Kim 
331fba7fc7eSJung-uk Kim             case PARSEOP_CREATEFIELD:
332fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [Arbitrary Bit Field]");
333fba7fc7eSJung-uk Kim                 break;
334fba7fc7eSJung-uk Kim 
335fba7fc7eSJung-uk Kim             default:
336fba7fc7eSJung-uk Kim                 break;
337fba7fc7eSJung-uk Kim 
338fba7fc7eSJung-uk Kim             }
339fba7fc7eSJung-uk Kim             break;
340fba7fc7eSJung-uk Kim 
341fba7fc7eSJung-uk Kim 
342fba7fc7eSJung-uk Kim         case ACPI_TYPE_PACKAGE:
343fba7fc7eSJung-uk Kim 
344fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
345fba7fc7eSJung-uk Kim             {
346fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
347fba7fc7eSJung-uk Kim             }
348fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
349fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
350fba7fc7eSJung-uk Kim             {
351fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
352fba7fc7eSJung-uk Kim             }
353fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
354fba7fc7eSJung-uk Kim 
355fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) ||
356fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA))
357fba7fc7eSJung-uk Kim             {
358fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
359fba7fc7eSJung-uk Kim                     "       [Initial Length  0x%.2X elements]",
360fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
361fba7fc7eSJung-uk Kim             }
362fba7fc7eSJung-uk Kim             break;
363fba7fc7eSJung-uk Kim 
364fba7fc7eSJung-uk Kim 
365fba7fc7eSJung-uk Kim         case ACPI_TYPE_BUFFER:
366fba7fc7eSJung-uk Kim 
367fba7fc7eSJung-uk Kim             if (Op->Asl.ParseOpcode == PARSEOP_NAME)
368fba7fc7eSJung-uk Kim             {
369fba7fc7eSJung-uk Kim                 Op = Op->Asl.Child;
370fba7fc7eSJung-uk Kim             }
371fba7fc7eSJung-uk Kim             if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
372fba7fc7eSJung-uk Kim                 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
373fba7fc7eSJung-uk Kim             {
374fba7fc7eSJung-uk Kim                 Op = Op->Asl.Next;
375fba7fc7eSJung-uk Kim             }
376fba7fc7eSJung-uk Kim             Op = Op->Asl.Child;
377fba7fc7eSJung-uk Kim 
3781a39cfb0SJung-uk Kim             if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER))
379fba7fc7eSJung-uk Kim             {
380fba7fc7eSJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
381fba7fc7eSJung-uk Kim                     "        [Initial Length  0x%.2X bytes]",
382fba7fc7eSJung-uk Kim                     Op->Asl.Value.Integer);
383fba7fc7eSJung-uk Kim             }
384fba7fc7eSJung-uk Kim             break;
385fba7fc7eSJung-uk Kim 
386fba7fc7eSJung-uk Kim 
387fba7fc7eSJung-uk Kim         case ACPI_TYPE_METHOD:
388fba7fc7eSJung-uk Kim 
389fba7fc7eSJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
390fba7fc7eSJung-uk Kim                 "        [Code Length     0x%.4X bytes]",
391fba7fc7eSJung-uk Kim                 Op->Asl.AmlSubtreeLength);
392fba7fc7eSJung-uk Kim             break;
393fba7fc7eSJung-uk Kim 
394fba7fc7eSJung-uk Kim 
3951a39cfb0SJung-uk Kim         case ACPI_TYPE_LOCAL_RESOURCE:
3961a39cfb0SJung-uk Kim 
3971a39cfb0SJung-uk Kim             FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
3981a39cfb0SJung-uk Kim                 "  [Desc Offset     0x%.4X Bytes]", Node->Value);
3991a39cfb0SJung-uk Kim             break;
4001a39cfb0SJung-uk Kim 
4011a39cfb0SJung-uk Kim 
4021a39cfb0SJung-uk Kim         case ACPI_TYPE_LOCAL_RESOURCE_FIELD:
4031a39cfb0SJung-uk Kim 
4041a39cfb0SJung-uk Kim             if (Node->Flags & 0x80)
4051a39cfb0SJung-uk Kim             {
4061a39cfb0SJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
4071a39cfb0SJung-uk Kim                     "   [Field Offset    0x%.4X Bits 0x%.4X Bytes]",
4081a39cfb0SJung-uk Kim                     Node->Value, Node->Value / 8);
4091a39cfb0SJung-uk Kim             }
4101a39cfb0SJung-uk Kim             else
4111a39cfb0SJung-uk Kim             {
4121a39cfb0SJung-uk Kim                 FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
4131a39cfb0SJung-uk Kim                     "   [Field Offset    0x%.4X Bytes]", Node->Value);
4141a39cfb0SJung-uk Kim             }
4151a39cfb0SJung-uk Kim             break;
4161a39cfb0SJung-uk Kim 
4171a39cfb0SJung-uk Kim 
41853289f6aSNate Lawson         default:
41953289f6aSNate Lawson             /* Nothing to do for other types */
42053289f6aSNate Lawson             break;
42153289f6aSNate Lawson         }
42253289f6aSNate Lawson     }
42353289f6aSNate Lawson 
42453289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
42553289f6aSNate Lawson     return (AE_OK);
42653289f6aSNate Lawson }
42753289f6aSNate Lawson 
42853289f6aSNate Lawson 
429a9f12690SJung-uk Kim /*******************************************************************************
430a9f12690SJung-uk Kim  *
431a9f12690SJung-uk Kim  * FUNCTION:    LsSetupNsList
432a9f12690SJung-uk Kim  *
433a9f12690SJung-uk Kim  * PARAMETERS:  Handle          - local file handle
434a9f12690SJung-uk Kim  *
435a9f12690SJung-uk Kim  * RETURN:      None
436a9f12690SJung-uk Kim  *
437a9f12690SJung-uk Kim  * DESCRIPTION: Set the namespace output file to the input handle
438a9f12690SJung-uk Kim  *
439a9f12690SJung-uk Kim  ******************************************************************************/
440a9f12690SJung-uk Kim 
4411a39cfb0SJung-uk Kim void
442a9f12690SJung-uk Kim LsSetupNsList (
443a9f12690SJung-uk Kim     void                    *Handle)
4441a39cfb0SJung-uk Kim {
4451a39cfb0SJung-uk Kim 
4461a39cfb0SJung-uk Kim     Gbl_NsOutputFlag = TRUE;
4471a39cfb0SJung-uk Kim     Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle;
4481a39cfb0SJung-uk Kim }
4491a39cfb0SJung-uk Kim 
4501a39cfb0SJung-uk Kim 
45153289f6aSNate Lawson /*******************************************************************************
45253289f6aSNate Lawson  *
453a9f12690SJung-uk Kim  * FUNCTION:    LsDoOnePathname
454a9f12690SJung-uk Kim  *
455a9f12690SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
456a9f12690SJung-uk Kim  *
457a9f12690SJung-uk Kim  * RETURN:      Status
458a9f12690SJung-uk Kim  *
459a9f12690SJung-uk Kim  * DESCRIPTION: Print the full pathname for a namespace node.
460a9f12690SJung-uk Kim  *
461a9f12690SJung-uk Kim  ******************************************************************************/
462a9f12690SJung-uk Kim 
463a9f12690SJung-uk Kim static ACPI_STATUS
464a9f12690SJung-uk Kim LsDoOnePathname (
465a9f12690SJung-uk Kim     ACPI_HANDLE             ObjHandle,
466a9f12690SJung-uk Kim     UINT32                  Level,
467a9f12690SJung-uk Kim     void                    *Context,
468a9f12690SJung-uk Kim     void                    **ReturnValue)
469a9f12690SJung-uk Kim {
470a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
471a9f12690SJung-uk Kim     ACPI_STATUS             Status;
472a9f12690SJung-uk Kim     ACPI_BUFFER             TargetPath;
473a9f12690SJung-uk Kim 
474a9f12690SJung-uk Kim 
475a9f12690SJung-uk Kim     TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
476a9f12690SJung-uk Kim     Status = AcpiNsHandleToPathname (Node, &TargetPath);
477a9f12690SJung-uk Kim     if (ACPI_FAILURE (Status))
478a9f12690SJung-uk Kim     {
479a9f12690SJung-uk Kim         return (Status);
480a9f12690SJung-uk Kim     }
481a9f12690SJung-uk Kim 
482a9f12690SJung-uk Kim     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", TargetPath.Pointer);
483a9f12690SJung-uk Kim     ACPI_FREE (TargetPath.Pointer);
484a9f12690SJung-uk Kim 
485a9f12690SJung-uk Kim     return (AE_OK);
486a9f12690SJung-uk Kim }
487a9f12690SJung-uk Kim 
488a9f12690SJung-uk Kim 
489a9f12690SJung-uk Kim /*******************************************************************************
490a9f12690SJung-uk Kim  *
49153289f6aSNate Lawson  * FUNCTION:    LsDisplayNamespace
49253289f6aSNate Lawson  *
49353289f6aSNate Lawson  * PARAMETERS:  None
49453289f6aSNate Lawson  *
495fba7fc7eSJung-uk Kim  * RETURN:      Status
49653289f6aSNate Lawson  *
49753289f6aSNate Lawson  * DESCRIPTION: Walk the namespace an display information about each node
49853289f6aSNate Lawson  *              in the tree.  Information is written to the optional
49953289f6aSNate Lawson  *              namespace output file.
50053289f6aSNate Lawson  *
50153289f6aSNate Lawson  ******************************************************************************/
50253289f6aSNate Lawson 
50353289f6aSNate Lawson ACPI_STATUS
50453289f6aSNate Lawson LsDisplayNamespace (
50553289f6aSNate Lawson     void)
50653289f6aSNate Lawson {
50753289f6aSNate Lawson     ACPI_STATUS             Status;
50853289f6aSNate Lawson 
50953289f6aSNate Lawson 
51053289f6aSNate Lawson     if (!Gbl_NsOutputFlag)
51153289f6aSNate Lawson     {
51253289f6aSNate Lawson         return (AE_OK);
51353289f6aSNate Lawson     }
51453289f6aSNate Lawson 
5151a39cfb0SJung-uk Kim     Gbl_NumNamespaceObjects = 0;
5161a39cfb0SJung-uk Kim 
51753289f6aSNate Lawson     /* File header */
51853289f6aSNate Lawson 
51953289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n");
52053289f6aSNate Lawson     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count  Depth    Name - Type\n\n");
52153289f6aSNate Lawson 
52253289f6aSNate Lawson     /* Walk entire namespace from the root */
52353289f6aSNate Lawson 
52453289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
5252272d050SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject, NULL,
52653289f6aSNate Lawson                 NULL, NULL);
527a9f12690SJung-uk Kim 
528a9f12690SJung-uk Kim     /* Print the full pathname for each namespace node */
529a9f12690SJung-uk Kim 
530a9f12690SJung-uk Kim     FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n");
531a9f12690SJung-uk Kim 
532a9f12690SJung-uk Kim     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
5332272d050SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LsDoOnePathname, NULL,
534a9f12690SJung-uk Kim                 NULL, NULL);
535a9f12690SJung-uk Kim 
53653289f6aSNate Lawson     return (Status);
53753289f6aSNate Lawson }
53853289f6aSNate Lawson 
53953289f6aSNate Lawson 
54053289f6aSNate Lawson /*******************************************************************************
54153289f6aSNate Lawson  *
54253289f6aSNate Lawson  * FUNCTION:    LsCompareOneNamespaceObject
54353289f6aSNate Lawson  *
54453289f6aSNate Lawson  * PARAMETERS:  ACPI_WALK_CALLBACK
54553289f6aSNate Lawson  *
54653289f6aSNate Lawson  * RETURN:      Status
54753289f6aSNate Lawson  *
54853289f6aSNate Lawson  * DESCRIPTION: Compare name of one object.
54953289f6aSNate Lawson  *
55053289f6aSNate Lawson  ******************************************************************************/
55153289f6aSNate Lawson 
552fba7fc7eSJung-uk Kim static ACPI_STATUS
55353289f6aSNate Lawson LsCompareOneNamespaceObject (
55453289f6aSNate Lawson     ACPI_HANDLE             ObjHandle,
55553289f6aSNate Lawson     UINT32                  Level,
55653289f6aSNate Lawson     void                    *Context,
55753289f6aSNate Lawson     void                    **ReturnValue)
55853289f6aSNate Lawson {
55953289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
56053289f6aSNate Lawson 
56153289f6aSNate Lawson 
56253289f6aSNate Lawson     /* Simply check the name */
56353289f6aSNate Lawson 
56453289f6aSNate Lawson     if (*((UINT32 *) (Context)) == Node->Name.Integer)
56553289f6aSNate Lawson     {
56653289f6aSNate Lawson         /* Abort walk if we found one instance */
56753289f6aSNate Lawson 
56853289f6aSNate Lawson         return (AE_CTRL_TRUE);
56953289f6aSNate Lawson     }
57053289f6aSNate Lawson 
57153289f6aSNate Lawson     return (AE_OK);
57253289f6aSNate Lawson }
57353289f6aSNate Lawson 
57453289f6aSNate Lawson 
57553289f6aSNate Lawson /*******************************************************************************
57653289f6aSNate Lawson  *
57753289f6aSNate Lawson  * FUNCTION:    LkObjectExists
57853289f6aSNate Lawson  *
57953289f6aSNate Lawson  * PARAMETERS:  Name            - 4 char ACPI name
58053289f6aSNate Lawson  *
58153289f6aSNate Lawson  * RETURN:      TRUE if name exists in namespace
58253289f6aSNate Lawson  *
58353289f6aSNate Lawson  * DESCRIPTION: Walk the namespace to find an object
58453289f6aSNate Lawson  *
58553289f6aSNate Lawson  ******************************************************************************/
58653289f6aSNate Lawson 
587fba7fc7eSJung-uk Kim static BOOLEAN
58853289f6aSNate Lawson LkObjectExists (
58953289f6aSNate Lawson     char                    *Name)
59053289f6aSNate Lawson {
59153289f6aSNate Lawson     ACPI_STATUS             Status;
59253289f6aSNate Lawson 
59353289f6aSNate Lawson 
59453289f6aSNate Lawson     /* Walk entire namespace from the supplied root */
59553289f6aSNate Lawson 
59653289f6aSNate Lawson     Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
5972272d050SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject, NULL,
59853289f6aSNate Lawson                 Name, NULL);
59953289f6aSNate Lawson     if (Status == AE_CTRL_TRUE)
60053289f6aSNate Lawson     {
60153289f6aSNate Lawson         /* At least one instance of the name was found */
60253289f6aSNate Lawson 
60353289f6aSNate Lawson         return (TRUE);
60453289f6aSNate Lawson     }
60553289f6aSNate Lawson 
60653289f6aSNate Lawson     return (FALSE);
60753289f6aSNate Lawson }
60853289f6aSNate Lawson 
60953289f6aSNate Lawson 
61053289f6aSNate Lawson /*******************************************************************************
61153289f6aSNate Lawson  *
6121a39cfb0SJung-uk Kim  * FUNCTION:    LkGetNameOp
6131a39cfb0SJung-uk Kim  *
6141a39cfb0SJung-uk Kim  * PARAMETERS:  Op              - Current Op
6151a39cfb0SJung-uk Kim  *
6161a39cfb0SJung-uk Kim  * RETURN:      NameOp associated with the input op
6171a39cfb0SJung-uk Kim  *
6181a39cfb0SJung-uk Kim  * DESCRIPTION: Find the name declaration op associated with the operator
6191a39cfb0SJung-uk Kim  *
6201a39cfb0SJung-uk Kim  ******************************************************************************/
6211a39cfb0SJung-uk Kim 
622*42fecd12SJung-uk Kim static ACPI_PARSE_OBJECT *
6231a39cfb0SJung-uk Kim LkGetNameOp (
6241a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
6251a39cfb0SJung-uk Kim {
6261a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6271a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NameOp = Op;
6281a39cfb0SJung-uk Kim 
6291a39cfb0SJung-uk Kim 
6301a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
6311a39cfb0SJung-uk Kim 
6321a39cfb0SJung-uk Kim 
6331a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6341a39cfb0SJung-uk Kim 
6351a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6361a39cfb0SJung-uk Kim     {
6371a39cfb0SJung-uk Kim         /* For nearly all NAMED operators, the name reference is the first child */
6381a39cfb0SJung-uk Kim 
6391a39cfb0SJung-uk Kim         NameOp = Op->Asl.Child;
6401a39cfb0SJung-uk Kim         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
6411a39cfb0SJung-uk Kim         {
6421a39cfb0SJung-uk Kim             /*
6431a39cfb0SJung-uk Kim              * ALIAS is the only oddball opcode, the name declaration
6441a39cfb0SJung-uk Kim              * (alias name) is the second operand
6451a39cfb0SJung-uk Kim              */
6461a39cfb0SJung-uk Kim             NameOp = Op->Asl.Child->Asl.Next;
6471a39cfb0SJung-uk Kim         }
6481a39cfb0SJung-uk Kim     }
6491a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6501a39cfb0SJung-uk Kim     {
6511a39cfb0SJung-uk Kim         /* Name must appear as the last parameter */
6521a39cfb0SJung-uk Kim 
6531a39cfb0SJung-uk Kim         NameOp = Op->Asl.Child;
6541a39cfb0SJung-uk Kim         while (!(NameOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
6551a39cfb0SJung-uk Kim         {
6561a39cfb0SJung-uk Kim             NameOp = NameOp->Asl.Next;
6571a39cfb0SJung-uk Kim         }
6581a39cfb0SJung-uk Kim     }
6591a39cfb0SJung-uk Kim 
6601a39cfb0SJung-uk Kim     return (NameOp);
6611a39cfb0SJung-uk Kim }
6621a39cfb0SJung-uk Kim 
6631a39cfb0SJung-uk Kim 
6641a39cfb0SJung-uk Kim /*******************************************************************************
6651a39cfb0SJung-uk Kim  *
6661a39cfb0SJung-uk Kim  * FUNCTION:    LkIsObjectUsed
6671a39cfb0SJung-uk Kim  *
6681a39cfb0SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
6691a39cfb0SJung-uk Kim  *
6701a39cfb0SJung-uk Kim  * RETURN:      Status
6711a39cfb0SJung-uk Kim  *
6721a39cfb0SJung-uk Kim  * DESCRIPTION: Check for an unreferenced namespace object and emit a warning.
6731a39cfb0SJung-uk Kim  *              We have to be careful, because some types and names are
6741a39cfb0SJung-uk Kim  *              typically or always unreferenced, we don't want to issue
6751a39cfb0SJung-uk Kim  *              excessive warnings.
6761a39cfb0SJung-uk Kim  *
6771a39cfb0SJung-uk Kim  ******************************************************************************/
6781a39cfb0SJung-uk Kim 
6791a39cfb0SJung-uk Kim static ACPI_STATUS
6801a39cfb0SJung-uk Kim LkIsObjectUsed (
6811a39cfb0SJung-uk Kim     ACPI_HANDLE             ObjHandle,
6821a39cfb0SJung-uk Kim     UINT32                  Level,
6831a39cfb0SJung-uk Kim     void                    *Context,
6841a39cfb0SJung-uk Kim     void                    **ReturnValue)
6851a39cfb0SJung-uk Kim {
6861a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
6871a39cfb0SJung-uk Kim 
6881a39cfb0SJung-uk Kim 
6891a39cfb0SJung-uk Kim     /* Referenced flag is set during the namespace xref */
6901a39cfb0SJung-uk Kim 
6911a39cfb0SJung-uk Kim     if (Node->Flags & ANOBJ_IS_REFERENCED)
6921a39cfb0SJung-uk Kim     {
6931a39cfb0SJung-uk Kim         return (AE_OK);
6941a39cfb0SJung-uk Kim     }
6951a39cfb0SJung-uk Kim 
6961a39cfb0SJung-uk Kim     /*
6971a39cfb0SJung-uk Kim      * Ignore names that start with an underscore,
6981a39cfb0SJung-uk Kim      * these are the reserved ACPI names and are typically not referenced,
6991a39cfb0SJung-uk Kim      * they are called by the host OS.
7001a39cfb0SJung-uk Kim      */
7011a39cfb0SJung-uk Kim     if (Node->Name.Ascii[0] == '_')
7021a39cfb0SJung-uk Kim     {
7031a39cfb0SJung-uk Kim         return (AE_OK);
7041a39cfb0SJung-uk Kim     }
7051a39cfb0SJung-uk Kim 
7061a39cfb0SJung-uk Kim     /* There are some types that are typically not referenced, ignore them */
7071a39cfb0SJung-uk Kim 
7081a39cfb0SJung-uk Kim     switch (Node->Type)
7091a39cfb0SJung-uk Kim     {
7101a39cfb0SJung-uk Kim     case ACPI_TYPE_DEVICE:
7111a39cfb0SJung-uk Kim     case ACPI_TYPE_PROCESSOR:
7121a39cfb0SJung-uk Kim     case ACPI_TYPE_POWER:
7131a39cfb0SJung-uk Kim     case ACPI_TYPE_LOCAL_RESOURCE:
7141a39cfb0SJung-uk Kim         return (AE_OK);
7151a39cfb0SJung-uk Kim 
7161a39cfb0SJung-uk Kim     default:
7171a39cfb0SJung-uk Kim         break;
7181a39cfb0SJung-uk Kim     }
7191a39cfb0SJung-uk Kim 
7201a39cfb0SJung-uk Kim     /* All others are valid unreferenced namespace objects */
7211a39cfb0SJung-uk Kim 
7221a39cfb0SJung-uk Kim     if (Node->Op)
7231a39cfb0SJung-uk Kim     {
7241a39cfb0SJung-uk Kim         AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL);
7251a39cfb0SJung-uk Kim     }
7261a39cfb0SJung-uk Kim     return (AE_OK);
7271a39cfb0SJung-uk Kim }
7281a39cfb0SJung-uk Kim 
7291a39cfb0SJung-uk Kim 
7301a39cfb0SJung-uk Kim /*******************************************************************************
7311a39cfb0SJung-uk Kim  *
7321a39cfb0SJung-uk Kim  * FUNCTION:    LkFindUnreferencedObjects
7331a39cfb0SJung-uk Kim  *
7341a39cfb0SJung-uk Kim  * PARAMETERS:  None
7351a39cfb0SJung-uk Kim  *
7361a39cfb0SJung-uk Kim  * RETURN:      None
7371a39cfb0SJung-uk Kim  *
7381a39cfb0SJung-uk Kim  * DESCRIPTION: Namespace walk to find objects that are not referenced in any
7391a39cfb0SJung-uk Kim  *              way. Must be called after the namespace has been cross
7401a39cfb0SJung-uk Kim  *              referenced.
7411a39cfb0SJung-uk Kim  *
7421a39cfb0SJung-uk Kim  ******************************************************************************/
7431a39cfb0SJung-uk Kim 
7441a39cfb0SJung-uk Kim void
7451a39cfb0SJung-uk Kim LkFindUnreferencedObjects (
7461a39cfb0SJung-uk Kim     void)
7471a39cfb0SJung-uk Kim {
7481a39cfb0SJung-uk Kim 
7491a39cfb0SJung-uk Kim     /* Walk entire namespace from the supplied root */
7501a39cfb0SJung-uk Kim 
7511a39cfb0SJung-uk Kim     (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
7522272d050SJung-uk Kim                 ACPI_UINT32_MAX, FALSE, LkIsObjectUsed, NULL,
7531a39cfb0SJung-uk Kim                 NULL, NULL);
7541a39cfb0SJung-uk Kim }
7551a39cfb0SJung-uk Kim 
7561a39cfb0SJung-uk Kim 
7571a39cfb0SJung-uk Kim /*******************************************************************************
7581a39cfb0SJung-uk Kim  *
75953289f6aSNate Lawson  * FUNCTION:    LkCrossReferenceNamespace
76053289f6aSNate Lawson  *
76153289f6aSNate Lawson  * PARAMETERS:  None
76253289f6aSNate Lawson  *
76353289f6aSNate Lawson  * RETURN:      Status
76453289f6aSNate Lawson  *
76553289f6aSNate Lawson  * DESCRIPTION: Perform a cross reference check of the parse tree against the
76653289f6aSNate Lawson  *              namespace.  Every named referenced within the parse tree
76753289f6aSNate Lawson  *              should be get resolved with a namespace lookup.  If not, the
76853289f6aSNate Lawson  *              original reference in the ASL code is invalid -- i.e., refers
76953289f6aSNate Lawson  *              to a non-existent object.
77053289f6aSNate Lawson  *
77153289f6aSNate Lawson  * NOTE:  The ASL "External" operator causes the name to be inserted into the
77253289f6aSNate Lawson  *        namespace so that references to the external name will be resolved
77353289f6aSNate Lawson  *        correctly here.
77453289f6aSNate Lawson  *
77553289f6aSNate Lawson  ******************************************************************************/
77653289f6aSNate Lawson 
77753289f6aSNate Lawson ACPI_STATUS
77853289f6aSNate Lawson LkCrossReferenceNamespace (
77953289f6aSNate Lawson     void)
78053289f6aSNate Lawson {
78153289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState;
78253289f6aSNate Lawson 
78353289f6aSNate Lawson 
78453289f6aSNate Lawson     DbgPrint (ASL_DEBUG_OUTPUT, "\nCross referencing namespace\n\n");
78553289f6aSNate Lawson 
78653289f6aSNate Lawson     /*
78753289f6aSNate Lawson      * Create a new walk state for use when looking up names
78853289f6aSNate Lawson      * within the namespace (Passed as context to the callbacks)
78953289f6aSNate Lawson      */
79053289f6aSNate Lawson     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
79153289f6aSNate Lawson     if (!WalkState)
79253289f6aSNate Lawson     {
79353289f6aSNate Lawson         return AE_NO_MEMORY;
79453289f6aSNate Lawson     }
79553289f6aSNate Lawson 
79653289f6aSNate Lawson     /* Walk the entire parse tree */
79753289f6aSNate Lawson 
79853289f6aSNate Lawson     TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE, LkNamespaceLocateBegin,
79953289f6aSNate Lawson                         LkNamespaceLocateEnd, WalkState);
80053289f6aSNate Lawson     return AE_OK;
80153289f6aSNate Lawson }
80253289f6aSNate Lawson 
80353289f6aSNate Lawson 
80453289f6aSNate Lawson /*******************************************************************************
80553289f6aSNate Lawson  *
80653289f6aSNate Lawson  * FUNCTION:    LkCheckFieldRange
80753289f6aSNate Lawson  *
80853289f6aSNate Lawson  * PARAMETERS:  RegionBitLength     - Length of entire parent region
80953289f6aSNate Lawson  *              FieldBitOffset      - Start of the field unit (within region)
81053289f6aSNate Lawson  *              FieldBitLength      - Entire length of field unit
81153289f6aSNate Lawson  *              AccessBitWidth      - Access width of the field unit
81253289f6aSNate Lawson  *
81353289f6aSNate Lawson  * RETURN:      None
81453289f6aSNate Lawson  *
81553289f6aSNate Lawson  * DESCRIPTION: Check one field unit to make sure it fits in the parent
81653289f6aSNate Lawson  *              op region.
81753289f6aSNate Lawson  *
81853289f6aSNate Lawson  * Note: AccessBitWidth must be either 8,16,32, or 64
81953289f6aSNate Lawson  *
82053289f6aSNate Lawson  ******************************************************************************/
82153289f6aSNate Lawson 
822fba7fc7eSJung-uk Kim static void
82353289f6aSNate Lawson LkCheckFieldRange (
82453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
82553289f6aSNate Lawson     UINT32                  RegionBitLength,
82653289f6aSNate Lawson     UINT32                  FieldBitOffset,
82753289f6aSNate Lawson     UINT32                  FieldBitLength,
82853289f6aSNate Lawson     UINT32                  AccessBitWidth)
82953289f6aSNate Lawson {
83053289f6aSNate Lawson     UINT32                  FieldEndBitOffset;
83153289f6aSNate Lawson 
832fba7fc7eSJung-uk Kim 
83353289f6aSNate Lawson     /*
83453289f6aSNate Lawson      * Check each field unit against the region size.  The entire
83553289f6aSNate Lawson      * field unit (start offset plus length) must fit within the
83653289f6aSNate Lawson      * region.
83753289f6aSNate Lawson      */
83853289f6aSNate Lawson     FieldEndBitOffset = FieldBitOffset + FieldBitLength;
83953289f6aSNate Lawson 
84053289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
84153289f6aSNate Lawson     {
84253289f6aSNate Lawson         /* Field definition itself is beyond the end-of-region */
84353289f6aSNate Lawson 
84453289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_OFFSET, Op, NULL);
84553289f6aSNate Lawson         return;
84653289f6aSNate Lawson     }
84753289f6aSNate Lawson 
84853289f6aSNate Lawson     /*
84953289f6aSNate Lawson      * Now check that the field plus AccessWidth doesn't go beyond
85053289f6aSNate Lawson      * the end-of-region.  Assumes AccessBitWidth is a power of 2
85153289f6aSNate Lawson      */
85253289f6aSNate Lawson     FieldEndBitOffset = ACPI_ROUND_UP (FieldEndBitOffset, AccessBitWidth);
85353289f6aSNate Lawson 
85453289f6aSNate Lawson     if (FieldEndBitOffset > RegionBitLength)
85553289f6aSNate Lawson     {
85653289f6aSNate Lawson         /* Field definition combined with the access is beyond EOR */
85753289f6aSNate Lawson 
85853289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_ACCESS_WIDTH, Op, NULL);
85953289f6aSNate Lawson     }
86053289f6aSNate Lawson }
86153289f6aSNate Lawson 
86253289f6aSNate Lawson /*******************************************************************************
86353289f6aSNate Lawson  *
86453289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateBegin
86553289f6aSNate Lawson  *
86653289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
86753289f6aSNate Lawson  *
86853289f6aSNate Lawson  * RETURN:      Status
86953289f6aSNate Lawson  *
87053289f6aSNate Lawson  * DESCRIPTION: Descending callback used during cross-reference.  For named
87153289f6aSNate Lawson  *              object references, attempt to locate the name in the
87253289f6aSNate Lawson  *              namespace.
87353289f6aSNate Lawson  *
87453289f6aSNate Lawson  * NOTE: ASL references to named fields within resource descriptors are
87553289f6aSNate Lawson  *       resolved to integer values here.  Therefore, this step is an
87653289f6aSNate Lawson  *       important part of the code generation.  We don't know that the
87753289f6aSNate Lawson  *       name refers to a resource descriptor until now.
87853289f6aSNate Lawson  *
87953289f6aSNate Lawson  ******************************************************************************/
88053289f6aSNate Lawson 
881fba7fc7eSJung-uk Kim static ACPI_STATUS
88253289f6aSNate Lawson LkNamespaceLocateBegin (
88353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
88453289f6aSNate Lawson     UINT32                  Level,
88553289f6aSNate Lawson     void                    *Context)
88653289f6aSNate Lawson {
88753289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
88853289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
88953289f6aSNate Lawson     ACPI_STATUS             Status;
89053289f6aSNate Lawson     ACPI_OBJECT_TYPE        ObjectType;
89153289f6aSNate Lawson     char                    *Path;
89253289f6aSNate Lawson     UINT8                   PassedArgs;
89353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NextOp;
89453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *OwningOp;
89553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *SpaceIdOp;
89653289f6aSNate Lawson     UINT32                  MinimumLength;
89753289f6aSNate Lawson     UINT32                  Temp;
89853289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
89953289f6aSNate Lawson     UINT32                  Flags;
90053289f6aSNate Lawson 
90153289f6aSNate Lawson 
9021a39cfb0SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (LkNamespaceLocateBegin, Op);
90353289f6aSNate Lawson 
90453289f6aSNate Lawson     /*
90553289f6aSNate Lawson      * If this node is the actual declaration of a name
90653289f6aSNate Lawson      * [such as the XXXX name in "Method (XXXX)"],
90753289f6aSNate Lawson      * we are not interested in it here.  We only care about names that are
90853289f6aSNate Lawson      * references to other objects within the namespace and the parent objects
90953289f6aSNate Lawson      * of name declarations
91053289f6aSNate Lawson      */
91153289f6aSNate Lawson     if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)
91253289f6aSNate Lawson     {
91353289f6aSNate Lawson         return (AE_OK);
91453289f6aSNate Lawson     }
91553289f6aSNate Lawson 
91653289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
91753289f6aSNate Lawson 
91853289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
91953289f6aSNate Lawson 
92053289f6aSNate Lawson     if ((!(OpInfo->Flags & AML_NAMED)) &&
92153289f6aSNate Lawson         (!(OpInfo->Flags & AML_CREATE)) &&
92253289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
92353289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_NAMESEG)    &&
92453289f6aSNate Lawson         (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
92553289f6aSNate Lawson     {
92653289f6aSNate Lawson         return (AE_OK);
92753289f6aSNate Lawson     }
92853289f6aSNate Lawson 
92953289f6aSNate Lawson     /*
930a9f12690SJung-uk Kim      * One special case: CondRefOf operator - we don't care if the name exists
931a9f12690SJung-uk Kim      * or not at this point, just ignore it, the point of the operator is to
932a9f12690SJung-uk Kim      * determine if the name exists at runtime.
933a9f12690SJung-uk Kim      */
934a9f12690SJung-uk Kim     if ((Op->Asl.Parent) &&
935a9f12690SJung-uk Kim         (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
936a9f12690SJung-uk Kim     {
937a9f12690SJung-uk Kim         return (AE_OK);
938a9f12690SJung-uk Kim     }
939a9f12690SJung-uk Kim 
940a9f12690SJung-uk Kim     /*
94153289f6aSNate Lawson      * We must enable the "search-to-root" for single NameSegs, but
94253289f6aSNate Lawson      * we have to be very careful about opening up scopes
94353289f6aSNate Lawson      */
94453289f6aSNate Lawson     Flags = ACPI_NS_SEARCH_PARENT;
94553289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
94653289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
94753289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
94853289f6aSNate Lawson     {
94953289f6aSNate Lawson         /*
95053289f6aSNate Lawson          * These are name references, do not push the scope stack
95153289f6aSNate Lawson          * for them.
95253289f6aSNate Lawson          */
95353289f6aSNate Lawson         Flags |= ACPI_NS_DONT_OPEN_SCOPE;
95453289f6aSNate Lawson     }
95553289f6aSNate Lawson 
95653289f6aSNate Lawson     /* Get the NamePath from the appropriate place */
95753289f6aSNate Lawson 
95853289f6aSNate Lawson     if (OpInfo->Flags & AML_NAMED)
95953289f6aSNate Lawson     {
9601a39cfb0SJung-uk Kim         /* For nearly all NAMED operators, the name reference is the first child */
96153289f6aSNate Lawson 
96253289f6aSNate Lawson         Path = Op->Asl.Child->Asl.Value.String;
96353289f6aSNate Lawson         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
96453289f6aSNate Lawson         {
96553289f6aSNate Lawson             /*
96653289f6aSNate Lawson              * ALIAS is the only oddball opcode, the name declaration
96753289f6aSNate Lawson              * (alias name) is the second operand
96853289f6aSNate Lawson              */
96953289f6aSNate Lawson             Path = Op->Asl.Child->Asl.Next->Asl.Value.String;
97053289f6aSNate Lawson         }
97153289f6aSNate Lawson     }
97253289f6aSNate Lawson     else if (OpInfo->Flags & AML_CREATE)
97353289f6aSNate Lawson     {
97453289f6aSNate Lawson         /* Name must appear as the last parameter */
97553289f6aSNate Lawson 
97653289f6aSNate Lawson         NextOp = Op->Asl.Child;
97753289f6aSNate Lawson         while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
97853289f6aSNate Lawson         {
97953289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
98053289f6aSNate Lawson         }
98153289f6aSNate Lawson         Path = NextOp->Asl.Value.String;
98253289f6aSNate Lawson     }
98353289f6aSNate Lawson     else
98453289f6aSNate Lawson     {
98553289f6aSNate Lawson         Path = Op->Asl.Value.String;
98653289f6aSNate Lawson     }
98753289f6aSNate Lawson 
98853289f6aSNate Lawson     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
989fba7fc7eSJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
990fba7fc7eSJung-uk Kim         "Type=%s\n", AcpiUtGetTypeName (ObjectType)));
99153289f6aSNate Lawson 
99253289f6aSNate Lawson     /*
99353289f6aSNate Lawson      * Lookup the name in the namespace.  Name must exist at this point, or it
99453289f6aSNate Lawson      * is an invalid reference.
99553289f6aSNate Lawson      *
99653289f6aSNate Lawson      * The namespace is also used as a lookup table for references to resource
99753289f6aSNate Lawson      * descriptors and the fields within them.
99853289f6aSNate Lawson      */
99953289f6aSNate Lawson     Gbl_NsLookupCount++;
100053289f6aSNate Lawson 
100153289f6aSNate Lawson     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
100253289f6aSNate Lawson                 ACPI_IMODE_EXECUTE, Flags, WalkState, &(Node));
100353289f6aSNate Lawson     if (ACPI_FAILURE (Status))
100453289f6aSNate Lawson     {
100553289f6aSNate Lawson         if (Status == AE_NOT_FOUND)
100653289f6aSNate Lawson         {
100753289f6aSNate Lawson             /*
100853289f6aSNate Lawson              * We didn't find the name reference by path -- we can qualify this
100953289f6aSNate Lawson              * a little better before we print an error message
101053289f6aSNate Lawson              */
101153289f6aSNate Lawson             if (strlen (Path) == ACPI_NAME_SIZE)
101253289f6aSNate Lawson             {
101353289f6aSNate Lawson                 /* A simple, one-segment ACPI name */
101453289f6aSNate Lawson 
101553289f6aSNate Lawson                 if (LkObjectExists (Path))
101653289f6aSNate Lawson                 {
1017fba7fc7eSJung-uk Kim                     /*
1018fba7fc7eSJung-uk Kim                      * There exists such a name, but we couldn't get to it
1019fba7fc7eSJung-uk Kim                      * from this scope
1020fba7fc7eSJung-uk Kim                      */
1021fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_REACHABLE, Op,
1022fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
102353289f6aSNate Lawson                 }
102453289f6aSNate Lawson                 else
102553289f6aSNate Lawson                 {
102653289f6aSNate Lawson                     /* The name doesn't exist, period */
102753289f6aSNate Lawson 
1028fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST,
1029fba7fc7eSJung-uk Kim                         Op, Op->Asl.ExternalName);
103053289f6aSNate Lawson                 }
103153289f6aSNate Lawson             }
103253289f6aSNate Lawson             else
103353289f6aSNate Lawson             {
103453289f6aSNate Lawson                 /* Check for a fully qualified path */
103553289f6aSNate Lawson 
103653289f6aSNate Lawson                 if (Path[0] == AML_ROOT_PREFIX)
103753289f6aSNate Lawson                 {
103853289f6aSNate Lawson                     /* Gave full path, the object does not exist */
103953289f6aSNate Lawson 
1040fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op,
1041fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
104253289f6aSNate Lawson                 }
104353289f6aSNate Lawson                 else
104453289f6aSNate Lawson                 {
1045fba7fc7eSJung-uk Kim                     /*
1046fba7fc7eSJung-uk Kim                      * We can't tell whether it doesn't exist or just
1047fba7fc7eSJung-uk Kim                      * can't be reached.
1048fba7fc7eSJung-uk Kim                      */
1049fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
1050fba7fc7eSJung-uk Kim                         Op->Asl.ExternalName);
105153289f6aSNate Lawson                 }
105253289f6aSNate Lawson             }
105353289f6aSNate Lawson 
105453289f6aSNate Lawson             Status = AE_OK;
105553289f6aSNate Lawson         }
105653289f6aSNate Lawson         return (Status);
105753289f6aSNate Lawson     }
105853289f6aSNate Lawson 
10591a39cfb0SJung-uk Kim     /* Check for a reference vs. name declaration */
10601a39cfb0SJung-uk Kim 
10611a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
10621a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
10631a39cfb0SJung-uk Kim     {
10641a39cfb0SJung-uk Kim         /* This node has been referenced, mark it for reference check */
10651a39cfb0SJung-uk Kim 
10661a39cfb0SJung-uk Kim         Node->Flags |= ANOBJ_IS_REFERENCED;
10671a39cfb0SJung-uk Kim     }
10681a39cfb0SJung-uk Kim 
106953289f6aSNate Lawson     /* Attempt to optimize the NamePath */
107053289f6aSNate Lawson 
107153289f6aSNate Lawson     OptOptimizeNamePath (Op, OpInfo->Flags, WalkState, Path, Node);
107253289f6aSNate Lawson 
107353289f6aSNate Lawson     /*
10741a39cfb0SJung-uk Kim      * 1) Dereference an alias (A name reference that is an alias)
10751a39cfb0SJung-uk Kim      *    Aliases are not nested, the alias always points to the final object
107653289f6aSNate Lawson      */
1077fba7fc7eSJung-uk Kim     if ((Op->Asl.ParseOpcode != PARSEOP_ALIAS) &&
1078fba7fc7eSJung-uk Kim         (Node->Type == ACPI_TYPE_LOCAL_ALIAS))
107953289f6aSNate Lawson     {
108053289f6aSNate Lawson         /* This node points back to the original PARSEOP_ALIAS */
108153289f6aSNate Lawson 
1082fba7fc7eSJung-uk Kim         NextOp = Node->Op;
108353289f6aSNate Lawson 
108453289f6aSNate Lawson         /* The first child is the alias target op */
108553289f6aSNate Lawson 
108653289f6aSNate Lawson         NextOp = NextOp->Asl.Child;
108753289f6aSNate Lawson 
10881a39cfb0SJung-uk Kim         /* That in turn points back to original target alias node */
108953289f6aSNate Lawson 
109053289f6aSNate Lawson         if (NextOp->Asl.Node)
109153289f6aSNate Lawson         {
109253289f6aSNate Lawson             Node = NextOp->Asl.Node;
109353289f6aSNate Lawson         }
10941a39cfb0SJung-uk Kim 
10951a39cfb0SJung-uk Kim         /* Else - forward reference to alias, will be resolved later */
109653289f6aSNate Lawson     }
109753289f6aSNate Lawson 
10981a39cfb0SJung-uk Kim     /* 2) Check for a reference to a resource descriptor */
109953289f6aSNate Lawson 
11001a39cfb0SJung-uk Kim     if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
110153289f6aSNate Lawson              (Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
110253289f6aSNate Lawson     {
110353289f6aSNate Lawson         /*
110453289f6aSNate Lawson          * This was a reference to a field within a resource descriptor.  Extract
110553289f6aSNate Lawson          * the associated field offset (either a bit or byte offset depending on
110653289f6aSNate Lawson          * the field type) and change the named reference into an integer for
110753289f6aSNate Lawson          * AML code generation
110853289f6aSNate Lawson          */
1109fba7fc7eSJung-uk Kim         Temp = Node->Value;
111053289f6aSNate Lawson         if (Node->Flags & ANOBJ_IS_BIT_OFFSET)
111153289f6aSNate Lawson         {
111253289f6aSNate Lawson             Op->Asl.CompileFlags |= NODE_IS_BIT_OFFSET;
111353289f6aSNate Lawson         }
111453289f6aSNate Lawson 
111553289f6aSNate Lawson         /* Perform BitOffset <--> ByteOffset conversion if necessary */
111653289f6aSNate Lawson 
111753289f6aSNate Lawson         switch (Op->Asl.Parent->Asl.AmlOpcode)
111853289f6aSNate Lawson         {
111953289f6aSNate Lawson         case AML_CREATE_FIELD_OP:
112053289f6aSNate Lawson 
112153289f6aSNate Lawson             /* We allow a Byte offset to Bit Offset conversion for this op */
112253289f6aSNate Lawson 
112353289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
112453289f6aSNate Lawson             {
112553289f6aSNate Lawson                 /* Simply multiply byte offset times 8 to get bit offset */
112653289f6aSNate Lawson 
112753289f6aSNate Lawson                 Temp = ACPI_MUL_8 (Temp);
112853289f6aSNate Lawson             }
112953289f6aSNate Lawson             break;
113053289f6aSNate Lawson 
113153289f6aSNate Lawson 
113253289f6aSNate Lawson         case AML_CREATE_BIT_FIELD_OP:
113353289f6aSNate Lawson 
113453289f6aSNate Lawson             /* This op requires a Bit Offset */
113553289f6aSNate Lawson 
113653289f6aSNate Lawson             if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
113753289f6aSNate Lawson             {
113853289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BYTES_TO_BITS, Op, NULL);
113953289f6aSNate Lawson             }
114053289f6aSNate Lawson             break;
114153289f6aSNate Lawson 
114253289f6aSNate Lawson 
114353289f6aSNate Lawson         case AML_CREATE_BYTE_FIELD_OP:
114453289f6aSNate Lawson         case AML_CREATE_WORD_FIELD_OP:
114553289f6aSNate Lawson         case AML_CREATE_DWORD_FIELD_OP:
114653289f6aSNate Lawson         case AML_CREATE_QWORD_FIELD_OP:
114753289f6aSNate Lawson         case AML_INDEX_OP:
114853289f6aSNate Lawson 
114953289f6aSNate Lawson             /* These Ops require Byte offsets */
115053289f6aSNate Lawson 
115153289f6aSNate Lawson             if (Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)
115253289f6aSNate Lawson             {
115353289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_BITS_TO_BYTES, Op, NULL);
115453289f6aSNate Lawson             }
115553289f6aSNate Lawson             break;
115653289f6aSNate Lawson 
115753289f6aSNate Lawson 
115853289f6aSNate Lawson         default:
115953289f6aSNate Lawson             /* Nothing to do for other opcodes */
116053289f6aSNate Lawson             break;
116153289f6aSNate Lawson         }
116253289f6aSNate Lawson 
116353289f6aSNate Lawson         /* Now convert this node to an integer whose value is the field offset */
116453289f6aSNate Lawson 
1165fba7fc7eSJung-uk Kim         Op->Asl.AmlLength       = 0;
116653289f6aSNate Lawson         Op->Asl.ParseOpcode     = PARSEOP_INTEGER;
116753289f6aSNate Lawson         Op->Asl.Value.Integer   = (UINT64) Temp;
116853289f6aSNate Lawson         Op->Asl.CompileFlags   |= NODE_IS_RESOURCE_FIELD;
116953289f6aSNate Lawson 
117053289f6aSNate Lawson         OpcGenerateAmlOpcode (Op);
117153289f6aSNate Lawson     }
117253289f6aSNate Lawson 
11731a39cfb0SJung-uk Kim     /* 3) Check for a method invocation */
117453289f6aSNate Lawson 
117553289f6aSNate Lawson     else if ((((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)) &&
117653289f6aSNate Lawson                 (Node->Type == ACPI_TYPE_METHOD) &&
117753289f6aSNate Lawson                 (Op->Asl.Parent) &&
117853289f6aSNate Lawson                 (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_METHOD))   ||
117953289f6aSNate Lawson 
118053289f6aSNate Lawson                 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
118153289f6aSNate Lawson     {
118253289f6aSNate Lawson 
118353289f6aSNate Lawson         /*
1184fba7fc7eSJung-uk Kim          * A reference to a method within one of these opcodes is not an
1185fba7fc7eSJung-uk Kim          * invocation of the method, it is simply a reference to the method.
1186fba7fc7eSJung-uk Kim          */
1187fba7fc7eSJung-uk Kim         if ((Op->Asl.Parent) &&
1188fba7fc7eSJung-uk Kim            ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF)      ||
1189fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF)    ||
1190fba7fc7eSJung-uk Kim             (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE)))
1191fba7fc7eSJung-uk Kim         {
1192fba7fc7eSJung-uk Kim             return (AE_OK);
1193fba7fc7eSJung-uk Kim         }
1194fba7fc7eSJung-uk Kim         /*
119553289f6aSNate Lawson          * There are two types of method invocation:
1196fba7fc7eSJung-uk Kim          * 1) Invocation with arguments -- the parser recognizes this
1197fba7fc7eSJung-uk Kim          *    as a METHODCALL.
1198fba7fc7eSJung-uk Kim          * 2) Invocation with no arguments --the parser cannot determine that
1199fba7fc7eSJung-uk Kim          *    this is a method invocation, therefore we have to figure it out
1200fba7fc7eSJung-uk Kim          *    here.
120153289f6aSNate Lawson          */
120253289f6aSNate Lawson         if (Node->Type != ACPI_TYPE_METHOD)
120353289f6aSNate Lawson         {
1204fba7fc7eSJung-uk Kim             sprintf (MsgBuffer, "%s is a %s",
1205fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
120653289f6aSNate Lawson 
120753289f6aSNate Lawson             AslError (ASL_ERROR, ASL_MSG_NOT_METHOD, Op, MsgBuffer);
120853289f6aSNate Lawson             return (AE_OK);
120953289f6aSNate Lawson         }
121053289f6aSNate Lawson 
121153289f6aSNate Lawson         /* Save the method node in the caller's op */
121253289f6aSNate Lawson 
121353289f6aSNate Lawson         Op->Asl.Node = Node;
121453289f6aSNate Lawson         if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF)
121553289f6aSNate Lawson         {
121653289f6aSNate Lawson             return (AE_OK);
121753289f6aSNate Lawson         }
121853289f6aSNate Lawson 
121953289f6aSNate Lawson         /*
122053289f6aSNate Lawson          * This is a method invocation, with or without arguments.
122153289f6aSNate Lawson          * Count the number of arguments, each appears as a child
122253289f6aSNate Lawson          * under the parent node
122353289f6aSNate Lawson          */
122453289f6aSNate Lawson         Op->Asl.ParseOpcode = PARSEOP_METHODCALL;
122553289f6aSNate Lawson         UtSetParseOpName (Op);
122653289f6aSNate Lawson 
122753289f6aSNate Lawson         PassedArgs = 0;
122853289f6aSNate Lawson         NextOp     = Op->Asl.Child;
122953289f6aSNate Lawson 
123053289f6aSNate Lawson         while (NextOp)
123153289f6aSNate Lawson         {
123253289f6aSNate Lawson             PassedArgs++;
123353289f6aSNate Lawson             NextOp = NextOp->Asl.Next;
123453289f6aSNate Lawson         }
123553289f6aSNate Lawson 
1236fba7fc7eSJung-uk Kim         if (Node->Value != ASL_EXTERNAL_METHOD)
123753289f6aSNate Lawson         {
123853289f6aSNate Lawson             /*
123953289f6aSNate Lawson              * Check the parsed arguments with the number expected by the
124053289f6aSNate Lawson              * method declaration itself
124153289f6aSNate Lawson              */
1242fba7fc7eSJung-uk Kim             if (PassedArgs != Node->Value)
124353289f6aSNate Lawson             {
1244a88e22b7SJung-uk Kim                 sprintf (MsgBuffer, "%s requires %u", Op->Asl.ExternalName,
1245fba7fc7eSJung-uk Kim                             Node->Value);
124653289f6aSNate Lawson 
1247fba7fc7eSJung-uk Kim                 if (PassedArgs < Node->Value)
124853289f6aSNate Lawson                 {
124953289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_LO, Op, MsgBuffer);
125053289f6aSNate Lawson                 }
125153289f6aSNate Lawson                 else
125253289f6aSNate Lawson                 {
125353289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_HI, Op, MsgBuffer);
125453289f6aSNate Lawson                 }
125553289f6aSNate Lawson             }
125653289f6aSNate Lawson         }
125753289f6aSNate Lawson     }
125853289f6aSNate Lawson 
12591a39cfb0SJung-uk Kim     /* 4) Check for an ASL Field definition */
1260fba7fc7eSJung-uk Kim 
126153289f6aSNate Lawson     else if ((Op->Asl.Parent) &&
126253289f6aSNate Lawson             ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_FIELD)     ||
126353289f6aSNate Lawson              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_BANKFIELD)))
126453289f6aSNate Lawson     {
126553289f6aSNate Lawson         /*
126653289f6aSNate Lawson          * Offset checking for fields.  If the parent operation region has a
126753289f6aSNate Lawson          * constant length (known at compile time), we can check fields
126853289f6aSNate Lawson          * defined in that region against the region length.  This will catch
126953289f6aSNate Lawson          * fields and field units that cannot possibly fit within the region.
127053289f6aSNate Lawson          *
127153289f6aSNate Lawson          * Note: Index fields do not directly reference an operation region,
127253289f6aSNate Lawson          * thus they are not included in this check.
127353289f6aSNate Lawson          */
127453289f6aSNate Lawson         if (Op == Op->Asl.Parent->Asl.Child)
127553289f6aSNate Lawson         {
127653289f6aSNate Lawson             /*
127753289f6aSNate Lawson              * This is the first child of the field node, which is
127853289f6aSNate Lawson              * the name of the region.  Get the parse node for the
127953289f6aSNate Lawson              * region -- which contains the length of the region.
128053289f6aSNate Lawson              */
1281fba7fc7eSJung-uk Kim             OwningOp = Node->Op;
1282fba7fc7eSJung-uk Kim             Op->Asl.Parent->Asl.ExtraValue =
1283fba7fc7eSJung-uk Kim                 ACPI_MUL_8 ((UINT32) OwningOp->Asl.Value.Integer);
128453289f6aSNate Lawson 
128553289f6aSNate Lawson             /* Examine the field access width */
128653289f6aSNate Lawson 
128753289f6aSNate Lawson             switch ((UINT8) Op->Asl.Parent->Asl.Value.Integer)
128853289f6aSNate Lawson             {
128953289f6aSNate Lawson             case AML_FIELD_ACCESS_ANY:
129053289f6aSNate Lawson             case AML_FIELD_ACCESS_BYTE:
129153289f6aSNate Lawson             case AML_FIELD_ACCESS_BUFFER:
129253289f6aSNate Lawson             default:
129353289f6aSNate Lawson                 MinimumLength = 1;
129453289f6aSNate Lawson                 break;
129553289f6aSNate Lawson 
129653289f6aSNate Lawson             case AML_FIELD_ACCESS_WORD:
129753289f6aSNate Lawson                 MinimumLength = 2;
129853289f6aSNate Lawson                 break;
129953289f6aSNate Lawson 
130053289f6aSNate Lawson             case AML_FIELD_ACCESS_DWORD:
130153289f6aSNate Lawson                 MinimumLength = 4;
130253289f6aSNate Lawson                 break;
130353289f6aSNate Lawson 
130453289f6aSNate Lawson             case AML_FIELD_ACCESS_QWORD:
130553289f6aSNate Lawson                 MinimumLength = 8;
130653289f6aSNate Lawson                 break;
130753289f6aSNate Lawson             }
130853289f6aSNate Lawson 
130953289f6aSNate Lawson             /*
131053289f6aSNate Lawson              * Is the region at least as big as the access width?
131153289f6aSNate Lawson              * Note: DataTableRegions have 0 length
131253289f6aSNate Lawson              */
131353289f6aSNate Lawson             if (((UINT32) OwningOp->Asl.Value.Integer) &&
131453289f6aSNate Lawson                 ((UINT32) OwningOp->Asl.Value.Integer < MinimumLength))
131553289f6aSNate Lawson             {
131653289f6aSNate Lawson                 AslError (ASL_ERROR, ASL_MSG_FIELD_ACCESS_WIDTH, Op, NULL);
131753289f6aSNate Lawson             }
131853289f6aSNate Lawson 
131953289f6aSNate Lawson             /*
132053289f6aSNate Lawson              * Check EC/CMOS/SMBUS fields to make sure that the correct
132153289f6aSNate Lawson              * access type is used (BYTE for EC/CMOS, BUFFER for SMBUS)
132253289f6aSNate Lawson              */
132353289f6aSNate Lawson             SpaceIdOp = OwningOp->Asl.Child->Asl.Next;
132453289f6aSNate Lawson             switch ((UINT32) SpaceIdOp->Asl.Value.Integer)
132553289f6aSNate Lawson             {
132653289f6aSNate Lawson             case REGION_EC:
132753289f6aSNate Lawson             case REGION_CMOS:
132853289f6aSNate Lawson 
132953289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BYTE)
133053289f6aSNate Lawson                 {
133153289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BYTE_ACCESS, Op, NULL);
133253289f6aSNate Lawson                 }
133353289f6aSNate Lawson                 break;
133453289f6aSNate Lawson 
133553289f6aSNate Lawson             case REGION_SMBUS:
1336d6dd1baeSJung-uk Kim             case REGION_IPMI:
133753289f6aSNate Lawson 
133853289f6aSNate Lawson                 if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BUFFER)
133953289f6aSNate Lawson                 {
134053289f6aSNate Lawson                     AslError (ASL_ERROR, ASL_MSG_REGION_BUFFER_ACCESS, Op, NULL);
134153289f6aSNate Lawson                 }
134253289f6aSNate Lawson                 break;
134353289f6aSNate Lawson 
134453289f6aSNate Lawson             default:
134553289f6aSNate Lawson 
134653289f6aSNate Lawson                 /* Nothing to do for other address spaces */
134753289f6aSNate Lawson                 break;
134853289f6aSNate Lawson             }
134953289f6aSNate Lawson         }
135053289f6aSNate Lawson         else
135153289f6aSNate Lawson         {
135253289f6aSNate Lawson             /*
135353289f6aSNate Lawson              * This is one element of the field list.  Check to make sure
135453289f6aSNate Lawson              * that it does not go beyond the end of the parent operation region.
135553289f6aSNate Lawson              *
135653289f6aSNate Lawson              * In the code below:
135753289f6aSNate Lawson              *    Op->Asl.Parent->Asl.ExtraValue      - Region Length (bits)
135853289f6aSNate Lawson              *    Op->Asl.ExtraValue                  - Field start offset (bits)
135953289f6aSNate Lawson              *    Op->Asl.Child->Asl.Value.Integer32  - Field length (bits)
136053289f6aSNate Lawson              *    Op->Asl.Child->Asl.ExtraValue       - Field access width (bits)
136153289f6aSNate Lawson              */
136253289f6aSNate Lawson             if (Op->Asl.Parent->Asl.ExtraValue && Op->Asl.Child)
136353289f6aSNate Lawson             {
136453289f6aSNate Lawson                 LkCheckFieldRange (Op,
136553289f6aSNate Lawson                             Op->Asl.Parent->Asl.ExtraValue,
136653289f6aSNate Lawson                             Op->Asl.ExtraValue,
136753289f6aSNate Lawson                             (UINT32) Op->Asl.Child->Asl.Value.Integer,
136853289f6aSNate Lawson                             Op->Asl.Child->Asl.ExtraValue);
136953289f6aSNate Lawson             }
137053289f6aSNate Lawson         }
137153289f6aSNate Lawson     }
137253289f6aSNate Lawson 
137353289f6aSNate Lawson     Op->Asl.Node = Node;
137453289f6aSNate Lawson     return (Status);
137553289f6aSNate Lawson }
137653289f6aSNate Lawson 
137753289f6aSNate Lawson 
137853289f6aSNate Lawson /*******************************************************************************
137953289f6aSNate Lawson  *
138053289f6aSNate Lawson  * FUNCTION:    LkNamespaceLocateEnd
138153289f6aSNate Lawson  *
138253289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
138353289f6aSNate Lawson  *
138453289f6aSNate Lawson  * RETURN:      Status
138553289f6aSNate Lawson  *
138653289f6aSNate Lawson  * DESCRIPTION: Ascending callback used during cross reference.  We only
138753289f6aSNate Lawson  *              need to worry about scope management here.
138853289f6aSNate Lawson  *
138953289f6aSNate Lawson  ******************************************************************************/
139053289f6aSNate Lawson 
1391fba7fc7eSJung-uk Kim static ACPI_STATUS
139253289f6aSNate Lawson LkNamespaceLocateEnd (
139353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
139453289f6aSNate Lawson     UINT32                  Level,
139553289f6aSNate Lawson     void                    *Context)
139653289f6aSNate Lawson {
139753289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
139853289f6aSNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
139953289f6aSNate Lawson 
140053289f6aSNate Lawson 
14011a39cfb0SJung-uk Kim     ACPI_FUNCTION_TRACE (LkNamespaceLocateEnd);
140253289f6aSNate Lawson 
140353289f6aSNate Lawson 
140453289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
140553289f6aSNate Lawson 
140653289f6aSNate Lawson     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
140753289f6aSNate Lawson     if (!(OpInfo->Flags & AML_NAMED))
140853289f6aSNate Lawson     {
140953289f6aSNate Lawson         return (AE_OK);
141053289f6aSNate Lawson     }
141153289f6aSNate Lawson 
141253289f6aSNate Lawson     /* Not interested in name references, we did not open a scope for them */
141353289f6aSNate Lawson 
141453289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
141553289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
141653289f6aSNate Lawson         (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
141753289f6aSNate Lawson     {
141853289f6aSNate Lawson         return (AE_OK);
141953289f6aSNate Lawson     }
142053289f6aSNate Lawson 
142153289f6aSNate Lawson     /* Pop the scope stack if necessary */
142253289f6aSNate Lawson 
142353289f6aSNate Lawson     if (AcpiNsOpensScope (AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode)))
142453289f6aSNate Lawson     {
142553289f6aSNate Lawson 
142653289f6aSNate Lawson         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
142753289f6aSNate Lawson             "%s: Popping scope for Op %p\n",
142853289f6aSNate Lawson             AcpiUtGetTypeName (OpInfo->ObjectType), Op));
142953289f6aSNate Lawson 
1430fba7fc7eSJung-uk Kim         (void) AcpiDsScopeStackPop (WalkState);
143153289f6aSNate Lawson     }
143253289f6aSNate Lawson 
143353289f6aSNate Lawson     return (AE_OK);
143453289f6aSNate Lawson }
143553289f6aSNate Lawson 
143653289f6aSNate Lawson 
1437