xref: /freebsd/sys/contrib/dev/acpica/compiler/aslexternal.c (revision 1cc50d6b6a02d2c48cb9b812432a492d284c6dd1)
1f8146b88SJung-uk Kim /******************************************************************************
2f8146b88SJung-uk Kim  *
3f8146b88SJung-uk Kim  * Module Name: aslexternal - ASL External opcode compiler support
4f8146b88SJung-uk Kim  *
5f8146b88SJung-uk Kim  *****************************************************************************/
6f8146b88SJung-uk Kim 
7f8146b88SJung-uk Kim /*
8f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
9f8146b88SJung-uk Kim  * All rights reserved.
10f8146b88SJung-uk Kim  *
11f8146b88SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12f8146b88SJung-uk Kim  * modification, are permitted provided that the following conditions
13f8146b88SJung-uk Kim  * are met:
14f8146b88SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15f8146b88SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16f8146b88SJung-uk Kim  *    without modification.
17f8146b88SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18f8146b88SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19f8146b88SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20f8146b88SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21f8146b88SJung-uk Kim  *    binary redistribution.
22f8146b88SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23f8146b88SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24f8146b88SJung-uk Kim  *    from this software without specific prior written permission.
25f8146b88SJung-uk Kim  *
26f8146b88SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27f8146b88SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28f8146b88SJung-uk Kim  * Software Foundation.
29f8146b88SJung-uk Kim  *
30f8146b88SJung-uk Kim  * NO WARRANTY
31f8146b88SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32f8146b88SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33f8146b88SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34f8146b88SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35f8146b88SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36f8146b88SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37f8146b88SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38f8146b88SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39f8146b88SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40f8146b88SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41f8146b88SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42f8146b88SJung-uk Kim  */
43f8146b88SJung-uk Kim 
44f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
45f8146b88SJung-uk Kim #include "aslcompiler.y.h"
46f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
47f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
48f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
49f8146b88SJung-uk Kim 
50f8146b88SJung-uk Kim 
51f8146b88SJung-uk Kim #define _COMPONENT          ACPI_COMPILER
52f8146b88SJung-uk Kim         ACPI_MODULE_NAME    ("aslexternal")
53f8146b88SJung-uk Kim 
54f8146b88SJung-uk Kim 
55f8146b88SJung-uk Kim /* Local prototypes */
56f8146b88SJung-uk Kim 
57f8146b88SJung-uk Kim static void
58f8146b88SJung-uk Kim ExInsertArgCount (
59f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
60f8146b88SJung-uk Kim 
61f8146b88SJung-uk Kim static void
62f8146b88SJung-uk Kim ExMoveExternals (
63f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *DefinitionBlockOp);
64f8146b88SJung-uk Kim 
65f8146b88SJung-uk Kim 
66f8146b88SJung-uk Kim /*******************************************************************************
67f8146b88SJung-uk Kim  *
68f8146b88SJung-uk Kim  * FUNCTION:    ExDoExternal
69f8146b88SJung-uk Kim  *
70f8146b88SJung-uk Kim  * PARAMETERS:  Op                  - Current Parse node
71f8146b88SJung-uk Kim  *
72f8146b88SJung-uk Kim  * RETURN:      None
73f8146b88SJung-uk Kim  *
74f8146b88SJung-uk Kim  * DESCRIPTION: Add an External() definition to the global list. This list
75f8146b88SJung-uk Kim  *              is used to generate External opcodes.
76f8146b88SJung-uk Kim  *
77f8146b88SJung-uk Kim  ******************************************************************************/
78f8146b88SJung-uk Kim 
79f8146b88SJung-uk Kim void
80f8146b88SJung-uk Kim ExDoExternal (
81f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
82f8146b88SJung-uk Kim {
83f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ListOp;
84f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Prev;
85f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Next;
86f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ArgCountOp;
87f8146b88SJung-uk Kim 
88f8146b88SJung-uk Kim 
89f8146b88SJung-uk Kim     ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
90f8146b88SJung-uk Kim     ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
91f8146b88SJung-uk Kim     ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
92f8146b88SJung-uk Kim     ArgCountOp->Asl.Value.Integer = 0;
93f8146b88SJung-uk Kim     UtSetParseOpName (ArgCountOp);
94f8146b88SJung-uk Kim 
95f8146b88SJung-uk Kim     /* Create new list node of arbitrary type */
96f8146b88SJung-uk Kim 
97f8146b88SJung-uk Kim     ListOp = TrAllocateNode (PARSEOP_DEFAULT_ARG);
98f8146b88SJung-uk Kim 
99f8146b88SJung-uk Kim     /* Store External node as child */
100f8146b88SJung-uk Kim 
101f8146b88SJung-uk Kim     ListOp->Asl.Child = Op;
102f8146b88SJung-uk Kim     ListOp->Asl.Next = NULL;
103f8146b88SJung-uk Kim 
104f8146b88SJung-uk Kim     if (Gbl_ExternalsListHead)
105f8146b88SJung-uk Kim     {
106f8146b88SJung-uk Kim         /* Link new External to end of list */
107f8146b88SJung-uk Kim 
108f8146b88SJung-uk Kim         Prev = Gbl_ExternalsListHead;
109f8146b88SJung-uk Kim         Next = Prev;
110f8146b88SJung-uk Kim         while (Next)
111f8146b88SJung-uk Kim         {
112f8146b88SJung-uk Kim             Prev = Next;
113f8146b88SJung-uk Kim             Next = Next->Asl.Next;
114f8146b88SJung-uk Kim         }
115f8146b88SJung-uk Kim 
116f8146b88SJung-uk Kim         Prev->Asl.Next = ListOp;
117f8146b88SJung-uk Kim     }
118f8146b88SJung-uk Kim     else
119f8146b88SJung-uk Kim     {
120f8146b88SJung-uk Kim         Gbl_ExternalsListHead = ListOp;
121f8146b88SJung-uk Kim     }
122f8146b88SJung-uk Kim }
123f8146b88SJung-uk Kim 
124f8146b88SJung-uk Kim 
125f8146b88SJung-uk Kim /*******************************************************************************
126f8146b88SJung-uk Kim  *
127f8146b88SJung-uk Kim  * FUNCTION:    ExInsertArgCount
128f8146b88SJung-uk Kim  *
129f8146b88SJung-uk Kim  * PARAMETERS:  Op              - Op for a method invocation
130f8146b88SJung-uk Kim  *
131f8146b88SJung-uk Kim  * RETURN:      None
132f8146b88SJung-uk Kim  *
133f8146b88SJung-uk Kim  * DESCRIPTION: Obtain the number of arguments for a control method -- from
134f8146b88SJung-uk Kim  *              the actual invocation.
135f8146b88SJung-uk Kim  *
136f8146b88SJung-uk Kim  ******************************************************************************/
137f8146b88SJung-uk Kim 
138f8146b88SJung-uk Kim static void
139f8146b88SJung-uk Kim ExInsertArgCount (
140f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
141f8146b88SJung-uk Kim {
142f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Next;
143f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *NameOp;
144f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Child;
145f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ArgCountOp;
146f8146b88SJung-uk Kim     char *                  ExternalName;
147f8146b88SJung-uk Kim     char *                  CallName;
148f8146b88SJung-uk Kim     UINT16                  ArgCount = 0;
149f8146b88SJung-uk Kim     ACPI_STATUS             Status;
150f8146b88SJung-uk Kim 
151f8146b88SJung-uk Kim 
152f8146b88SJung-uk Kim     CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
153f8146b88SJung-uk Kim 
154f8146b88SJung-uk Kim     Next = Gbl_ExternalsListHead;
155f8146b88SJung-uk Kim     while (Next)
156f8146b88SJung-uk Kim     {
157f8146b88SJung-uk Kim         ArgCount = 0;
158f8146b88SJung-uk Kim 
159f8146b88SJung-uk Kim         /* Skip if External node already handled */
160f8146b88SJung-uk Kim 
161f8146b88SJung-uk Kim         if (Next->Asl.Child->Asl.CompileFlags & NODE_VISITED)
162f8146b88SJung-uk Kim         {
163f8146b88SJung-uk Kim             Next = Next->Asl.Next;
164f8146b88SJung-uk Kim             continue;
165f8146b88SJung-uk Kim         }
166f8146b88SJung-uk Kim 
167f8146b88SJung-uk Kim         NameOp = Next->Asl.Child->Asl.Child;
168f8146b88SJung-uk Kim         ExternalName = AcpiNsGetNormalizedPathname (NameOp->Asl.Node, TRUE);
169f8146b88SJung-uk Kim 
170f8146b88SJung-uk Kim         if (strcmp (CallName, ExternalName))
171f8146b88SJung-uk Kim         {
172f8146b88SJung-uk Kim             ACPI_FREE (ExternalName);
173f8146b88SJung-uk Kim             Next = Next->Asl.Next;
174f8146b88SJung-uk Kim             continue;
175f8146b88SJung-uk Kim         }
176f8146b88SJung-uk Kim 
177f8146b88SJung-uk Kim         Next->Asl.Child->Asl.CompileFlags |= NODE_VISITED;
178f8146b88SJung-uk Kim 
179f8146b88SJung-uk Kim         /*
180f8146b88SJung-uk Kim          * Since we will reposition Externals to the Root, set Namepath
181f8146b88SJung-uk Kim          * to the fully qualified name and recalculate the aml length
182f8146b88SJung-uk Kim          */
183f8146b88SJung-uk Kim         Status = UtInternalizeName (ExternalName,
184f8146b88SJung-uk Kim             &NameOp->Asl.Value.String);
185f8146b88SJung-uk Kim 
186f8146b88SJung-uk Kim         ACPI_FREE (ExternalName);
187f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
188f8146b88SJung-uk Kim         {
189f8146b88SJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
190f8146b88SJung-uk Kim                 NULL, "- Could not Internalize External");
191f8146b88SJung-uk Kim             break;
192f8146b88SJung-uk Kim         }
193f8146b88SJung-uk Kim 
194f8146b88SJung-uk Kim         NameOp->Asl.AmlLength = strlen (NameOp->Asl.Value.String);
195f8146b88SJung-uk Kim 
196f8146b88SJung-uk Kim         /* Get argument count */
197f8146b88SJung-uk Kim 
198f8146b88SJung-uk Kim         Child = Op->Asl.Child;
199f8146b88SJung-uk Kim         while (Child)
200f8146b88SJung-uk Kim         {
201f8146b88SJung-uk Kim             ArgCount++;
202f8146b88SJung-uk Kim             Child = Child->Asl.Next;
203f8146b88SJung-uk Kim         }
204f8146b88SJung-uk Kim 
205f8146b88SJung-uk Kim         /* Setup ArgCount operand */
206f8146b88SJung-uk Kim 
207f8146b88SJung-uk Kim         ArgCountOp = Next->Asl.Child->Asl.Child->Asl.Next->Asl.Next;
208f8146b88SJung-uk Kim         ArgCountOp->Asl.Value.Integer = ArgCount;
209f8146b88SJung-uk Kim         break;
210f8146b88SJung-uk Kim     }
211f8146b88SJung-uk Kim 
212f8146b88SJung-uk Kim     ACPI_FREE (CallName);
213f8146b88SJung-uk Kim }
214f8146b88SJung-uk Kim 
215f8146b88SJung-uk Kim 
216f8146b88SJung-uk Kim /*******************************************************************************
217f8146b88SJung-uk Kim  *
218f8146b88SJung-uk Kim  * FUNCTION:    ExAmlExternalWalkBegin
219f8146b88SJung-uk Kim  *
220f8146b88SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
221f8146b88SJung-uk Kim  *
222f8146b88SJung-uk Kim  * RETURN:      None
223f8146b88SJung-uk Kim  *
224f8146b88SJung-uk Kim  * DESCRIPTION: Parse tree walk to create external opcode list for methods.
225f8146b88SJung-uk Kim  *
226f8146b88SJung-uk Kim  ******************************************************************************/
227f8146b88SJung-uk Kim 
228f8146b88SJung-uk Kim ACPI_STATUS
229f8146b88SJung-uk Kim ExAmlExternalWalkBegin (
230f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
231f8146b88SJung-uk Kim     UINT32                  Level,
232f8146b88SJung-uk Kim     void                    *Context)
233f8146b88SJung-uk Kim {
234f8146b88SJung-uk Kim 
235f8146b88SJung-uk Kim     /* External list head saved in the definition block op */
236f8146b88SJung-uk Kim 
237f8146b88SJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
238f8146b88SJung-uk Kim     {
239f8146b88SJung-uk Kim         Gbl_ExternalsListHead = Op->Asl.Value.Arg;
240f8146b88SJung-uk Kim     }
241f8146b88SJung-uk Kim 
242f8146b88SJung-uk Kim     if (!Gbl_ExternalsListHead)
243f8146b88SJung-uk Kim     {
244f8146b88SJung-uk Kim         return (AE_OK);
245f8146b88SJung-uk Kim     }
246f8146b88SJung-uk Kim 
247f8146b88SJung-uk Kim     if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
248f8146b88SJung-uk Kim     {
249f8146b88SJung-uk Kim         return (AE_OK);
250f8146b88SJung-uk Kim     }
251f8146b88SJung-uk Kim 
252f8146b88SJung-uk Kim     /*
253f8146b88SJung-uk Kim      * The NameOp child under an ExternalOp gets turned into PARSE_METHODCALL
254f8146b88SJung-uk Kim      * by XfNamespaceLocateBegin(). Ignore these.
255f8146b88SJung-uk Kim      */
256f8146b88SJung-uk Kim     if (Op->Asl.Parent &&
257f8146b88SJung-uk Kim         Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_EXTERNAL)
258f8146b88SJung-uk Kim     {
259f8146b88SJung-uk Kim         return (AE_OK);
260f8146b88SJung-uk Kim     }
261f8146b88SJung-uk Kim 
262f8146b88SJung-uk Kim     ExInsertArgCount (Op);
263f8146b88SJung-uk Kim     return (AE_OK);
264f8146b88SJung-uk Kim }
265f8146b88SJung-uk Kim 
266f8146b88SJung-uk Kim 
267f8146b88SJung-uk Kim /*******************************************************************************
268f8146b88SJung-uk Kim  *
269f8146b88SJung-uk Kim  * FUNCTION:    ExAmlExternalWalkEnd
270f8146b88SJung-uk Kim  *
271f8146b88SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
272f8146b88SJung-uk Kim  *
273f8146b88SJung-uk Kim  * RETURN:      None
274f8146b88SJung-uk Kim  *
275f8146b88SJung-uk Kim  * DESCRIPTION: Parse tree walk to create external opcode list for methods.
276f8146b88SJung-uk Kim  *              Here, we just want to catch the case where a definition block
277f8146b88SJung-uk Kim  *              has been completed. Then we move all of the externals into
278f8146b88SJung-uk Kim  *              a single block in the parse tree and thus the AML code.
279f8146b88SJung-uk Kim  *
280f8146b88SJung-uk Kim  ******************************************************************************/
281f8146b88SJung-uk Kim 
282f8146b88SJung-uk Kim ACPI_STATUS
283f8146b88SJung-uk Kim ExAmlExternalWalkEnd (
284f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
285f8146b88SJung-uk Kim     UINT32                  Level,
286f8146b88SJung-uk Kim     void                    *Context)
287f8146b88SJung-uk Kim {
288f8146b88SJung-uk Kim 
289f8146b88SJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
290f8146b88SJung-uk Kim     {
291f8146b88SJung-uk Kim         /*
292f8146b88SJung-uk Kim          * Process any existing external list. (Support for
293f8146b88SJung-uk Kim          * multiple definition blocks in a single file/compile)
294f8146b88SJung-uk Kim          */
295f8146b88SJung-uk Kim         ExMoveExternals (Op);
296f8146b88SJung-uk Kim         Gbl_ExternalsListHead = NULL;
297f8146b88SJung-uk Kim     }
298f8146b88SJung-uk Kim 
299f8146b88SJung-uk Kim     return (AE_OK);
300f8146b88SJung-uk Kim }
301f8146b88SJung-uk Kim 
302f8146b88SJung-uk Kim 
303f8146b88SJung-uk Kim /*******************************************************************************
304f8146b88SJung-uk Kim  *
305f8146b88SJung-uk Kim  * FUNCTION:    ExMoveExternals
306f8146b88SJung-uk Kim  *
307f8146b88SJung-uk Kim  * PARAMETERS:  DefinitionBlockOp       - Op for current definition block
308f8146b88SJung-uk Kim  *
309f8146b88SJung-uk Kim  * RETURN:      None
310f8146b88SJung-uk Kim  *
311f8146b88SJung-uk Kim  * DESCRIPTION: Move all externals present in the source file into a single
312f8146b88SJung-uk Kim  *              block of AML code, surrounded by an "If (0)" to prevent
313f8146b88SJung-uk Kim  *              AML interpreters from attempting to execute the External
314f8146b88SJung-uk Kim  *              opcodes.
315f8146b88SJung-uk Kim  *
316f8146b88SJung-uk Kim  ******************************************************************************/
317f8146b88SJung-uk Kim 
318f8146b88SJung-uk Kim static void
319f8146b88SJung-uk Kim ExMoveExternals (
320f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *DefinitionBlockOp)
321f8146b88SJung-uk Kim {
322f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
323f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ExternalOp;
324f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *PredicateOp;
325f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
326f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Prev;
327f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Next;
328*1cc50d6bSJung-uk Kim     char                    *ExternalName;
329f8146b88SJung-uk Kim     ACPI_OBJECT_TYPE        ObjType;
330f8146b88SJung-uk Kim     UINT32                  i;
331f8146b88SJung-uk Kim 
332f8146b88SJung-uk Kim 
333f8146b88SJung-uk Kim     if (!Gbl_ExternalsListHead)
334f8146b88SJung-uk Kim     {
335f8146b88SJung-uk Kim         return;
336f8146b88SJung-uk Kim     }
337f8146b88SJung-uk Kim 
338f8146b88SJung-uk Kim     /* Remove the External nodes from the tree */
339f8146b88SJung-uk Kim 
340f8146b88SJung-uk Kim     NextOp = Gbl_ExternalsListHead;
341f8146b88SJung-uk Kim     while (NextOp)
342f8146b88SJung-uk Kim     {
343f8146b88SJung-uk Kim         /*
344f8146b88SJung-uk Kim          * The External is stored in child pointer of each node in the
345f8146b88SJung-uk Kim          * list
346f8146b88SJung-uk Kim          */
347f8146b88SJung-uk Kim         ExternalOp = NextOp->Asl.Child;
348f8146b88SJung-uk Kim 
349*1cc50d6bSJung-uk Kim         /* Get/set the fully qualified name */
350*1cc50d6bSJung-uk Kim 
351*1cc50d6bSJung-uk Kim         ExternalName = AcpiNsGetNormalizedPathname (ExternalOp->Asl.Node, TRUE);
352*1cc50d6bSJung-uk Kim         ExternalOp->Asl.ExternalName = ExternalName;
353*1cc50d6bSJung-uk Kim         ExternalOp->Asl.Namepath = ExternalName;
354*1cc50d6bSJung-uk Kim 
355f8146b88SJung-uk Kim         /* Set line numbers (for listings, etc.) */
356f8146b88SJung-uk Kim 
357f8146b88SJung-uk Kim         ExternalOp->Asl.LineNumber = 0;
358f8146b88SJung-uk Kim         ExternalOp->Asl.LogicalLineNumber = 0;
359f8146b88SJung-uk Kim 
360f8146b88SJung-uk Kim         Next = ExternalOp->Asl.Child;
361f8146b88SJung-uk Kim         Next->Asl.LineNumber = 0;
362f8146b88SJung-uk Kim         Next->Asl.LogicalLineNumber = 0;
363f8146b88SJung-uk Kim 
364*1cc50d6bSJung-uk Kim         if (Next->Asl.ParseOpcode == PARSEOP_NAMESEG)
365*1cc50d6bSJung-uk Kim         {
366*1cc50d6bSJung-uk Kim             Next->Asl.ParseOpcode = PARSEOP_NAMESTRING;
367*1cc50d6bSJung-uk Kim         }
368*1cc50d6bSJung-uk Kim         Next->Asl.ExternalName = ExternalName;
369*1cc50d6bSJung-uk Kim         UtInternalizeName (ExternalName, &Next->Asl.Value.String);
370*1cc50d6bSJung-uk Kim         Next->Asl.AmlLength = strlen (Next->Asl.Value.String);
371*1cc50d6bSJung-uk Kim 
372f8146b88SJung-uk Kim         Next = Next->Asl.Next;
373f8146b88SJung-uk Kim         Next->Asl.LineNumber = 0;
374f8146b88SJung-uk Kim         Next->Asl.LogicalLineNumber = 0;
375f8146b88SJung-uk Kim 
376f8146b88SJung-uk Kim         Next = Next->Asl.Next;
377f8146b88SJung-uk Kim         Next->Asl.LineNumber = 0;
378f8146b88SJung-uk Kim         Next->Asl.LogicalLineNumber = 0;
379f8146b88SJung-uk Kim 
380f8146b88SJung-uk Kim         Next = Next->Asl.Next;
381f8146b88SJung-uk Kim         Next->Asl.LineNumber = 0;
382f8146b88SJung-uk Kim         Next->Asl.LogicalLineNumber = 0;
383f8146b88SJung-uk Kim 
384f8146b88SJung-uk Kim         ParentOp = ExternalOp->Asl.Parent;
385f8146b88SJung-uk Kim         Prev = Next = ParentOp->Asl.Child;
386f8146b88SJung-uk Kim 
387f8146b88SJung-uk Kim         /* Now find the External node's position in parse tree */
388f8146b88SJung-uk Kim 
389f8146b88SJung-uk Kim         while (Next != ExternalOp)
390f8146b88SJung-uk Kim         {
391f8146b88SJung-uk Kim             Prev = Next;
392f8146b88SJung-uk Kim             Next = Next->Asl.Next;
393f8146b88SJung-uk Kim         }
394f8146b88SJung-uk Kim 
395f8146b88SJung-uk Kim         /* Remove the External from the parse tree */
396f8146b88SJung-uk Kim 
397f8146b88SJung-uk Kim         if (Prev == ExternalOp)
398f8146b88SJung-uk Kim         {
399f8146b88SJung-uk Kim             /* External was the first child node */
400f8146b88SJung-uk Kim 
401f8146b88SJung-uk Kim             ParentOp->Asl.Child = ExternalOp->Asl.Next;
402f8146b88SJung-uk Kim         }
403f8146b88SJung-uk Kim 
404f8146b88SJung-uk Kim         Prev->Asl.Next = ExternalOp->Asl.Next;
405f8146b88SJung-uk Kim         ExternalOp->Asl.Next = NULL;
406f8146b88SJung-uk Kim         ExternalOp->Asl.Parent = Gbl_ExternalsListHead;
407f8146b88SJung-uk Kim 
408f8146b88SJung-uk Kim         /* Point the External to the next in the list */
409f8146b88SJung-uk Kim 
410f8146b88SJung-uk Kim         if (NextOp->Asl.Next)
411f8146b88SJung-uk Kim         {
412f8146b88SJung-uk Kim             ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child;
413f8146b88SJung-uk Kim         }
414f8146b88SJung-uk Kim 
415f8146b88SJung-uk Kim         NextOp = NextOp->Asl.Next;
416f8146b88SJung-uk Kim     }
417f8146b88SJung-uk Kim 
418f8146b88SJung-uk Kim     /*
419f8146b88SJung-uk Kim      * Loop again to remove MethodObj Externals for which
420f8146b88SJung-uk Kim      * a MethodCall was not found (dead external reference)
421f8146b88SJung-uk Kim      */
422f8146b88SJung-uk Kim     Prev = Gbl_ExternalsListHead->Asl.Child;
423f8146b88SJung-uk Kim     Next = Prev;
424f8146b88SJung-uk Kim     while (Next)
425f8146b88SJung-uk Kim     {
426f8146b88SJung-uk Kim         ObjType = (ACPI_OBJECT_TYPE)
427f8146b88SJung-uk Kim             Next->Asl.Child->Asl.Next->Asl.Value.Integer;
428f8146b88SJung-uk Kim 
429f8146b88SJung-uk Kim         if (ObjType == ACPI_TYPE_METHOD &&
430f8146b88SJung-uk Kim             !(Next->Asl.CompileFlags & NODE_VISITED))
431f8146b88SJung-uk Kim         {
432f8146b88SJung-uk Kim             if (Next == Prev)
433f8146b88SJung-uk Kim             {
434f8146b88SJung-uk Kim                 Gbl_ExternalsListHead->Asl.Child = Next->Asl.Next;
435f8146b88SJung-uk Kim                 Next->Asl.Next = NULL;
436f8146b88SJung-uk Kim                 Prev = Gbl_ExternalsListHead->Asl.Child;
437f8146b88SJung-uk Kim                 Next = Prev;
438f8146b88SJung-uk Kim                 continue;
439f8146b88SJung-uk Kim             }
440f8146b88SJung-uk Kim             else
441f8146b88SJung-uk Kim             {
442f8146b88SJung-uk Kim                 Prev->Asl.Next = Next->Asl.Next;
443f8146b88SJung-uk Kim                 Next->Asl.Next = NULL;
444f8146b88SJung-uk Kim                 Next = Prev->Asl.Next;
445f8146b88SJung-uk Kim                 continue;
446f8146b88SJung-uk Kim             }
447f8146b88SJung-uk Kim         }
448f8146b88SJung-uk Kim 
449f8146b88SJung-uk Kim         Prev = Next;
450f8146b88SJung-uk Kim         Next = Next->Asl.Next;
451f8146b88SJung-uk Kim     }
452f8146b88SJung-uk Kim 
453f8146b88SJung-uk Kim     /* If list is now empty, don't bother to make If (0) block */
454f8146b88SJung-uk Kim 
455f8146b88SJung-uk Kim     if (!Gbl_ExternalsListHead->Asl.Child)
456f8146b88SJung-uk Kim     {
457f8146b88SJung-uk Kim         return;
458f8146b88SJung-uk Kim     }
459f8146b88SJung-uk Kim 
460f8146b88SJung-uk Kim     /* Convert Gbl_ExternalsListHead parent to If(). */
461f8146b88SJung-uk Kim 
462f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF;
463f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP;
464f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.CompileFlags = NODE_AML_PACKAGE;
465f8146b88SJung-uk Kim     UtSetParseOpName (Gbl_ExternalsListHead);
466f8146b88SJung-uk Kim 
467f8146b88SJung-uk Kim     /* Create a Zero op for the If predicate */
468f8146b88SJung-uk Kim 
469f8146b88SJung-uk Kim     PredicateOp = TrAllocateNode (PARSEOP_ZERO);
470f8146b88SJung-uk Kim     PredicateOp->Asl.AmlOpcode = AML_ZERO_OP;
471f8146b88SJung-uk Kim 
472f8146b88SJung-uk Kim     PredicateOp->Asl.Parent = Gbl_ExternalsListHead;
473f8146b88SJung-uk Kim     PredicateOp->Asl.Child = NULL;
474f8146b88SJung-uk Kim     PredicateOp->Asl.Next = Gbl_ExternalsListHead->Asl.Child;
475f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.Child = PredicateOp;
476f8146b88SJung-uk Kim 
477f8146b88SJung-uk Kim     /* Set line numbers (for listings, etc.) */
478f8146b88SJung-uk Kim 
479f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.LineNumber = 0;
480f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.LogicalLineNumber = 0;
481f8146b88SJung-uk Kim 
482f8146b88SJung-uk Kim     PredicateOp->Asl.LineNumber = 0;
483f8146b88SJung-uk Kim     PredicateOp->Asl.LogicalLineNumber = 0;
484f8146b88SJung-uk Kim 
485f8146b88SJung-uk Kim     /* Insert block back in the list */
486f8146b88SJung-uk Kim 
487f8146b88SJung-uk Kim     Prev = DefinitionBlockOp->Asl.Child;
488f8146b88SJung-uk Kim     Next = Prev;
489f8146b88SJung-uk Kim 
490f8146b88SJung-uk Kim     /* Find last default arg */
491f8146b88SJung-uk Kim 
492f8146b88SJung-uk Kim     for (i = 0; i < 6; i++)
493f8146b88SJung-uk Kim     {
494f8146b88SJung-uk Kim         Prev = Next;
495f8146b88SJung-uk Kim         Next = Prev->Asl.Next;
496f8146b88SJung-uk Kim     }
497f8146b88SJung-uk Kim 
498f8146b88SJung-uk Kim     if (Next)
499f8146b88SJung-uk Kim     {
500f8146b88SJung-uk Kim         /* Definition Block is not empty */
501f8146b88SJung-uk Kim 
502f8146b88SJung-uk Kim         Gbl_ExternalsListHead->Asl.Next = Next;
503f8146b88SJung-uk Kim     }
504f8146b88SJung-uk Kim     else
505f8146b88SJung-uk Kim     {
506f8146b88SJung-uk Kim         /* Definition Block is empty. */
507f8146b88SJung-uk Kim 
508f8146b88SJung-uk Kim         Gbl_ExternalsListHead->Asl.Next = NULL;
509f8146b88SJung-uk Kim     }
510f8146b88SJung-uk Kim 
511f8146b88SJung-uk Kim     Prev->Asl.Next = Gbl_ExternalsListHead;
512f8146b88SJung-uk Kim     Gbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent;
513f8146b88SJung-uk Kim }
514