15f9b24faSJung-uk Kim /****************************************************************************** 25f9b24faSJung-uk Kim * 35f9b24faSJung-uk Kim * Module Name: aslparseop - Parse op create/allocate/cache interfaces 45f9b24faSJung-uk Kim * 55f9b24faSJung-uk Kim *****************************************************************************/ 65f9b24faSJung-uk Kim 75f9b24faSJung-uk Kim /****************************************************************************** 85f9b24faSJung-uk Kim * 95f9b24faSJung-uk Kim * 1. Copyright Notice 105f9b24faSJung-uk Kim * 1132ac4016SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp. 125f9b24faSJung-uk Kim * All rights reserved. 135f9b24faSJung-uk Kim * 145f9b24faSJung-uk Kim * 2. License 155f9b24faSJung-uk Kim * 165f9b24faSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 175f9b24faSJung-uk Kim * rights. You may have additional license terms from the party that provided 185f9b24faSJung-uk Kim * you this software, covering your right to use that party's intellectual 195f9b24faSJung-uk Kim * property rights. 205f9b24faSJung-uk Kim * 215f9b24faSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 225f9b24faSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 235f9b24faSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 245f9b24faSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 255f9b24faSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 265f9b24faSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 275f9b24faSJung-uk Kim * 285f9b24faSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 295f9b24faSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 305f9b24faSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 315f9b24faSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 325f9b24faSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 335f9b24faSJung-uk Kim * license, and in no event shall the patent license extend to any additions 345f9b24faSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 355f9b24faSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 365f9b24faSJung-uk Kim * 375f9b24faSJung-uk Kim * The above copyright and patent license is granted only if the following 385f9b24faSJung-uk Kim * conditions are met: 395f9b24faSJung-uk Kim * 405f9b24faSJung-uk Kim * 3. Conditions 415f9b24faSJung-uk Kim * 425f9b24faSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 435f9b24faSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 445f9b24faSJung-uk Kim * Code or modification with rights to further distribute source must include 455f9b24faSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 465f9b24faSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 475f9b24faSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 485f9b24faSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 495f9b24faSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 505f9b24faSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 515f9b24faSJung-uk Kim * must include a prominent statement that the modification is derived, 525f9b24faSJung-uk Kim * directly or indirectly, from Original Intel Code. 535f9b24faSJung-uk Kim * 545f9b24faSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 555f9b24faSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 565f9b24faSJung-uk Kim * Code or modification without rights to further distribute source must 575f9b24faSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 585f9b24faSJung-uk Kim * documentation and/or other materials provided with distribution. In 595f9b24faSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 605f9b24faSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 615f9b24faSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 625f9b24faSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 635f9b24faSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 645f9b24faSJung-uk Kim * make. 655f9b24faSJung-uk Kim * 665f9b24faSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 675f9b24faSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 685f9b24faSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 695f9b24faSJung-uk Kim * provision in the documentation and/or other materials provided with the 705f9b24faSJung-uk Kim * distribution. 715f9b24faSJung-uk Kim * 725f9b24faSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 735f9b24faSJung-uk Kim * Intel Code. 745f9b24faSJung-uk Kim * 755f9b24faSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 765f9b24faSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 775f9b24faSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 785f9b24faSJung-uk Kim * without prior written authorization from Intel. 795f9b24faSJung-uk Kim * 805f9b24faSJung-uk Kim * 4. Disclaimer and Export Compliance 815f9b24faSJung-uk Kim * 825f9b24faSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 835f9b24faSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 845f9b24faSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 855f9b24faSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 865f9b24faSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 875f9b24faSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 885f9b24faSJung-uk Kim * PARTICULAR PURPOSE. 895f9b24faSJung-uk Kim * 905f9b24faSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 915f9b24faSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 925f9b24faSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 935f9b24faSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 945f9b24faSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 955f9b24faSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 965f9b24faSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 975f9b24faSJung-uk Kim * LIMITED REMEDY. 985f9b24faSJung-uk Kim * 995f9b24faSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1005f9b24faSJung-uk Kim * software or system incorporating such software without first obtaining any 1015f9b24faSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1025f9b24faSJung-uk Kim * any other agency or department of the United States Government. In the 1035f9b24faSJung-uk Kim * event Licensee exports any such software from the United States or 1045f9b24faSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1055f9b24faSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1065f9b24faSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1075f9b24faSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1085f9b24faSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1095f9b24faSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1105f9b24faSJung-uk Kim * United States government or any agency thereof requires an export license, 1115f9b24faSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1125f9b24faSJung-uk Kim * such license, approval or letter. 1135f9b24faSJung-uk Kim * 1145f9b24faSJung-uk Kim ***************************************************************************** 1155f9b24faSJung-uk Kim * 1165f9b24faSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1175f9b24faSJung-uk Kim * following license: 1185f9b24faSJung-uk Kim * 1195f9b24faSJung-uk Kim * Redistribution and use in source and binary forms, with or without 1205f9b24faSJung-uk Kim * modification, are permitted provided that the following conditions 1215f9b24faSJung-uk Kim * are met: 1225f9b24faSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 1235f9b24faSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 1245f9b24faSJung-uk Kim * without modification. 1255f9b24faSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1265f9b24faSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 1275f9b24faSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 1285f9b24faSJung-uk Kim * including a substantially similar Disclaimer requirement for further 1295f9b24faSJung-uk Kim * binary redistribution. 1305f9b24faSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 1315f9b24faSJung-uk Kim * of any contributors may be used to endorse or promote products derived 1325f9b24faSJung-uk Kim * from this software without specific prior written permission. 1335f9b24faSJung-uk Kim * 1345f9b24faSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1355f9b24faSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1365f9b24faSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1375f9b24faSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1385f9b24faSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1395f9b24faSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1405f9b24faSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1415f9b24faSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1425f9b24faSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1435f9b24faSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1445f9b24faSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1455f9b24faSJung-uk Kim * 1465f9b24faSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1475f9b24faSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 1485f9b24faSJung-uk Kim * Software Foundation. 1495f9b24faSJung-uk Kim * 1505f9b24faSJung-uk Kim *****************************************************************************/ 1515f9b24faSJung-uk Kim 1525f9b24faSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 1535f9b24faSJung-uk Kim #include "aslcompiler.y.h" 1545f9b24faSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 1555f9b24faSJung-uk Kim #include <contrib/dev/acpica/include/acconvert.h> 1565f9b24faSJung-uk Kim 1575f9b24faSJung-uk Kim #define _COMPONENT ACPI_COMPILER 1585f9b24faSJung-uk Kim ACPI_MODULE_NAME ("aslparseop") 1595f9b24faSJung-uk Kim 1605f9b24faSJung-uk Kim 1615f9b24faSJung-uk Kim /******************************************************************************* 1625f9b24faSJung-uk Kim * 1635f9b24faSJung-uk Kim * FUNCTION: TrCreateOp 1645f9b24faSJung-uk Kim * 1655f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - Opcode to be assigned to the op 1665f9b24faSJung-uk Kim * NumChildren - Number of children to follow 1675f9b24faSJung-uk Kim * ... - A list of child ops to link to the new 1685f9b24faSJung-uk Kim * op. NumChildren long. 1695f9b24faSJung-uk Kim * 1705f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 1715f9b24faSJung-uk Kim * 1725f9b24faSJung-uk Kim * DESCRIPTION: Create a new parse op and link together a list of child 1735f9b24faSJung-uk Kim * ops underneath the new op. 1745f9b24faSJung-uk Kim * 1755f9b24faSJung-uk Kim ******************************************************************************/ 1765f9b24faSJung-uk Kim 1775f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 1785f9b24faSJung-uk Kim TrCreateOp ( 1795f9b24faSJung-uk Kim UINT32 ParseOpcode, 1805f9b24faSJung-uk Kim UINT32 NumChildren, 1815f9b24faSJung-uk Kim ...) 1825f9b24faSJung-uk Kim { 1835f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 1845f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Child; 1855f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *PrevChild; 1865f9b24faSJung-uk Kim va_list ap; 1875f9b24faSJung-uk Kim UINT32 i; 1885f9b24faSJung-uk Kim BOOLEAN FirstChild; 1895f9b24faSJung-uk Kim 1905f9b24faSJung-uk Kim 1915f9b24faSJung-uk Kim va_start (ap, NumChildren); 1925f9b24faSJung-uk Kim 1935f9b24faSJung-uk Kim /* Allocate one new op */ 1945f9b24faSJung-uk Kim 1955f9b24faSJung-uk Kim Op = TrAllocateOp (ParseOpcode); 1965f9b24faSJung-uk Kim 1975f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 1985f9b24faSJung-uk Kim "\nCreateOp Ln/Col %u/%u NewParent %p Child %u Op %s ", 1995f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, 2005f9b24faSJung-uk Kim NumChildren, UtGetOpName(ParseOpcode)); 2015f9b24faSJung-uk Kim 2025f9b24faSJung-uk Kim /* Some extra debug output based on the parse opcode */ 2035f9b24faSJung-uk Kim 2045f9b24faSJung-uk Kim switch (ParseOpcode) 2055f9b24faSJung-uk Kim { 2065f9b24faSJung-uk Kim case PARSEOP_ASL_CODE: 2075f9b24faSJung-uk Kim 2086f1f1a63SJung-uk Kim AslGbl_ParseTreeRoot = Op; 2095f9b24faSJung-uk Kim Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; 2105f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); 2115f9b24faSJung-uk Kim break; 2125f9b24faSJung-uk Kim 2135f9b24faSJung-uk Kim case PARSEOP_DEFINITION_BLOCK: 2145f9b24faSJung-uk Kim 2155f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->"); 2165f9b24faSJung-uk Kim break; 2175f9b24faSJung-uk Kim 2185f9b24faSJung-uk Kim case PARSEOP_OPERATIONREGION: 2195f9b24faSJung-uk Kim 2205f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->"); 2215f9b24faSJung-uk Kim break; 2225f9b24faSJung-uk Kim 2235f9b24faSJung-uk Kim case PARSEOP_OR: 2245f9b24faSJung-uk Kim 2255f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "OR->"); 2265f9b24faSJung-uk Kim break; 2275f9b24faSJung-uk Kim 2285f9b24faSJung-uk Kim default: 2295f9b24faSJung-uk Kim 2305f9b24faSJung-uk Kim /* Nothing to do for other opcodes */ 2315f9b24faSJung-uk Kim 2325f9b24faSJung-uk Kim break; 2335f9b24faSJung-uk Kim } 2345f9b24faSJung-uk Kim 2355f9b24faSJung-uk Kim /* Link the new op to its children */ 2365f9b24faSJung-uk Kim 2375f9b24faSJung-uk Kim PrevChild = NULL; 2385f9b24faSJung-uk Kim FirstChild = TRUE; 2395f9b24faSJung-uk Kim for (i = 0; i < NumChildren; i++) 2405f9b24faSJung-uk Kim { 2415f9b24faSJung-uk Kim /* Get the next child */ 2425f9b24faSJung-uk Kim 2435f9b24faSJung-uk Kim Child = va_arg (ap, ACPI_PARSE_OBJECT *); 2445f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child); 2455f9b24faSJung-uk Kim 2465f9b24faSJung-uk Kim /* 2475f9b24faSJung-uk Kim * If child is NULL, this means that an optional argument 2485f9b24faSJung-uk Kim * was omitted. We must create a placeholder with a special 2495f9b24faSJung-uk Kim * opcode (DEFAULT_ARG) so that the code generator will know 2505f9b24faSJung-uk Kim * that it must emit the correct default for this argument 2515f9b24faSJung-uk Kim */ 2525f9b24faSJung-uk Kim if (!Child) 2535f9b24faSJung-uk Kim { 2545f9b24faSJung-uk Kim Child = TrAllocateOp (PARSEOP_DEFAULT_ARG); 2555f9b24faSJung-uk Kim } 2565f9b24faSJung-uk Kim 2575f9b24faSJung-uk Kim /* Link first child to parent */ 2585f9b24faSJung-uk Kim 2595f9b24faSJung-uk Kim if (FirstChild) 2605f9b24faSJung-uk Kim { 2615f9b24faSJung-uk Kim FirstChild = FALSE; 2625f9b24faSJung-uk Kim Op->Asl.Child = Child; 2635f9b24faSJung-uk Kim 2645f9b24faSJung-uk Kim /* 2655f9b24faSJung-uk Kim * For the ASL-/ASL+ converter: if the ParseOp is a Connection, 2665f9b24faSJung-uk Kim * External, Offset or AccessAs, it means that the comments in the 2675f9b24faSJung-uk Kim * FirstChild belongs to their parent due to the parsing order in 2685f9b24faSJung-uk Kim * the .y files. To correct this, take the comments in the 2695f9b24faSJung-uk Kim * FirstChild place it in the parent. This also means that 2705f9b24faSJung-uk Kim * legitimate comments for the child gets put to the parent. 2715f9b24faSJung-uk Kim */ 272f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments && 2735f9b24faSJung-uk Kim ((ParseOpcode == PARSEOP_CONNECTION) || 2745f9b24faSJung-uk Kim (ParseOpcode == PARSEOP_EXTERNAL) || 2755f9b24faSJung-uk Kim (ParseOpcode == PARSEOP_OFFSET) || 2765f9b24faSJung-uk Kim (ParseOpcode == PARSEOP_ACCESSAS))) 2775f9b24faSJung-uk Kim { 2785f9b24faSJung-uk Kim Op->Asl.CommentList = Child->Asl.CommentList; 2795f9b24faSJung-uk Kim Op->Asl.EndBlkComment = Child->Asl.EndBlkComment; 2805f9b24faSJung-uk Kim Op->Asl.InlineComment = Child->Asl.InlineComment; 2815f9b24faSJung-uk Kim Op->Asl.FileChanged = Child->Asl.FileChanged; 2825f9b24faSJung-uk Kim 2835f9b24faSJung-uk Kim Child->Asl.CommentList = NULL; 2845f9b24faSJung-uk Kim Child->Asl.EndBlkComment = NULL; 2855f9b24faSJung-uk Kim Child->Asl.InlineComment = NULL; 2865f9b24faSJung-uk Kim Child->Asl.FileChanged = FALSE; 2875f9b24faSJung-uk Kim 2885f9b24faSJung-uk Kim /* 2895f9b24faSJung-uk Kim * These do not need to be "passed off". They can be copied 2905f9b24faSJung-uk Kim * because the code for these opcodes should be printed in the 2915f9b24faSJung-uk Kim * same file. 2925f9b24faSJung-uk Kim */ 2935f9b24faSJung-uk Kim Op->Asl.Filename = Child->Asl.Filename; 2945f9b24faSJung-uk Kim Op->Asl.ParentFilename = Child->Asl.ParentFilename; 2955f9b24faSJung-uk Kim } 2965f9b24faSJung-uk Kim } 2975f9b24faSJung-uk Kim 2985f9b24faSJung-uk Kim /* Point all children to parent */ 2995f9b24faSJung-uk Kim 3005f9b24faSJung-uk Kim Child->Asl.Parent = Op; 3015f9b24faSJung-uk Kim 3025f9b24faSJung-uk Kim /* Link children in a peer list */ 3035f9b24faSJung-uk Kim 3045f9b24faSJung-uk Kim if (PrevChild) 3055f9b24faSJung-uk Kim { 3065f9b24faSJung-uk Kim PrevChild->Asl.Next = Child; 3075f9b24faSJung-uk Kim }; 3085f9b24faSJung-uk Kim 3095f9b24faSJung-uk Kim /* Get the comment from last child in the resource template call */ 3105f9b24faSJung-uk Kim 311f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments && 3125f9b24faSJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_RESOURCETEMPLATE)) 3135f9b24faSJung-uk Kim { 3145f9b24faSJung-uk Kim CvDbgPrint ("Transferred current comment list to this op.\n"); 3155f9b24faSJung-uk Kim Op->Asl.CommentList = Child->Asl.CommentList; 3165f9b24faSJung-uk Kim Child->Asl.CommentList = NULL; 3175f9b24faSJung-uk Kim 3185f9b24faSJung-uk Kim Op->Asl.InlineComment = Child->Asl.InlineComment; 3195f9b24faSJung-uk Kim Child->Asl.InlineComment = NULL; 3205f9b24faSJung-uk Kim } 3215f9b24faSJung-uk Kim 3225f9b24faSJung-uk Kim /* 3235f9b24faSJung-uk Kim * This child might be a list, point all ops in the list 3245f9b24faSJung-uk Kim * to the same parent 3255f9b24faSJung-uk Kim */ 3265f9b24faSJung-uk Kim while (Child->Asl.Next) 3275f9b24faSJung-uk Kim { 3285f9b24faSJung-uk Kim Child = Child->Asl.Next; 3295f9b24faSJung-uk Kim Child->Asl.Parent = Op; 3305f9b24faSJung-uk Kim } 3315f9b24faSJung-uk Kim 3325f9b24faSJung-uk Kim PrevChild = Child; 3335f9b24faSJung-uk Kim } 3345f9b24faSJung-uk Kim 3355f9b24faSJung-uk Kim va_end(ap); 3365f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n"); 3375f9b24faSJung-uk Kim return (Op); 3385f9b24faSJung-uk Kim } 3395f9b24faSJung-uk Kim 3405f9b24faSJung-uk Kim 3415f9b24faSJung-uk Kim /******************************************************************************* 3425f9b24faSJung-uk Kim * 3435f9b24faSJung-uk Kim * FUNCTION: TrCreateLeafOp 3445f9b24faSJung-uk Kim * 3455f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - New opcode to be assigned to the op 3465f9b24faSJung-uk Kim * 3475f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 3485f9b24faSJung-uk Kim * 3495f9b24faSJung-uk Kim * DESCRIPTION: Create a simple leaf op (no children or peers, and no value 3505f9b24faSJung-uk Kim * assigned to the op) 3515f9b24faSJung-uk Kim * 3525f9b24faSJung-uk Kim ******************************************************************************/ 3535f9b24faSJung-uk Kim 3545f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 3555f9b24faSJung-uk Kim TrCreateLeafOp ( 3565f9b24faSJung-uk Kim UINT32 ParseOpcode) 3575f9b24faSJung-uk Kim { 3585f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 3595f9b24faSJung-uk Kim 3605f9b24faSJung-uk Kim 3615f9b24faSJung-uk Kim Op = TrAllocateOp (ParseOpcode); 3625f9b24faSJung-uk Kim 3635f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 3645f9b24faSJung-uk Kim "\nCreateLeafOp Ln/Col %u/%u NewOp %p Op %s\n\n", 3655f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode)); 3665f9b24faSJung-uk Kim 3675f9b24faSJung-uk Kim return (Op); 3685f9b24faSJung-uk Kim } 3695f9b24faSJung-uk Kim 3705f9b24faSJung-uk Kim 3715f9b24faSJung-uk Kim /******************************************************************************* 3725f9b24faSJung-uk Kim * 3735f9b24faSJung-uk Kim * FUNCTION: TrCreateValuedLeafOp 3745f9b24faSJung-uk Kim * 3755f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - New opcode to be assigned to the op 3765f9b24faSJung-uk Kim * Value - Value to be assigned to the op 3775f9b24faSJung-uk Kim * 3785f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 3795f9b24faSJung-uk Kim * 3805f9b24faSJung-uk Kim * DESCRIPTION: Create a leaf op (no children or peers) with a value 3815f9b24faSJung-uk Kim * assigned to it 3825f9b24faSJung-uk Kim * 3835f9b24faSJung-uk Kim ******************************************************************************/ 3845f9b24faSJung-uk Kim 3855f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 3865f9b24faSJung-uk Kim TrCreateValuedLeafOp ( 3875f9b24faSJung-uk Kim UINT32 ParseOpcode, 3885f9b24faSJung-uk Kim UINT64 Value) 3895f9b24faSJung-uk Kim { 3905f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 3915f9b24faSJung-uk Kim 3925f9b24faSJung-uk Kim 3935f9b24faSJung-uk Kim Op = TrAllocateOp (ParseOpcode); 3945f9b24faSJung-uk Kim Op->Asl.Value.Integer = Value; 3955f9b24faSJung-uk Kim 3965f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 3975f9b24faSJung-uk Kim "\nCreateValuedLeafOp Ln/Col %u/%u NewOp %p " 3985f9b24faSJung-uk Kim "Op %s Value %8.8X%8.8X ", 3995f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode), 4005f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Value)); 4015f9b24faSJung-uk Kim 4025f9b24faSJung-uk Kim switch (ParseOpcode) 4035f9b24faSJung-uk Kim { 4045f9b24faSJung-uk Kim case PARSEOP_STRING_LITERAL: 4055f9b24faSJung-uk Kim 4065f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "STRING->%s", Value); 4075f9b24faSJung-uk Kim break; 4085f9b24faSJung-uk Kim 4095f9b24faSJung-uk Kim case PARSEOP_NAMESEG: 4105f9b24faSJung-uk Kim 4115f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Value); 4125f9b24faSJung-uk Kim break; 4135f9b24faSJung-uk Kim 4145f9b24faSJung-uk Kim case PARSEOP_NAMESTRING: 4155f9b24faSJung-uk Kim 4165f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Value); 4175f9b24faSJung-uk Kim break; 4185f9b24faSJung-uk Kim 4195f9b24faSJung-uk Kim case PARSEOP_EISAID: 4205f9b24faSJung-uk Kim 4215f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "EISAID->%s", Value); 4225f9b24faSJung-uk Kim break; 4235f9b24faSJung-uk Kim 4245f9b24faSJung-uk Kim case PARSEOP_METHOD: 4255f9b24faSJung-uk Kim 4265f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "METHOD"); 4275f9b24faSJung-uk Kim break; 4285f9b24faSJung-uk Kim 4295f9b24faSJung-uk Kim case PARSEOP_INTEGER: 4305f9b24faSJung-uk Kim 4315f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "INTEGER->%8.8X%8.8X", 4325f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Value)); 4335f9b24faSJung-uk Kim break; 4345f9b24faSJung-uk Kim 4355f9b24faSJung-uk Kim default: 4365f9b24faSJung-uk Kim break; 4375f9b24faSJung-uk Kim } 4385f9b24faSJung-uk Kim 4395f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); 4405f9b24faSJung-uk Kim return (Op); 4415f9b24faSJung-uk Kim } 4425f9b24faSJung-uk Kim 4435f9b24faSJung-uk Kim 4445f9b24faSJung-uk Kim /******************************************************************************* 4455f9b24faSJung-uk Kim * 4465f9b24faSJung-uk Kim * FUNCTION: TrCreateTargetOp 4475f9b24faSJung-uk Kim * 4485f9b24faSJung-uk Kim * PARAMETERS: OriginalOp - Op to be copied 4495f9b24faSJung-uk Kim * 4505f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 4515f9b24faSJung-uk Kim * 4525f9b24faSJung-uk Kim * DESCRIPTION: Copy an existing op (and subtree). Used in ASL+ (C-style) 4535f9b24faSJung-uk Kim * expressions where the target is the same as one of the 4545f9b24faSJung-uk Kim * operands. A new op and subtree must be created from the 4555f9b24faSJung-uk Kim * original so that the parse tree can be linked properly. 4565f9b24faSJung-uk Kim * 4575f9b24faSJung-uk Kim * NOTE: This code is specific to target operands that are the last 4585f9b24faSJung-uk Kim * operand in an ASL/AML operator. Meaning that the top-level 4595f9b24faSJung-uk Kim * parse Op in a possible subtree has a NULL Next pointer. 4605f9b24faSJung-uk Kim * This simplifies the recursion. 4615f9b24faSJung-uk Kim * 4625f9b24faSJung-uk Kim * Subtree example: 4635f9b24faSJung-uk Kim * DeRefOf (Local1) += 32 4645f9b24faSJung-uk Kim * 4655f9b24faSJung-uk Kim * This gets converted to: 4665f9b24faSJung-uk Kim * Add (DeRefOf (Local1), 32, DeRefOf (Local1)) 4675f9b24faSJung-uk Kim * 4685f9b24faSJung-uk Kim * Each DeRefOf has a single child, Local1. Even more complex 4695f9b24faSJung-uk Kim * subtrees can be created via the Index and DeRefOf operators. 4705f9b24faSJung-uk Kim * 4715f9b24faSJung-uk Kim ******************************************************************************/ 4725f9b24faSJung-uk Kim 4735f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 4745f9b24faSJung-uk Kim TrCreateTargetOp ( 4755f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *OriginalOp, 4765f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp) 4775f9b24faSJung-uk Kim { 4785f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 4795f9b24faSJung-uk Kim 4805f9b24faSJung-uk Kim 4815f9b24faSJung-uk Kim if (!OriginalOp) 4825f9b24faSJung-uk Kim { 4835f9b24faSJung-uk Kim return (NULL); 4845f9b24faSJung-uk Kim } 4855f9b24faSJung-uk Kim 48667d9aa44SJung-uk Kim Op = UtParseOpCacheCalloc (); 4875f9b24faSJung-uk Kim 4885f9b24faSJung-uk Kim /* Copy the pertinent values (omit link pointer fields) */ 4895f9b24faSJung-uk Kim 4905f9b24faSJung-uk Kim Op->Asl.Value = OriginalOp->Asl.Value; 4915f9b24faSJung-uk Kim Op->Asl.Filename = OriginalOp->Asl.Filename; 4925f9b24faSJung-uk Kim Op->Asl.LineNumber = OriginalOp->Asl.LineNumber; 4935f9b24faSJung-uk Kim Op->Asl.LogicalLineNumber = OriginalOp->Asl.LogicalLineNumber; 4945f9b24faSJung-uk Kim Op->Asl.LogicalByteOffset = OriginalOp->Asl.LogicalByteOffset; 4955f9b24faSJung-uk Kim Op->Asl.Column = OriginalOp->Asl.Column; 4965f9b24faSJung-uk Kim Op->Asl.Flags = OriginalOp->Asl.Flags; 4975f9b24faSJung-uk Kim Op->Asl.CompileFlags = OriginalOp->Asl.CompileFlags; 4985f9b24faSJung-uk Kim Op->Asl.AmlOpcode = OriginalOp->Asl.AmlOpcode; 4995f9b24faSJung-uk Kim Op->Asl.ParseOpcode = OriginalOp->Asl.ParseOpcode; 5005f9b24faSJung-uk Kim Op->Asl.Parent = ParentOp; 5015f9b24faSJung-uk Kim 5025f9b24faSJung-uk Kim UtSetParseOpName (Op); 5035f9b24faSJung-uk Kim 5045f9b24faSJung-uk Kim /* Copy a possible subtree below this op */ 5055f9b24faSJung-uk Kim 5065f9b24faSJung-uk Kim if (OriginalOp->Asl.Child) 5075f9b24faSJung-uk Kim { 5085f9b24faSJung-uk Kim Op->Asl.Child = TrCreateTargetOp (OriginalOp->Asl.Child, Op); 5095f9b24faSJung-uk Kim } 5105f9b24faSJung-uk Kim 5115f9b24faSJung-uk Kim if (OriginalOp->Asl.Next) /* Null for top-level op */ 5125f9b24faSJung-uk Kim { 5135f9b24faSJung-uk Kim Op->Asl.Next = TrCreateTargetOp (OriginalOp->Asl.Next, ParentOp); 5145f9b24faSJung-uk Kim } 5155f9b24faSJung-uk Kim 5165f9b24faSJung-uk Kim return (Op); 5175f9b24faSJung-uk Kim } 5185f9b24faSJung-uk Kim 5195f9b24faSJung-uk Kim 5205f9b24faSJung-uk Kim /******************************************************************************* 5215f9b24faSJung-uk Kim * 5225f9b24faSJung-uk Kim * FUNCTION: TrCreateAssignmentOp 5235f9b24faSJung-uk Kim * 5245f9b24faSJung-uk Kim * PARAMETERS: Target - Assignment target 5255f9b24faSJung-uk Kim * Source - Assignment source 5265f9b24faSJung-uk Kim * 5275f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 5285f9b24faSJung-uk Kim * 5295f9b24faSJung-uk Kim * DESCRIPTION: Implements the C-style '=' operator. It changes the parse 5305f9b24faSJung-uk Kim * tree if possible to utilize the last argument of the math 5315f9b24faSJung-uk Kim * operators which is a target operand -- thus saving invocation 5325f9b24faSJung-uk Kim * of and additional Store() operator. An optimization. 5335f9b24faSJung-uk Kim * 5345f9b24faSJung-uk Kim ******************************************************************************/ 5355f9b24faSJung-uk Kim 5365f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 5375f9b24faSJung-uk Kim TrCreateAssignmentOp ( 5385f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Target, 5395f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Source) 5405f9b24faSJung-uk Kim { 5415f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *TargetOp; 5425f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *SourceOp1; 5435f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *SourceOp2; 5445f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Operator; 5455f9b24faSJung-uk Kim 5465f9b24faSJung-uk Kim 5475f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 5485f9b24faSJung-uk Kim "\nTrCreateAssignmentOp Line [%u to %u] Source %s Target %s\n", 5495f9b24faSJung-uk Kim Source->Asl.LineNumber, Source->Asl.EndLine, 5505f9b24faSJung-uk Kim UtGetOpName (Source->Asl.ParseOpcode), 5515f9b24faSJung-uk Kim UtGetOpName (Target->Asl.ParseOpcode)); 5525f9b24faSJung-uk Kim 5535f9b24faSJung-uk Kim TrSetOpFlags (Target, OP_IS_TARGET); 5545f9b24faSJung-uk Kim 5555f9b24faSJung-uk Kim switch (Source->Asl.ParseOpcode) 5565f9b24faSJung-uk Kim { 5575f9b24faSJung-uk Kim /* 5585f9b24faSJung-uk Kim * Only these operators can be optimized because they have 5595f9b24faSJung-uk Kim * a target operand 5605f9b24faSJung-uk Kim */ 5615f9b24faSJung-uk Kim case PARSEOP_ADD: 5625f9b24faSJung-uk Kim case PARSEOP_AND: 5635f9b24faSJung-uk Kim case PARSEOP_DIVIDE: 5645f9b24faSJung-uk Kim case PARSEOP_INDEX: 5655f9b24faSJung-uk Kim case PARSEOP_MOD: 5665f9b24faSJung-uk Kim case PARSEOP_MULTIPLY: 5675f9b24faSJung-uk Kim case PARSEOP_NOT: 5685f9b24faSJung-uk Kim case PARSEOP_OR: 5695f9b24faSJung-uk Kim case PARSEOP_SHIFTLEFT: 5705f9b24faSJung-uk Kim case PARSEOP_SHIFTRIGHT: 5715f9b24faSJung-uk Kim case PARSEOP_SUBTRACT: 5725f9b24faSJung-uk Kim case PARSEOP_XOR: 5735f9b24faSJung-uk Kim 5745f9b24faSJung-uk Kim break; 5755f9b24faSJung-uk Kim 5765f9b24faSJung-uk Kim /* Otherwise, just create a normal Store operator */ 5775f9b24faSJung-uk Kim 5785f9b24faSJung-uk Kim default: 5795f9b24faSJung-uk Kim goto CannotOptimize; 5805f9b24faSJung-uk Kim } 5815f9b24faSJung-uk Kim 5825f9b24faSJung-uk Kim /* 5835f9b24faSJung-uk Kim * Transform the parse tree such that the target is moved to the 5845f9b24faSJung-uk Kim * last operand of the operator 5855f9b24faSJung-uk Kim */ 5865f9b24faSJung-uk Kim SourceOp1 = Source->Asl.Child; 5875f9b24faSJung-uk Kim SourceOp2 = SourceOp1->Asl.Next; 5885f9b24faSJung-uk Kim 5895f9b24faSJung-uk Kim /* NOT only has one operand, but has a target */ 5905f9b24faSJung-uk Kim 5915f9b24faSJung-uk Kim if (Source->Asl.ParseOpcode == PARSEOP_NOT) 5925f9b24faSJung-uk Kim { 5935f9b24faSJung-uk Kim SourceOp2 = SourceOp1; 5945f9b24faSJung-uk Kim } 5955f9b24faSJung-uk Kim 5965f9b24faSJung-uk Kim /* DIVIDE has an extra target operand (remainder) */ 5975f9b24faSJung-uk Kim 5985f9b24faSJung-uk Kim if (Source->Asl.ParseOpcode == PARSEOP_DIVIDE) 5995f9b24faSJung-uk Kim { 6005f9b24faSJung-uk Kim SourceOp2 = SourceOp2->Asl.Next; 6015f9b24faSJung-uk Kim } 6025f9b24faSJung-uk Kim 6035f9b24faSJung-uk Kim TargetOp = SourceOp2->Asl.Next; 6045f9b24faSJung-uk Kim 6055f9b24faSJung-uk Kim /* 6065f9b24faSJung-uk Kim * Can't perform this optimization if there already is a target 6075f9b24faSJung-uk Kim * for the operator (ZERO is a "no target" placeholder). 6085f9b24faSJung-uk Kim */ 6095f9b24faSJung-uk Kim if (TargetOp->Asl.ParseOpcode != PARSEOP_ZERO) 6105f9b24faSJung-uk Kim { 6115f9b24faSJung-uk Kim goto CannotOptimize; 6125f9b24faSJung-uk Kim } 6135f9b24faSJung-uk Kim 6145f9b24faSJung-uk Kim /* Link in the target as the final operand */ 6155f9b24faSJung-uk Kim 6165f9b24faSJung-uk Kim SourceOp2->Asl.Next = Target; 6175f9b24faSJung-uk Kim Target->Asl.Parent = Source; 6185f9b24faSJung-uk Kim return (Source); 6195f9b24faSJung-uk Kim 6205f9b24faSJung-uk Kim 6215f9b24faSJung-uk Kim CannotOptimize: 6225f9b24faSJung-uk Kim 6235f9b24faSJung-uk Kim Operator = TrAllocateOp (PARSEOP_STORE); 6245f9b24faSJung-uk Kim TrLinkOpChildren (Operator, 2, Source, Target); 6255f9b24faSJung-uk Kim 6265f9b24faSJung-uk Kim /* Set the appropriate line numbers for the new op */ 6275f9b24faSJung-uk Kim 6285f9b24faSJung-uk Kim Operator->Asl.LineNumber = Target->Asl.LineNumber; 6295f9b24faSJung-uk Kim Operator->Asl.LogicalLineNumber = Target->Asl.LogicalLineNumber; 6305f9b24faSJung-uk Kim Operator->Asl.LogicalByteOffset = Target->Asl.LogicalByteOffset; 6315f9b24faSJung-uk Kim Operator->Asl.Column = Target->Asl.Column; 6325f9b24faSJung-uk Kim 6335f9b24faSJung-uk Kim return (Operator); 6345f9b24faSJung-uk Kim } 6355f9b24faSJung-uk Kim 6365f9b24faSJung-uk Kim 6375f9b24faSJung-uk Kim /******************************************************************************* 6385f9b24faSJung-uk Kim * 6395f9b24faSJung-uk Kim * FUNCTION: TrCreateNullTargetOp 6405f9b24faSJung-uk Kim * 6415f9b24faSJung-uk Kim * PARAMETERS: None 6425f9b24faSJung-uk Kim * 6435f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 6445f9b24faSJung-uk Kim * 6455f9b24faSJung-uk Kim * DESCRIPTION: Create a "null" target op. This is defined by the ACPI 6465f9b24faSJung-uk Kim * specification to be a zero AML opcode, and indicates that 6475f9b24faSJung-uk Kim * no target has been specified for the parent operation 6485f9b24faSJung-uk Kim * 6495f9b24faSJung-uk Kim ******************************************************************************/ 6505f9b24faSJung-uk Kim 6515f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 6525f9b24faSJung-uk Kim TrCreateNullTargetOp ( 6535f9b24faSJung-uk Kim void) 6545f9b24faSJung-uk Kim { 6555f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 6565f9b24faSJung-uk Kim 6575f9b24faSJung-uk Kim 6585f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_ZERO); 6595f9b24faSJung-uk Kim Op->Asl.CompileFlags |= (OP_IS_TARGET | OP_COMPILE_TIME_CONST); 6605f9b24faSJung-uk Kim 6615f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 6625f9b24faSJung-uk Kim "\nCreateNullTargetOp Ln/Col %u/%u NewOp %p Op %s\n", 6635f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, 6645f9b24faSJung-uk Kim UtGetOpName (Op->Asl.ParseOpcode)); 6655f9b24faSJung-uk Kim 6665f9b24faSJung-uk Kim return (Op); 6675f9b24faSJung-uk Kim } 6685f9b24faSJung-uk Kim 6695f9b24faSJung-uk Kim 6705f9b24faSJung-uk Kim /******************************************************************************* 6715f9b24faSJung-uk Kim * 6725f9b24faSJung-uk Kim * FUNCTION: TrCreateConstantLeafOp 6735f9b24faSJung-uk Kim * 6745f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - The constant opcode 6755f9b24faSJung-uk Kim * 6765f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 6775f9b24faSJung-uk Kim * 6785f9b24faSJung-uk Kim * DESCRIPTION: Create a leaf op (no children or peers) for one of the 6795f9b24faSJung-uk Kim * special constants - __LINE__, __FILE__, and __DATE__. 6805f9b24faSJung-uk Kim * 6815f9b24faSJung-uk Kim * Note: The fullimplemenation of __METHOD__ cannot happen here because we 6825f9b24faSJung-uk Kim * don't have a full parse tree at this time and cannot find the parent 6835f9b24faSJung-uk Kim * control method. __METHOD__ must be implemented later, after the parse 6845f9b24faSJung-uk Kim * tree has been fully constructed. 6855f9b24faSJung-uk Kim * 6865f9b24faSJung-uk Kim ******************************************************************************/ 6875f9b24faSJung-uk Kim 6885f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 6895f9b24faSJung-uk Kim TrCreateConstantLeafOp ( 6905f9b24faSJung-uk Kim UINT32 ParseOpcode) 6915f9b24faSJung-uk Kim { 6925f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op = NULL; 6935f9b24faSJung-uk Kim time_t CurrentTime; 6945f9b24faSJung-uk Kim char *StaticTimeString; 6955f9b24faSJung-uk Kim char *TimeString; 6965f9b24faSJung-uk Kim char *Filename; 6975f9b24faSJung-uk Kim 6985f9b24faSJung-uk Kim 6995f9b24faSJung-uk Kim switch (ParseOpcode) 7005f9b24faSJung-uk Kim { 7015f9b24faSJung-uk Kim case PARSEOP___LINE__: 7025f9b24faSJung-uk Kim 7035f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_INTEGER); 7045f9b24faSJung-uk Kim Op->Asl.Value.Integer = Op->Asl.LineNumber; 7055f9b24faSJung-uk Kim break; 7065f9b24faSJung-uk Kim 7075f9b24faSJung-uk Kim case PARSEOP___METHOD__: 7085f9b24faSJung-uk Kim 7095f9b24faSJung-uk Kim /* Will become a string literal later */ 7105f9b24faSJung-uk Kim 7115f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP___METHOD__); 7125f9b24faSJung-uk Kim Op->Asl.Value.String = NULL; 7135f9b24faSJung-uk Kim break; 7145f9b24faSJung-uk Kim 7155f9b24faSJung-uk Kim case PARSEOP___PATH__: 7165f9b24faSJung-uk Kim 7175f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7185f9b24faSJung-uk Kim 7195f9b24faSJung-uk Kim /* Op.Asl.Filename contains the full pathname to the file */ 7205f9b24faSJung-uk Kim 7215f9b24faSJung-uk Kim Op->Asl.Value.String = Op->Asl.Filename; 7225f9b24faSJung-uk Kim break; 7235f9b24faSJung-uk Kim 7245f9b24faSJung-uk Kim case PARSEOP___FILE__: 7255f9b24faSJung-uk Kim 7265f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7275f9b24faSJung-uk Kim 7285f9b24faSJung-uk Kim /* Get the simple filename from the full path */ 7295f9b24faSJung-uk Kim 7305f9b24faSJung-uk Kim FlSplitInputPathname (Op->Asl.Filename, NULL, &Filename); 7315f9b24faSJung-uk Kim Op->Asl.Value.String = Filename; 7325f9b24faSJung-uk Kim break; 7335f9b24faSJung-uk Kim 7345f9b24faSJung-uk Kim case PARSEOP___DATE__: 7355f9b24faSJung-uk Kim 7365f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7375f9b24faSJung-uk Kim 7385f9b24faSJung-uk Kim /* Get a copy of the current time */ 7395f9b24faSJung-uk Kim 7405f9b24faSJung-uk Kim CurrentTime = time (NULL); 7415f9b24faSJung-uk Kim StaticTimeString = ctime (&CurrentTime); 7425f9b24faSJung-uk Kim TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1); 7435f9b24faSJung-uk Kim strcpy (TimeString, StaticTimeString); 7445f9b24faSJung-uk Kim 7455f9b24faSJung-uk Kim TimeString[strlen(TimeString) -1] = 0; /* Remove trailing newline */ 7465f9b24faSJung-uk Kim Op->Asl.Value.String = TimeString; 7475f9b24faSJung-uk Kim break; 7485f9b24faSJung-uk Kim 7495f9b24faSJung-uk Kim default: /* This would be an internal error */ 7505f9b24faSJung-uk Kim 7515f9b24faSJung-uk Kim return (NULL); 7525f9b24faSJung-uk Kim } 7535f9b24faSJung-uk Kim 7545f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 7555f9b24faSJung-uk Kim "\nCreateConstantLeafOp Ln/Col %u/%u NewOp %p " 7565f9b24faSJung-uk Kim "Op %s Value %8.8X%8.8X \n", 7575f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode), 7585f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 7595f9b24faSJung-uk Kim 7605f9b24faSJung-uk Kim return (Op); 7615f9b24faSJung-uk Kim } 7625f9b24faSJung-uk Kim 7635f9b24faSJung-uk Kim 7645f9b24faSJung-uk Kim /******************************************************************************* 7655f9b24faSJung-uk Kim * 7665f9b24faSJung-uk Kim * FUNCTION: TrAllocateOp 7675f9b24faSJung-uk Kim * 7685f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - Opcode to be assigned to the op 7695f9b24faSJung-uk Kim * 7705f9b24faSJung-uk Kim * RETURN: New parse op. Aborts on allocation failure 7715f9b24faSJung-uk Kim * 7725f9b24faSJung-uk Kim * DESCRIPTION: Allocate and initialize a new parse op for the parse tree 7735f9b24faSJung-uk Kim * 7745f9b24faSJung-uk Kim ******************************************************************************/ 7755f9b24faSJung-uk Kim 7765f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 7775f9b24faSJung-uk Kim TrAllocateOp ( 7785f9b24faSJung-uk Kim UINT32 ParseOpcode) 7795f9b24faSJung-uk Kim { 7805f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 7815f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *LatestOp; 7825f9b24faSJung-uk Kim 7835f9b24faSJung-uk Kim 78467d9aa44SJung-uk Kim Op = UtParseOpCacheCalloc (); 7855f9b24faSJung-uk Kim 7865f9b24faSJung-uk Kim Op->Asl.ParseOpcode = (UINT16) ParseOpcode; 7876f1f1a63SJung-uk Kim Op->Asl.Filename = AslGbl_Files[ASL_FILE_INPUT].Filename; 7886f1f1a63SJung-uk Kim Op->Asl.LineNumber = AslGbl_CurrentLineNumber; 7896f1f1a63SJung-uk Kim Op->Asl.LogicalLineNumber = AslGbl_LogicalLineNumber; 7906f1f1a63SJung-uk Kim Op->Asl.LogicalByteOffset = AslGbl_CurrentLineOffset; 7916f1f1a63SJung-uk Kim Op->Asl.Column = AslGbl_CurrentColumn; 7925f9b24faSJung-uk Kim 7935f9b24faSJung-uk Kim UtSetParseOpName (Op); 7945f9b24faSJung-uk Kim 7955f9b24faSJung-uk Kim /* The following is for capturing comments */ 7965f9b24faSJung-uk Kim 797f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments) 7985f9b24faSJung-uk Kim { 7996f1f1a63SJung-uk Kim LatestOp = AslGbl_CommentState.LatestParseOp; 8005f9b24faSJung-uk Kim Op->Asl.InlineComment = NULL; 8015f9b24faSJung-uk Kim Op->Asl.EndNodeComment = NULL; 8025f9b24faSJung-uk Kim Op->Asl.CommentList = NULL; 8035f9b24faSJung-uk Kim Op->Asl.FileChanged = FALSE; 8045f9b24faSJung-uk Kim 8055f9b24faSJung-uk Kim /* 8065f9b24faSJung-uk Kim * Check to see if the file name has changed before resetting the 8075f9b24faSJung-uk Kim * latest parse op. 8085f9b24faSJung-uk Kim */ 8095f9b24faSJung-uk Kim if (LatestOp && 8105f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_INCLUDE) && 8115f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_INCLUDE_END) && 8125f9b24faSJung-uk Kim strcmp (LatestOp->Asl.Filename, Op->Asl.Filename)) 8135f9b24faSJung-uk Kim { 8145f9b24faSJung-uk Kim CvDbgPrint ("latest op: %s\n", LatestOp->Asl.ParseOpName); 8155f9b24faSJung-uk Kim Op->Asl.FileChanged = TRUE; 8166f1f1a63SJung-uk Kim if (AslGbl_IncludeFileStack) 8175f9b24faSJung-uk Kim { 8186f1f1a63SJung-uk Kim Op->Asl.ParentFilename = AslGbl_IncludeFileStack->Filename; 8195f9b24faSJung-uk Kim } 8205f9b24faSJung-uk Kim else 8215f9b24faSJung-uk Kim { 8225f9b24faSJung-uk Kim Op->Asl.ParentFilename = NULL; 8235f9b24faSJung-uk Kim } 8245f9b24faSJung-uk Kim } 8255f9b24faSJung-uk Kim 8266f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp = Op; 8275f9b24faSJung-uk Kim CvDbgPrint ("TrAllocateOp=Set latest parse op to this op.\n"); 8285f9b24faSJung-uk Kim CvDbgPrint (" Op->Asl.ParseOpName = %s\n", 8296f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp->Asl.ParseOpName); 8305f9b24faSJung-uk Kim CvDbgPrint (" Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode); 8315f9b24faSJung-uk Kim 8325f9b24faSJung-uk Kim if (Op->Asl.FileChanged) 8335f9b24faSJung-uk Kim { 8345f9b24faSJung-uk Kim CvDbgPrint(" file has been changed!\n"); 8355f9b24faSJung-uk Kim } 8365f9b24faSJung-uk Kim 8375f9b24faSJung-uk Kim /* 8385f9b24faSJung-uk Kim * if this parse op's syntax uses () and {} (i.e. Package(1){0x00}) then 8395f9b24faSJung-uk Kim * set a flag in the comment state. This facilitates paring comments for 8405f9b24faSJung-uk Kim * these types of opcodes. 8415f9b24faSJung-uk Kim */ 8425f9b24faSJung-uk Kim if ((CvParseOpBlockType(Op) == (BLOCK_PAREN | BLOCK_BRACE)) && 8435f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_DEFINITION_BLOCK)) 8445f9b24faSJung-uk Kim { 8455f9b24faSJung-uk Kim CvDbgPrint ("Parsing paren/Brace op now!\n"); 8466f1f1a63SJung-uk Kim AslGbl_CommentState.ParsingParenBraceNode = Op; 8475f9b24faSJung-uk Kim } 8485f9b24faSJung-uk Kim 8496f1f1a63SJung-uk Kim if (AslGbl_CommentListHead) 8505f9b24faSJung-uk Kim { 8515f9b24faSJung-uk Kim CvDbgPrint ("Transferring...\n"); 8526f1f1a63SJung-uk Kim Op->Asl.CommentList = AslGbl_CommentListHead; 8536f1f1a63SJung-uk Kim AslGbl_CommentListHead = NULL; 8546f1f1a63SJung-uk Kim AslGbl_CommentListTail = NULL; 8555f9b24faSJung-uk Kim CvDbgPrint (" Transferred current comment list to this op.\n"); 8565f9b24faSJung-uk Kim CvDbgPrint (" %s\n", Op->Asl.CommentList->Comment); 8575f9b24faSJung-uk Kim } 8585f9b24faSJung-uk Kim 8596f1f1a63SJung-uk Kim if (AslGbl_InlineCommentBuffer) 8605f9b24faSJung-uk Kim { 8616f1f1a63SJung-uk Kim Op->Asl.InlineComment = AslGbl_InlineCommentBuffer; 8626f1f1a63SJung-uk Kim AslGbl_InlineCommentBuffer = NULL; 8635f9b24faSJung-uk Kim CvDbgPrint ("Transferred current inline comment list to this op.\n"); 8645f9b24faSJung-uk Kim } 8655f9b24faSJung-uk Kim } 8665f9b24faSJung-uk Kim 8675f9b24faSJung-uk Kim return (Op); 8685f9b24faSJung-uk Kim } 8695f9b24faSJung-uk Kim 8705f9b24faSJung-uk Kim 8715f9b24faSJung-uk Kim /******************************************************************************* 8725f9b24faSJung-uk Kim * 8735f9b24faSJung-uk Kim * FUNCTION: TrPrintOpFlags 8745f9b24faSJung-uk Kim * 8755f9b24faSJung-uk Kim * PARAMETERS: Flags - Flags word to be decoded 8765f9b24faSJung-uk Kim * OutputLevel - Debug output level: ASL_TREE_OUTPUT etc. 8775f9b24faSJung-uk Kim * 8785f9b24faSJung-uk Kim * RETURN: None 8795f9b24faSJung-uk Kim * 8805f9b24faSJung-uk Kim * DESCRIPTION: Decode a flags word to text. Displays all flags that are set. 8815f9b24faSJung-uk Kim * 8825f9b24faSJung-uk Kim ******************************************************************************/ 8835f9b24faSJung-uk Kim 8845f9b24faSJung-uk Kim void 8855f9b24faSJung-uk Kim TrPrintOpFlags ( 8865f9b24faSJung-uk Kim UINT32 Flags, 8875f9b24faSJung-uk Kim UINT32 OutputLevel) 8885f9b24faSJung-uk Kim { 8895f9b24faSJung-uk Kim UINT32 FlagBit = 1; 8905f9b24faSJung-uk Kim UINT32 i; 8915f9b24faSJung-uk Kim 8925f9b24faSJung-uk Kim 8935f9b24faSJung-uk Kim for (i = 0; i < ACPI_NUM_OP_FLAGS; i++) 8945f9b24faSJung-uk Kim { 8955f9b24faSJung-uk Kim if (Flags & FlagBit) 8965f9b24faSJung-uk Kim { 8976f1f1a63SJung-uk Kim DbgPrint (OutputLevel, " %s", AslGbl_OpFlagNames[i]); 8985f9b24faSJung-uk Kim } 8995f9b24faSJung-uk Kim 9005f9b24faSJung-uk Kim FlagBit <<= 1; 9015f9b24faSJung-uk Kim } 9025f9b24faSJung-uk Kim } 903