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