Home | History | Annotate | Line # | Download | only in compiler
      1 /******************************************************************************
      2  *
      3  * Module Name: aslexternal - ASL External opcode compiler support
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #include "aslcompiler.h"
    153 #include "aslcompiler.y.h"
    154 #include "acparser.h"
    155 #include "amlcode.h"
    156 #include "acnamesp.h"
    157 
    158 
    159 #define _COMPONENT          ACPI_COMPILER
    160         ACPI_MODULE_NAME    ("aslexternal")
    161 
    162 
    163 /* Local prototypes */
    164 
    165 static void
    166 ExInsertArgCount (
    167     ACPI_PARSE_OBJECT       *Op);
    168 
    169 static void
    170 ExMoveExternals (
    171     ACPI_PARSE_OBJECT       *DefinitionBlockOp);
    172 
    173 
    174 /*******************************************************************************
    175  *
    176  * FUNCTION:    ExDoExternal
    177  *
    178  * PARAMETERS:  Op                  - Current Parse node
    179  *
    180  * RETURN:      None
    181  *
    182  * DESCRIPTION: Add an External() definition to the global list. This list
    183  *              is used to generate External opcodes.
    184  *
    185  ******************************************************************************/
    186 
    187 void
    188 ExDoExternal (
    189     ACPI_PARSE_OBJECT       *Op)
    190 {
    191     ACPI_PARSE_OBJECT       *ListOp;
    192     ACPI_PARSE_OBJECT       *Prev;
    193     ACPI_PARSE_OBJECT       *Next;
    194     ACPI_PARSE_OBJECT       *ArgCountOp;
    195     ACPI_PARSE_OBJECT       *TypeOp;
    196     ACPI_PARSE_OBJECT       *ExternTypeOp = Op->Asl.Child->Asl.Next;
    197     UINT32                  ExternType;
    198     UINT8                   ParamCount = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
    199     UINT32                  ParamTypes[ACPI_METHOD_NUM_ARGS];
    200 
    201 
    202     ExternType = AnMapObjTypeToBtype (ExternTypeOp);
    203     if (ExternType != ACPI_BTYPE_METHOD)
    204     {
    205         /*
    206          * If this is not a method, it has zero parameters this local variable
    207          * is used only for methods
    208          */
    209         ParamCount = 0;
    210     }
    211 
    212     /*
    213      * The parser allows optional parameter return types regardless of the
    214      * type. Check object type keyword emit error if optional parameter/return
    215      * types exist.
    216      *
    217      * Check the parameter return type
    218      */
    219     TypeOp = ExternTypeOp->Asl.Next;
    220     if (TypeOp->Asl.Child)
    221     {
    222         /* Ignore the return type for now. */
    223 
    224         (void) MtProcessTypeOp (TypeOp->Asl.Child);
    225         if (ExternType != ACPI_BTYPE_METHOD)
    226         {
    227             sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
    228             AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_RET_TYPE, TypeOp,
    229                 AslGbl_MsgBuffer);
    230         }
    231     }
    232 
    233     /* Check the parameter types */
    234 
    235     TypeOp = TypeOp->Asl.Next;
    236     if (TypeOp->Asl.Child)
    237     {
    238         ParamCount = MtProcessParameterTypeList (TypeOp->Asl.Child, ParamTypes);
    239         if (ExternType != ACPI_BTYPE_METHOD)
    240         {
    241             sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
    242             AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_PARAM_TYPE, TypeOp,
    243                 AslGbl_MsgBuffer);
    244         }
    245     }
    246 
    247     ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
    248     ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    249     ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
    250     ArgCountOp->Asl.Value.Integer = ParamCount;
    251     UtSetParseOpName (ArgCountOp);
    252 
    253     /* Create new list node of arbitrary type */
    254 
    255     ListOp = TrAllocateOp (PARSEOP_DEFAULT_ARG);
    256 
    257     /* Store External node as child */
    258 
    259     ListOp->Asl.Child = Op;
    260     ListOp->Asl.Next = NULL;
    261 
    262     if (AslGbl_ExternalsListHead)
    263     {
    264         /* Link new External to end of list */
    265 
    266         Prev = AslGbl_ExternalsListHead;
    267         Next = Prev;
    268         while (Next)
    269         {
    270             Prev = Next;
    271             Next = Next->Asl.Next;
    272         }
    273 
    274         Prev->Asl.Next = ListOp;
    275     }
    276     else
    277     {
    278         AslGbl_ExternalsListHead = ListOp;
    279     }
    280 }
    281 
    282 
    283 /*******************************************************************************
    284  *
    285  * FUNCTION:    ExInsertArgCount
    286  *
    287  * PARAMETERS:  Op              - Op for a method invocation
    288  *
    289  * RETURN:      None
    290  *
    291  * DESCRIPTION: Obtain the number of arguments for a control method -- from
    292  *              the actual invocation.
    293  *
    294  ******************************************************************************/
    295 
    296 static void
    297 ExInsertArgCount (
    298     ACPI_PARSE_OBJECT       *Op)
    299 {
    300     ACPI_PARSE_OBJECT       *Next;
    301     ACPI_PARSE_OBJECT       *NameOp;
    302     ACPI_PARSE_OBJECT       *Child;
    303     ACPI_PARSE_OBJECT       *ArgCountOp;
    304     char *                  ExternalName;
    305     char *                  CallName;
    306     UINT16                  ArgCount = 0;
    307     ACPI_STATUS             Status;
    308 
    309 
    310     CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
    311 
    312     Next = AslGbl_ExternalsListHead;
    313     while (Next)
    314     {
    315         ArgCount = 0;
    316 
    317         /* Skip if External node already handled */
    318 
    319         if (Next->Asl.Child->Asl.CompileFlags & OP_VISITED)
    320         {
    321             Next = Next->Asl.Next;
    322             continue;
    323         }
    324 
    325         NameOp = Next->Asl.Child->Asl.Child;
    326         ExternalName = AcpiNsGetNormalizedPathname (NameOp->Asl.Node, TRUE);
    327 
    328         if (strcmp (CallName, ExternalName))
    329         {
    330             ACPI_FREE (ExternalName);
    331             Next = Next->Asl.Next;
    332             continue;
    333         }
    334 
    335         Next->Asl.Child->Asl.CompileFlags |= OP_VISITED;
    336 
    337         /*
    338          * Since we will reposition Externals to the Root, set Namepath
    339          * to the fully qualified name and recalculate the aml length
    340          */
    341         Status = UtInternalizeName (ExternalName,
    342             &NameOp->Asl.Value.String);
    343 
    344         ACPI_FREE (ExternalName);
    345         if (ACPI_FAILURE (Status))
    346         {
    347             AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
    348                 NULL, "- Could not Internalize External");
    349             break;
    350         }
    351 
    352         NameOp->Asl.AmlLength = strlen (NameOp->Asl.Value.String);
    353 
    354         /* Get argument count */
    355 
    356         Child = Op->Asl.Child;
    357         while (Child)
    358         {
    359             ArgCount++;
    360             Child = Child->Asl.Next;
    361         }
    362 
    363         /* Setup ArgCount operand */
    364 
    365         ArgCountOp = Next->Asl.Child->Asl.Child->Asl.Next->Asl.Next;
    366         ArgCountOp->Asl.Value.Integer = ArgCount;
    367         break;
    368     }
    369 
    370     ACPI_FREE (CallName);
    371 }
    372 
    373 
    374 /*******************************************************************************
    375  *
    376  * FUNCTION:    ExAmlExternalWalkBegin
    377  *
    378  * PARAMETERS:  ASL_WALK_CALLBACK
    379  *
    380  * RETURN:      None
    381  *
    382  * DESCRIPTION: Parse tree walk to create external opcode list for methods.
    383  *
    384  ******************************************************************************/
    385 
    386 ACPI_STATUS
    387 ExAmlExternalWalkBegin (
    388     ACPI_PARSE_OBJECT       *Op,
    389     UINT32                  Level,
    390     void                    *Context)
    391 {
    392 
    393     /* External list head saved in the definition block op */
    394 
    395     if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
    396     {
    397         AslGbl_ExternalsListHead = Op->Asl.Value.Arg;
    398     }
    399 
    400     if (!AslGbl_ExternalsListHead)
    401     {
    402         return (AE_OK);
    403     }
    404 
    405     if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
    406     {
    407         return (AE_OK);
    408     }
    409 
    410     /*
    411      * The NameOp child under an ExternalOp gets turned into PARSE_METHODCALL
    412      * by XfNamespaceLocateBegin(). Ignore these.
    413      */
    414     if (Op->Asl.Parent &&
    415         Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_EXTERNAL)
    416     {
    417         return (AE_OK);
    418     }
    419 
    420     ExInsertArgCount (Op);
    421     return (AE_OK);
    422 }
    423 
    424 
    425 /*******************************************************************************
    426  *
    427  * FUNCTION:    ExAmlExternalWalkEnd
    428  *
    429  * PARAMETERS:  ASL_WALK_CALLBACK
    430  *
    431  * RETURN:      None
    432  *
    433  * DESCRIPTION: Parse tree walk to create external opcode list for methods.
    434  *              Here, we just want to catch the case where a definition block
    435  *              has been completed. Then we move all of the externals into
    436  *              a single block in the parse tree and thus the AML code.
    437  *
    438  ******************************************************************************/
    439 
    440 ACPI_STATUS
    441 ExAmlExternalWalkEnd (
    442     ACPI_PARSE_OBJECT       *Op,
    443     UINT32                  Level,
    444     void                    *Context)
    445 {
    446 
    447     if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
    448     {
    449         /*
    450          * Process any existing external list. (Support for
    451          * multiple definition blocks in a single file/compile)
    452          */
    453         ExMoveExternals (Op);
    454         AslGbl_ExternalsListHead = NULL;
    455     }
    456 
    457     return (AE_OK);
    458 }
    459 
    460 
    461 /*******************************************************************************
    462  *
    463  * FUNCTION:    ExMoveExternals
    464  *
    465  * PARAMETERS:  DefinitionBlockOp       - Op for current definition block
    466  *
    467  * RETURN:      None
    468  *
    469  * DESCRIPTION: Move all externals present in the source file into a single
    470  *              block of AML code, surrounded by an "If (0)" to prevent
    471  *              AML interpreters from attempting to execute the External
    472  *              opcodes.
    473  *
    474  ******************************************************************************/
    475 
    476 static void
    477 ExMoveExternals (
    478     ACPI_PARSE_OBJECT       *DefinitionBlockOp)
    479 {
    480     ACPI_PARSE_OBJECT       *ParentOp;
    481     ACPI_PARSE_OBJECT       *ExternalOp;
    482     ACPI_PARSE_OBJECT       *PredicateOp;
    483     ACPI_PARSE_OBJECT       *NextOp;
    484     ACPI_PARSE_OBJECT       *Prev;
    485     ACPI_PARSE_OBJECT       *Next;
    486     char                    *ExternalName;
    487     ACPI_OBJECT_TYPE        ObjType;
    488     ACPI_STATUS             Status;
    489     UINT32                  i;
    490 
    491 
    492     if (!AslGbl_ExternalsListHead)
    493     {
    494         return;
    495     }
    496 
    497     /* Remove the External nodes from the tree */
    498 
    499     NextOp = AslGbl_ExternalsListHead;
    500     while (NextOp)
    501     {
    502         /*
    503          * The External is stored in child pointer of each node in the
    504          * list
    505          */
    506         ExternalOp = NextOp->Asl.Child;
    507 
    508         /* Get/set the fully qualified name */
    509 
    510         ExternalName = AcpiNsGetNormalizedPathname (ExternalOp->Asl.Node, TRUE);
    511         ExternalOp->Asl.ExternalName = ExternalName;
    512         ExternalOp->Asl.Namepath = ExternalName;
    513 
    514         /* Set line numbers (for listings, etc.) */
    515 
    516         ExternalOp->Asl.LineNumber = 0;
    517         ExternalOp->Asl.LogicalLineNumber = 0;
    518 
    519         Next = ExternalOp->Asl.Child;
    520         Next->Asl.LineNumber = 0;
    521         Next->Asl.LogicalLineNumber = 0;
    522 
    523         if (Next->Asl.ParseOpcode == PARSEOP_NAMESEG)
    524         {
    525             Next->Asl.ParseOpcode = PARSEOP_NAMESTRING;
    526         }
    527 
    528         Next->Asl.ExternalName = ExternalName;
    529         Status = UtInternalizeName (ExternalName, &Next->Asl.Value.String);
    530         if (ACPI_FAILURE (Status))
    531         {
    532             AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
    533                 Next, "Could not internalize namestring");
    534             return;
    535         }
    536 
    537         Next->Asl.AmlLength = strlen (Next->Asl.Value.String);
    538 
    539         Next = Next->Asl.Next;
    540         Next->Asl.LineNumber = 0;
    541         Next->Asl.LogicalLineNumber = 0;
    542 
    543         Next = Next->Asl.Next;
    544         Next->Asl.LineNumber = 0;
    545         Next->Asl.LogicalLineNumber = 0;
    546 
    547         Next = Next->Asl.Next;
    548         Next->Asl.LineNumber = 0;
    549         Next->Asl.LogicalLineNumber = 0;
    550 
    551         ParentOp = ExternalOp->Asl.Parent;
    552         Prev = Next = ParentOp->Asl.Child;
    553 
    554         /* Now find the External node's position in parse tree */
    555 
    556         while (Next != ExternalOp)
    557         {
    558             Prev = Next;
    559             Next = Next->Asl.Next;
    560         }
    561 
    562         /* Remove the External from the parse tree */
    563 
    564         if (Prev == ExternalOp)
    565         {
    566             /* External was the first child node */
    567 
    568             ParentOp->Asl.Child = ExternalOp->Asl.Next;
    569         }
    570 
    571         Prev->Asl.Next = ExternalOp->Asl.Next;
    572         ExternalOp->Asl.Next = NULL;
    573         ExternalOp->Asl.Parent = AslGbl_ExternalsListHead;
    574 
    575         /* Point the External to the next in the list */
    576 
    577         if (NextOp->Asl.Next)
    578         {
    579             ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child;
    580         }
    581 
    582         NextOp = NextOp->Asl.Next;
    583     }
    584 
    585     /*
    586      * Loop again to remove MethodObj Externals for which
    587      * a MethodCall was not found (dead external reference)
    588      */
    589     Prev = AslGbl_ExternalsListHead->Asl.Child;
    590     Next = Prev;
    591     while (Next)
    592     {
    593         ObjType = (ACPI_OBJECT_TYPE)
    594             Next->Asl.Child->Asl.Next->Asl.Value.Integer;
    595 
    596         if (ObjType == ACPI_TYPE_METHOD &&
    597             !(Next->Asl.CompileFlags & OP_VISITED))
    598         {
    599             if (Next == Prev)
    600             {
    601                 AslGbl_ExternalsListHead->Asl.Child = Next->Asl.Next;
    602                 Next->Asl.Next = NULL;
    603                 Prev = AslGbl_ExternalsListHead->Asl.Child;
    604                 Next = Prev;
    605                 continue;
    606             }
    607             else
    608             {
    609                 Prev->Asl.Next = Next->Asl.Next;
    610                 Next->Asl.Next = NULL;
    611                 Next = Prev->Asl.Next;
    612                 continue;
    613             }
    614         }
    615 
    616         Prev = Next;
    617         Next = Next->Asl.Next;
    618     }
    619 
    620     /* If list is now empty, don't bother to make If (0) block */
    621 
    622     if (!AslGbl_ExternalsListHead->Asl.Child)
    623     {
    624         return;
    625     }
    626 
    627     /* Convert Gbl_ExternalsListHead parent to If(). */
    628 
    629     AslGbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF;
    630     AslGbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP;
    631     AslGbl_ExternalsListHead->Asl.CompileFlags = OP_AML_PACKAGE;
    632     UtSetParseOpName (AslGbl_ExternalsListHead);
    633 
    634     /* Create a Zero op for the If predicate */
    635 
    636     PredicateOp = TrAllocateOp (PARSEOP_ZERO);
    637     PredicateOp->Asl.AmlOpcode = AML_ZERO_OP;
    638 
    639     PredicateOp->Asl.Parent = AslGbl_ExternalsListHead;
    640     PredicateOp->Asl.Child = NULL;
    641     PredicateOp->Asl.Next = AslGbl_ExternalsListHead->Asl.Child;
    642     AslGbl_ExternalsListHead->Asl.Child = PredicateOp;
    643 
    644     /* Set line numbers (for listings, etc.) */
    645 
    646     AslGbl_ExternalsListHead->Asl.LineNumber = 0;
    647     AslGbl_ExternalsListHead->Asl.LogicalLineNumber = 0;
    648 
    649     PredicateOp->Asl.LineNumber = 0;
    650     PredicateOp->Asl.LogicalLineNumber = 0;
    651 
    652     /* Insert block back in the list */
    653 
    654     Prev = DefinitionBlockOp->Asl.Child;
    655     Next = Prev;
    656 
    657     /* Find last default arg */
    658 
    659     for (i = 0; i < 6; i++)
    660     {
    661         Prev = Next;
    662         Next = Prev->Asl.Next;
    663     }
    664 
    665     if (Next)
    666     {
    667         /* Definition Block is not empty */
    668 
    669         AslGbl_ExternalsListHead->Asl.Next = Next;
    670     }
    671     else
    672     {
    673         /* Definition Block is empty. */
    674 
    675         AslGbl_ExternalsListHead->Asl.Next = NULL;
    676     }
    677 
    678     Prev->Asl.Next = AslGbl_ExternalsListHead;
    679     AslGbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent;
    680 }
    681