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 * 11f425b8beSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2020, 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; 391f15e9afbSJung-uk Kim UINT32 i; 392f15e9afbSJung-uk Kim char *StringPtr = NULL; 3935f9b24faSJung-uk Kim 3945f9b24faSJung-uk Kim 3955f9b24faSJung-uk Kim Op = TrAllocateOp (ParseOpcode); 3965f9b24faSJung-uk Kim Op->Asl.Value.Integer = Value; 3975f9b24faSJung-uk Kim 3985f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 3995f9b24faSJung-uk Kim "\nCreateValuedLeafOp Ln/Col %u/%u NewOp %p " 4005f9b24faSJung-uk Kim "Op %s Value %8.8X%8.8X ", 4015f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode), 4025f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Value)); 4035f9b24faSJung-uk Kim 4045f9b24faSJung-uk Kim switch (ParseOpcode) 4055f9b24faSJung-uk Kim { 4065f9b24faSJung-uk Kim case PARSEOP_STRING_LITERAL: 4075f9b24faSJung-uk Kim 408a009b7dcSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "STRING->%s", Op->Asl.Value.String); 4095f9b24faSJung-uk Kim break; 4105f9b24faSJung-uk Kim 4115f9b24faSJung-uk Kim case PARSEOP_NAMESEG: 4125f9b24faSJung-uk Kim 413f15e9afbSJung-uk Kim /* Check for mixed case (or all lower case). Issue a remark in this case */ 414f15e9afbSJung-uk Kim 415f15e9afbSJung-uk Kim for (i = 0; i < ACPI_NAMESEG_SIZE; i++) 416f15e9afbSJung-uk Kim { 417385fb5d9SJung-uk Kim if (islower ((int) Op->Asl.Value.Name[i])) 418f15e9afbSJung-uk Kim { 419f15e9afbSJung-uk Kim AcpiUtStrupr (&Op->Asl.Value.Name[i]); 420f15e9afbSJung-uk Kim AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMESEG, Op, Op->Asl.Value.Name); 421f15e9afbSJung-uk Kim break; 422f15e9afbSJung-uk Kim } 423f15e9afbSJung-uk Kim } 424a009b7dcSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Op->Asl.Value.String); 4255f9b24faSJung-uk Kim break; 4265f9b24faSJung-uk Kim 4275f9b24faSJung-uk Kim case PARSEOP_NAMESTRING: 4285f9b24faSJung-uk Kim 429f15e9afbSJung-uk Kim /* Check for mixed case (or all lower case). Issue a remark in this case */ 430f15e9afbSJung-uk Kim 431f15e9afbSJung-uk Kim StringPtr = Op->Asl.Value.Name; 432f15e9afbSJung-uk Kim for (i = 0; *StringPtr; i++) 433f15e9afbSJung-uk Kim { 434385fb5d9SJung-uk Kim if (islower ((int) *StringPtr)) 435f15e9afbSJung-uk Kim { 436f15e9afbSJung-uk Kim AcpiUtStrupr (&Op->Asl.Value.Name[i]); 437f15e9afbSJung-uk Kim AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMEPATH, Op, Op->Asl.Value.Name); 438f15e9afbSJung-uk Kim break; 439f15e9afbSJung-uk Kim } 440f15e9afbSJung-uk Kim StringPtr++; 441f15e9afbSJung-uk Kim } 442a009b7dcSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Op->Asl.Value.String); 4435f9b24faSJung-uk Kim break; 4445f9b24faSJung-uk Kim 4455f9b24faSJung-uk Kim case PARSEOP_EISAID: 4465f9b24faSJung-uk Kim 447a009b7dcSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "EISAID->%s", Op->Asl.Value.String); 4485f9b24faSJung-uk Kim break; 4495f9b24faSJung-uk Kim 4505f9b24faSJung-uk Kim case PARSEOP_METHOD: 4515f9b24faSJung-uk Kim 4525f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "METHOD"); 4535f9b24faSJung-uk Kim break; 4545f9b24faSJung-uk Kim 4555f9b24faSJung-uk Kim case PARSEOP_INTEGER: 4565f9b24faSJung-uk Kim 4575f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "INTEGER->%8.8X%8.8X", 4585f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Value)); 4595f9b24faSJung-uk Kim break; 4605f9b24faSJung-uk Kim 4615f9b24faSJung-uk Kim default: 4625f9b24faSJung-uk Kim break; 4635f9b24faSJung-uk Kim } 4645f9b24faSJung-uk Kim 4655f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); 4665f9b24faSJung-uk Kim return (Op); 4675f9b24faSJung-uk Kim } 4685f9b24faSJung-uk Kim 4695f9b24faSJung-uk Kim 4705f9b24faSJung-uk Kim /******************************************************************************* 4715f9b24faSJung-uk Kim * 4725f9b24faSJung-uk Kim * FUNCTION: TrCreateTargetOp 4735f9b24faSJung-uk Kim * 4745f9b24faSJung-uk Kim * PARAMETERS: OriginalOp - Op to be copied 4755f9b24faSJung-uk Kim * 4765f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 4775f9b24faSJung-uk Kim * 4785f9b24faSJung-uk Kim * DESCRIPTION: Copy an existing op (and subtree). Used in ASL+ (C-style) 4795f9b24faSJung-uk Kim * expressions where the target is the same as one of the 4805f9b24faSJung-uk Kim * operands. A new op and subtree must be created from the 4815f9b24faSJung-uk Kim * original so that the parse tree can be linked properly. 4825f9b24faSJung-uk Kim * 4835f9b24faSJung-uk Kim * NOTE: This code is specific to target operands that are the last 4845f9b24faSJung-uk Kim * operand in an ASL/AML operator. Meaning that the top-level 4855f9b24faSJung-uk Kim * parse Op in a possible subtree has a NULL Next pointer. 4865f9b24faSJung-uk Kim * This simplifies the recursion. 4875f9b24faSJung-uk Kim * 4885f9b24faSJung-uk Kim * Subtree example: 4895f9b24faSJung-uk Kim * DeRefOf (Local1) += 32 4905f9b24faSJung-uk Kim * 4915f9b24faSJung-uk Kim * This gets converted to: 4925f9b24faSJung-uk Kim * Add (DeRefOf (Local1), 32, DeRefOf (Local1)) 4935f9b24faSJung-uk Kim * 4945f9b24faSJung-uk Kim * Each DeRefOf has a single child, Local1. Even more complex 4955f9b24faSJung-uk Kim * subtrees can be created via the Index and DeRefOf operators. 4965f9b24faSJung-uk Kim * 4975f9b24faSJung-uk Kim ******************************************************************************/ 4985f9b24faSJung-uk Kim 4995f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 5005f9b24faSJung-uk Kim TrCreateTargetOp ( 5015f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *OriginalOp, 5025f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp) 5035f9b24faSJung-uk Kim { 5045f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 5055f9b24faSJung-uk Kim 5065f9b24faSJung-uk Kim 5075f9b24faSJung-uk Kim if (!OriginalOp) 5085f9b24faSJung-uk Kim { 5095f9b24faSJung-uk Kim return (NULL); 5105f9b24faSJung-uk Kim } 5115f9b24faSJung-uk Kim 51267d9aa44SJung-uk Kim Op = UtParseOpCacheCalloc (); 5135f9b24faSJung-uk Kim 5145f9b24faSJung-uk Kim /* Copy the pertinent values (omit link pointer fields) */ 5155f9b24faSJung-uk Kim 5165f9b24faSJung-uk Kim Op->Asl.Value = OriginalOp->Asl.Value; 5175f9b24faSJung-uk Kim Op->Asl.Filename = OriginalOp->Asl.Filename; 5185f9b24faSJung-uk Kim Op->Asl.LineNumber = OriginalOp->Asl.LineNumber; 5195f9b24faSJung-uk Kim Op->Asl.LogicalLineNumber = OriginalOp->Asl.LogicalLineNumber; 5205f9b24faSJung-uk Kim Op->Asl.LogicalByteOffset = OriginalOp->Asl.LogicalByteOffset; 5215f9b24faSJung-uk Kim Op->Asl.Column = OriginalOp->Asl.Column; 5225f9b24faSJung-uk Kim Op->Asl.Flags = OriginalOp->Asl.Flags; 5235f9b24faSJung-uk Kim Op->Asl.CompileFlags = OriginalOp->Asl.CompileFlags; 5245f9b24faSJung-uk Kim Op->Asl.AmlOpcode = OriginalOp->Asl.AmlOpcode; 5255f9b24faSJung-uk Kim Op->Asl.ParseOpcode = OriginalOp->Asl.ParseOpcode; 5265f9b24faSJung-uk Kim Op->Asl.Parent = ParentOp; 5275f9b24faSJung-uk Kim 5285f9b24faSJung-uk Kim UtSetParseOpName (Op); 5295f9b24faSJung-uk Kim 5305f9b24faSJung-uk Kim /* Copy a possible subtree below this op */ 5315f9b24faSJung-uk Kim 5325f9b24faSJung-uk Kim if (OriginalOp->Asl.Child) 5335f9b24faSJung-uk Kim { 5345f9b24faSJung-uk Kim Op->Asl.Child = TrCreateTargetOp (OriginalOp->Asl.Child, Op); 5355f9b24faSJung-uk Kim } 5365f9b24faSJung-uk Kim 5375f9b24faSJung-uk Kim if (OriginalOp->Asl.Next) /* Null for top-level op */ 5385f9b24faSJung-uk Kim { 5395f9b24faSJung-uk Kim Op->Asl.Next = TrCreateTargetOp (OriginalOp->Asl.Next, ParentOp); 5405f9b24faSJung-uk Kim } 5415f9b24faSJung-uk Kim 5425f9b24faSJung-uk Kim return (Op); 5435f9b24faSJung-uk Kim } 5445f9b24faSJung-uk Kim 5455f9b24faSJung-uk Kim 5465f9b24faSJung-uk Kim /******************************************************************************* 5475f9b24faSJung-uk Kim * 5485f9b24faSJung-uk Kim * FUNCTION: TrCreateAssignmentOp 5495f9b24faSJung-uk Kim * 5505f9b24faSJung-uk Kim * PARAMETERS: Target - Assignment target 5515f9b24faSJung-uk Kim * Source - Assignment source 5525f9b24faSJung-uk Kim * 5535f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 5545f9b24faSJung-uk Kim * 5555f9b24faSJung-uk Kim * DESCRIPTION: Implements the C-style '=' operator. It changes the parse 5565f9b24faSJung-uk Kim * tree if possible to utilize the last argument of the math 5575f9b24faSJung-uk Kim * operators which is a target operand -- thus saving invocation 5585f9b24faSJung-uk Kim * of and additional Store() operator. An optimization. 5595f9b24faSJung-uk Kim * 5605f9b24faSJung-uk Kim ******************************************************************************/ 5615f9b24faSJung-uk Kim 5625f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 5635f9b24faSJung-uk Kim TrCreateAssignmentOp ( 5645f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Target, 5655f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Source) 5665f9b24faSJung-uk Kim { 5675f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *TargetOp; 5685f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *SourceOp1; 5695f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *SourceOp2; 5705f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Operator; 5715f9b24faSJung-uk Kim 5725f9b24faSJung-uk Kim 5735f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 5745f9b24faSJung-uk Kim "\nTrCreateAssignmentOp Line [%u to %u] Source %s Target %s\n", 5755f9b24faSJung-uk Kim Source->Asl.LineNumber, Source->Asl.EndLine, 5765f9b24faSJung-uk Kim UtGetOpName (Source->Asl.ParseOpcode), 5775f9b24faSJung-uk Kim UtGetOpName (Target->Asl.ParseOpcode)); 5785f9b24faSJung-uk Kim 5795f9b24faSJung-uk Kim TrSetOpFlags (Target, OP_IS_TARGET); 5805f9b24faSJung-uk Kim 5815f9b24faSJung-uk Kim switch (Source->Asl.ParseOpcode) 5825f9b24faSJung-uk Kim { 5835f9b24faSJung-uk Kim /* 5845f9b24faSJung-uk Kim * Only these operators can be optimized because they have 5855f9b24faSJung-uk Kim * a target operand 5865f9b24faSJung-uk Kim */ 5875f9b24faSJung-uk Kim case PARSEOP_ADD: 5885f9b24faSJung-uk Kim case PARSEOP_AND: 5895f9b24faSJung-uk Kim case PARSEOP_DIVIDE: 5905f9b24faSJung-uk Kim case PARSEOP_INDEX: 5915f9b24faSJung-uk Kim case PARSEOP_MOD: 5925f9b24faSJung-uk Kim case PARSEOP_MULTIPLY: 5935f9b24faSJung-uk Kim case PARSEOP_NOT: 5945f9b24faSJung-uk Kim case PARSEOP_OR: 5955f9b24faSJung-uk Kim case PARSEOP_SHIFTLEFT: 5965f9b24faSJung-uk Kim case PARSEOP_SHIFTRIGHT: 5975f9b24faSJung-uk Kim case PARSEOP_SUBTRACT: 5985f9b24faSJung-uk Kim case PARSEOP_XOR: 5995f9b24faSJung-uk Kim 6005f9b24faSJung-uk Kim break; 6015f9b24faSJung-uk Kim 6025f9b24faSJung-uk Kim /* Otherwise, just create a normal Store operator */ 6035f9b24faSJung-uk Kim 6045f9b24faSJung-uk Kim default: 6055f9b24faSJung-uk Kim goto CannotOptimize; 6065f9b24faSJung-uk Kim } 6075f9b24faSJung-uk Kim 6085f9b24faSJung-uk Kim /* 6095f9b24faSJung-uk Kim * Transform the parse tree such that the target is moved to the 6105f9b24faSJung-uk Kim * last operand of the operator 6115f9b24faSJung-uk Kim */ 6125f9b24faSJung-uk Kim SourceOp1 = Source->Asl.Child; 6135f9b24faSJung-uk Kim SourceOp2 = SourceOp1->Asl.Next; 6145f9b24faSJung-uk Kim 6155f9b24faSJung-uk Kim /* NOT only has one operand, but has a target */ 6165f9b24faSJung-uk Kim 6175f9b24faSJung-uk Kim if (Source->Asl.ParseOpcode == PARSEOP_NOT) 6185f9b24faSJung-uk Kim { 6195f9b24faSJung-uk Kim SourceOp2 = SourceOp1; 6205f9b24faSJung-uk Kim } 6215f9b24faSJung-uk Kim 6225f9b24faSJung-uk Kim /* DIVIDE has an extra target operand (remainder) */ 6235f9b24faSJung-uk Kim 6245f9b24faSJung-uk Kim if (Source->Asl.ParseOpcode == PARSEOP_DIVIDE) 6255f9b24faSJung-uk Kim { 6265f9b24faSJung-uk Kim SourceOp2 = SourceOp2->Asl.Next; 6275f9b24faSJung-uk Kim } 6285f9b24faSJung-uk Kim 6295f9b24faSJung-uk Kim TargetOp = SourceOp2->Asl.Next; 6305f9b24faSJung-uk Kim 6315f9b24faSJung-uk Kim /* 6325f9b24faSJung-uk Kim * Can't perform this optimization if there already is a target 6335f9b24faSJung-uk Kim * for the operator (ZERO is a "no target" placeholder). 6345f9b24faSJung-uk Kim */ 6355f9b24faSJung-uk Kim if (TargetOp->Asl.ParseOpcode != PARSEOP_ZERO) 6365f9b24faSJung-uk Kim { 6375f9b24faSJung-uk Kim goto CannotOptimize; 6385f9b24faSJung-uk Kim } 6395f9b24faSJung-uk Kim 6405f9b24faSJung-uk Kim /* Link in the target as the final operand */ 6415f9b24faSJung-uk Kim 6425f9b24faSJung-uk Kim SourceOp2->Asl.Next = Target; 6435f9b24faSJung-uk Kim Target->Asl.Parent = Source; 6445f9b24faSJung-uk Kim return (Source); 6455f9b24faSJung-uk Kim 6465f9b24faSJung-uk Kim 6475f9b24faSJung-uk Kim CannotOptimize: 6485f9b24faSJung-uk Kim 6495f9b24faSJung-uk Kim Operator = TrAllocateOp (PARSEOP_STORE); 6505f9b24faSJung-uk Kim TrLinkOpChildren (Operator, 2, Source, Target); 6515f9b24faSJung-uk Kim 6525f9b24faSJung-uk Kim /* Set the appropriate line numbers for the new op */ 6535f9b24faSJung-uk Kim 6545f9b24faSJung-uk Kim Operator->Asl.LineNumber = Target->Asl.LineNumber; 6555f9b24faSJung-uk Kim Operator->Asl.LogicalLineNumber = Target->Asl.LogicalLineNumber; 6565f9b24faSJung-uk Kim Operator->Asl.LogicalByteOffset = Target->Asl.LogicalByteOffset; 6575f9b24faSJung-uk Kim Operator->Asl.Column = Target->Asl.Column; 6585f9b24faSJung-uk Kim 6595f9b24faSJung-uk Kim return (Operator); 6605f9b24faSJung-uk Kim } 6615f9b24faSJung-uk Kim 6625f9b24faSJung-uk Kim 6635f9b24faSJung-uk Kim /******************************************************************************* 6645f9b24faSJung-uk Kim * 6655f9b24faSJung-uk Kim * FUNCTION: TrCreateNullTargetOp 6665f9b24faSJung-uk Kim * 6675f9b24faSJung-uk Kim * PARAMETERS: None 6685f9b24faSJung-uk Kim * 6695f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 6705f9b24faSJung-uk Kim * 6715f9b24faSJung-uk Kim * DESCRIPTION: Create a "null" target op. This is defined by the ACPI 6725f9b24faSJung-uk Kim * specification to be a zero AML opcode, and indicates that 6735f9b24faSJung-uk Kim * no target has been specified for the parent operation 6745f9b24faSJung-uk Kim * 6755f9b24faSJung-uk Kim ******************************************************************************/ 6765f9b24faSJung-uk Kim 6775f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 6785f9b24faSJung-uk Kim TrCreateNullTargetOp ( 6795f9b24faSJung-uk Kim void) 6805f9b24faSJung-uk Kim { 6815f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 6825f9b24faSJung-uk Kim 6835f9b24faSJung-uk Kim 6845f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_ZERO); 6855f9b24faSJung-uk Kim Op->Asl.CompileFlags |= (OP_IS_TARGET | OP_COMPILE_TIME_CONST); 6865f9b24faSJung-uk Kim 6875f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 6885f9b24faSJung-uk Kim "\nCreateNullTargetOp Ln/Col %u/%u NewOp %p Op %s\n", 6895f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, 6905f9b24faSJung-uk Kim UtGetOpName (Op->Asl.ParseOpcode)); 6915f9b24faSJung-uk Kim 6925f9b24faSJung-uk Kim return (Op); 6935f9b24faSJung-uk Kim } 6945f9b24faSJung-uk Kim 6955f9b24faSJung-uk Kim 6965f9b24faSJung-uk Kim /******************************************************************************* 6975f9b24faSJung-uk Kim * 6985f9b24faSJung-uk Kim * FUNCTION: TrCreateConstantLeafOp 6995f9b24faSJung-uk Kim * 7005f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - The constant opcode 7015f9b24faSJung-uk Kim * 7025f9b24faSJung-uk Kim * RETURN: Pointer to the new op. Aborts on allocation failure 7035f9b24faSJung-uk Kim * 7045f9b24faSJung-uk Kim * DESCRIPTION: Create a leaf op (no children or peers) for one of the 7055f9b24faSJung-uk Kim * special constants - __LINE__, __FILE__, and __DATE__. 7065f9b24faSJung-uk Kim * 7075f9b24faSJung-uk Kim * Note: The fullimplemenation of __METHOD__ cannot happen here because we 7085f9b24faSJung-uk Kim * don't have a full parse tree at this time and cannot find the parent 7095f9b24faSJung-uk Kim * control method. __METHOD__ must be implemented later, after the parse 7105f9b24faSJung-uk Kim * tree has been fully constructed. 7115f9b24faSJung-uk Kim * 7125f9b24faSJung-uk Kim ******************************************************************************/ 7135f9b24faSJung-uk Kim 7145f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 7155f9b24faSJung-uk Kim TrCreateConstantLeafOp ( 7165f9b24faSJung-uk Kim UINT32 ParseOpcode) 7175f9b24faSJung-uk Kim { 7185f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op = NULL; 7195f9b24faSJung-uk Kim time_t CurrentTime; 7205f9b24faSJung-uk Kim char *StaticTimeString; 7215f9b24faSJung-uk Kim char *TimeString; 722a009b7dcSJung-uk Kim char *Filename = NULL; 723a009b7dcSJung-uk Kim ACPI_STATUS Status; 7245f9b24faSJung-uk Kim 7255f9b24faSJung-uk Kim 7265f9b24faSJung-uk Kim switch (ParseOpcode) 7275f9b24faSJung-uk Kim { 7285f9b24faSJung-uk Kim case PARSEOP___LINE__: 7295f9b24faSJung-uk Kim 7305f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_INTEGER); 7315f9b24faSJung-uk Kim Op->Asl.Value.Integer = Op->Asl.LineNumber; 7325f9b24faSJung-uk Kim break; 7335f9b24faSJung-uk Kim 7345f9b24faSJung-uk Kim case PARSEOP___METHOD__: 7355f9b24faSJung-uk Kim 7365f9b24faSJung-uk Kim /* Will become a string literal later */ 7375f9b24faSJung-uk Kim 7385f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP___METHOD__); 7395f9b24faSJung-uk Kim Op->Asl.Value.String = NULL; 7405f9b24faSJung-uk Kim break; 7415f9b24faSJung-uk Kim 7425f9b24faSJung-uk Kim case PARSEOP___PATH__: 7435f9b24faSJung-uk Kim 7445f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7455f9b24faSJung-uk Kim 7465f9b24faSJung-uk Kim /* Op.Asl.Filename contains the full pathname to the file */ 7475f9b24faSJung-uk Kim 7485f9b24faSJung-uk Kim Op->Asl.Value.String = Op->Asl.Filename; 7495f9b24faSJung-uk Kim break; 7505f9b24faSJung-uk Kim 7515f9b24faSJung-uk Kim case PARSEOP___FILE__: 7525f9b24faSJung-uk Kim 7535f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7545f9b24faSJung-uk Kim 7555f9b24faSJung-uk Kim /* Get the simple filename from the full path */ 7565f9b24faSJung-uk Kim 757a009b7dcSJung-uk Kim Status = FlSplitInputPathname (Op->Asl.Filename, NULL, &Filename); 758a009b7dcSJung-uk Kim if (ACPI_FAILURE (Status)) 759a009b7dcSJung-uk Kim { 760a009b7dcSJung-uk Kim return (NULL); 761a009b7dcSJung-uk Kim } 762a009b7dcSJung-uk Kim 7635f9b24faSJung-uk Kim Op->Asl.Value.String = Filename; 7645f9b24faSJung-uk Kim break; 7655f9b24faSJung-uk Kim 7665f9b24faSJung-uk Kim case PARSEOP___DATE__: 7675f9b24faSJung-uk Kim 7685f9b24faSJung-uk Kim Op = TrAllocateOp (PARSEOP_STRING_LITERAL); 7695f9b24faSJung-uk Kim 7705f9b24faSJung-uk Kim /* Get a copy of the current time */ 7715f9b24faSJung-uk Kim 772ec0234b4SJung-uk Kim Op->Asl.Value.String = ""; 7735f9b24faSJung-uk Kim CurrentTime = time (NULL); 774ec0234b4SJung-uk Kim 7755f9b24faSJung-uk Kim StaticTimeString = ctime (&CurrentTime); 776ec0234b4SJung-uk Kim if (StaticTimeString) 777ec0234b4SJung-uk Kim { 7785f9b24faSJung-uk Kim TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1); 7795f9b24faSJung-uk Kim strcpy (TimeString, StaticTimeString); 7805f9b24faSJung-uk Kim 7815f9b24faSJung-uk Kim TimeString[strlen(TimeString) -1] = 0; /* Remove trailing newline */ 7825f9b24faSJung-uk Kim Op->Asl.Value.String = TimeString; 783ec0234b4SJung-uk Kim } 7845f9b24faSJung-uk Kim break; 7855f9b24faSJung-uk Kim 7865f9b24faSJung-uk Kim default: /* This would be an internal error */ 7875f9b24faSJung-uk Kim 7885f9b24faSJung-uk Kim return (NULL); 7895f9b24faSJung-uk Kim } 7905f9b24faSJung-uk Kim 7915f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 7925f9b24faSJung-uk Kim "\nCreateConstantLeafOp Ln/Col %u/%u NewOp %p " 7935f9b24faSJung-uk Kim "Op %s Value %8.8X%8.8X \n", 7945f9b24faSJung-uk Kim Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode), 7955f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 7965f9b24faSJung-uk Kim 7975f9b24faSJung-uk Kim return (Op); 7985f9b24faSJung-uk Kim } 7995f9b24faSJung-uk Kim 8005f9b24faSJung-uk Kim 8015f9b24faSJung-uk Kim /******************************************************************************* 8025f9b24faSJung-uk Kim * 8035f9b24faSJung-uk Kim * FUNCTION: TrAllocateOp 8045f9b24faSJung-uk Kim * 8055f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - Opcode to be assigned to the op 8065f9b24faSJung-uk Kim * 8075f9b24faSJung-uk Kim * RETURN: New parse op. Aborts on allocation failure 8085f9b24faSJung-uk Kim * 8095f9b24faSJung-uk Kim * DESCRIPTION: Allocate and initialize a new parse op for the parse tree 8105f9b24faSJung-uk Kim * 8115f9b24faSJung-uk Kim ******************************************************************************/ 8125f9b24faSJung-uk Kim 8135f9b24faSJung-uk Kim ACPI_PARSE_OBJECT * 8145f9b24faSJung-uk Kim TrAllocateOp ( 8155f9b24faSJung-uk Kim UINT32 ParseOpcode) 8165f9b24faSJung-uk Kim { 8175f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op; 8185f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *LatestOp; 8195f9b24faSJung-uk Kim 8205f9b24faSJung-uk Kim 82167d9aa44SJung-uk Kim Op = UtParseOpCacheCalloc (); 8225f9b24faSJung-uk Kim 8235f9b24faSJung-uk Kim Op->Asl.ParseOpcode = (UINT16) ParseOpcode; 8246f1f1a63SJung-uk Kim Op->Asl.Filename = AslGbl_Files[ASL_FILE_INPUT].Filename; 8256f1f1a63SJung-uk Kim Op->Asl.LineNumber = AslGbl_CurrentLineNumber; 8266f1f1a63SJung-uk Kim Op->Asl.LogicalLineNumber = AslGbl_LogicalLineNumber; 8276f1f1a63SJung-uk Kim Op->Asl.LogicalByteOffset = AslGbl_CurrentLineOffset; 8286f1f1a63SJung-uk Kim Op->Asl.Column = AslGbl_CurrentColumn; 8295f9b24faSJung-uk Kim 8305f9b24faSJung-uk Kim UtSetParseOpName (Op); 8315f9b24faSJung-uk Kim 8325f9b24faSJung-uk Kim /* The following is for capturing comments */ 8335f9b24faSJung-uk Kim 834f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments) 8355f9b24faSJung-uk Kim { 8366f1f1a63SJung-uk Kim LatestOp = AslGbl_CommentState.LatestParseOp; 8375f9b24faSJung-uk Kim Op->Asl.InlineComment = NULL; 8385f9b24faSJung-uk Kim Op->Asl.EndNodeComment = NULL; 8395f9b24faSJung-uk Kim Op->Asl.CommentList = NULL; 8405f9b24faSJung-uk Kim Op->Asl.FileChanged = FALSE; 8415f9b24faSJung-uk Kim 8425f9b24faSJung-uk Kim /* 8435f9b24faSJung-uk Kim * Check to see if the file name has changed before resetting the 8445f9b24faSJung-uk Kim * latest parse op. 8455f9b24faSJung-uk Kim */ 8465f9b24faSJung-uk Kim if (LatestOp && 8475f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_INCLUDE) && 8485f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_INCLUDE_END) && 8495f9b24faSJung-uk Kim strcmp (LatestOp->Asl.Filename, Op->Asl.Filename)) 8505f9b24faSJung-uk Kim { 8515f9b24faSJung-uk Kim CvDbgPrint ("latest op: %s\n", LatestOp->Asl.ParseOpName); 8525f9b24faSJung-uk Kim Op->Asl.FileChanged = TRUE; 8536f1f1a63SJung-uk Kim if (AslGbl_IncludeFileStack) 8545f9b24faSJung-uk Kim { 8556f1f1a63SJung-uk Kim Op->Asl.ParentFilename = AslGbl_IncludeFileStack->Filename; 8565f9b24faSJung-uk Kim } 8575f9b24faSJung-uk Kim else 8585f9b24faSJung-uk Kim { 8595f9b24faSJung-uk Kim Op->Asl.ParentFilename = NULL; 8605f9b24faSJung-uk Kim } 8615f9b24faSJung-uk Kim } 8625f9b24faSJung-uk Kim 8636f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp = Op; 8645f9b24faSJung-uk Kim CvDbgPrint ("TrAllocateOp=Set latest parse op to this op.\n"); 8655f9b24faSJung-uk Kim CvDbgPrint (" Op->Asl.ParseOpName = %s\n", 8666f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp->Asl.ParseOpName); 8675f9b24faSJung-uk Kim CvDbgPrint (" Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode); 8685f9b24faSJung-uk Kim 8695f9b24faSJung-uk Kim if (Op->Asl.FileChanged) 8705f9b24faSJung-uk Kim { 8715f9b24faSJung-uk Kim CvDbgPrint(" file has been changed!\n"); 8725f9b24faSJung-uk Kim } 8735f9b24faSJung-uk Kim 8745f9b24faSJung-uk Kim /* 8755f9b24faSJung-uk Kim * if this parse op's syntax uses () and {} (i.e. Package(1){0x00}) then 8765f9b24faSJung-uk Kim * set a flag in the comment state. This facilitates paring comments for 8775f9b24faSJung-uk Kim * these types of opcodes. 8785f9b24faSJung-uk Kim */ 8795f9b24faSJung-uk Kim if ((CvParseOpBlockType(Op) == (BLOCK_PAREN | BLOCK_BRACE)) && 8805f9b24faSJung-uk Kim (ParseOpcode != PARSEOP_DEFINITION_BLOCK)) 8815f9b24faSJung-uk Kim { 8825f9b24faSJung-uk Kim CvDbgPrint ("Parsing paren/Brace op now!\n"); 8836f1f1a63SJung-uk Kim AslGbl_CommentState.ParsingParenBraceNode = Op; 8845f9b24faSJung-uk Kim } 8855f9b24faSJung-uk Kim 8866f1f1a63SJung-uk Kim if (AslGbl_CommentListHead) 8875f9b24faSJung-uk Kim { 8885f9b24faSJung-uk Kim CvDbgPrint ("Transferring...\n"); 8896f1f1a63SJung-uk Kim Op->Asl.CommentList = AslGbl_CommentListHead; 8906f1f1a63SJung-uk Kim AslGbl_CommentListHead = NULL; 8916f1f1a63SJung-uk Kim AslGbl_CommentListTail = NULL; 8925f9b24faSJung-uk Kim CvDbgPrint (" Transferred current comment list to this op.\n"); 8935f9b24faSJung-uk Kim CvDbgPrint (" %s\n", Op->Asl.CommentList->Comment); 8945f9b24faSJung-uk Kim } 8955f9b24faSJung-uk Kim 8966f1f1a63SJung-uk Kim if (AslGbl_InlineCommentBuffer) 8975f9b24faSJung-uk Kim { 8986f1f1a63SJung-uk Kim Op->Asl.InlineComment = AslGbl_InlineCommentBuffer; 8996f1f1a63SJung-uk Kim AslGbl_InlineCommentBuffer = NULL; 9005f9b24faSJung-uk Kim CvDbgPrint ("Transferred current inline comment list to this op.\n"); 9015f9b24faSJung-uk Kim } 9025f9b24faSJung-uk Kim } 9035f9b24faSJung-uk Kim 9045f9b24faSJung-uk Kim return (Op); 9055f9b24faSJung-uk Kim } 9065f9b24faSJung-uk Kim 9075f9b24faSJung-uk Kim 9085f9b24faSJung-uk Kim /******************************************************************************* 9095f9b24faSJung-uk Kim * 9105f9b24faSJung-uk Kim * FUNCTION: TrPrintOpFlags 9115f9b24faSJung-uk Kim * 9125f9b24faSJung-uk Kim * PARAMETERS: Flags - Flags word to be decoded 9135f9b24faSJung-uk Kim * OutputLevel - Debug output level: ASL_TREE_OUTPUT etc. 9145f9b24faSJung-uk Kim * 9155f9b24faSJung-uk Kim * RETURN: None 9165f9b24faSJung-uk Kim * 9175f9b24faSJung-uk Kim * DESCRIPTION: Decode a flags word to text. Displays all flags that are set. 9185f9b24faSJung-uk Kim * 9195f9b24faSJung-uk Kim ******************************************************************************/ 9205f9b24faSJung-uk Kim 9215f9b24faSJung-uk Kim void 9225f9b24faSJung-uk Kim TrPrintOpFlags ( 9235f9b24faSJung-uk Kim UINT32 Flags, 9245f9b24faSJung-uk Kim UINT32 OutputLevel) 9255f9b24faSJung-uk Kim { 9265f9b24faSJung-uk Kim UINT32 FlagBit = 1; 9275f9b24faSJung-uk Kim UINT32 i; 9285f9b24faSJung-uk Kim 9295f9b24faSJung-uk Kim 9305f9b24faSJung-uk Kim for (i = 0; i < ACPI_NUM_OP_FLAGS; i++) 9315f9b24faSJung-uk Kim { 9325f9b24faSJung-uk Kim if (Flags & FlagBit) 9335f9b24faSJung-uk Kim { 9346f1f1a63SJung-uk Kim DbgPrint (OutputLevel, " %s", AslGbl_OpFlagNames[i]); 9355f9b24faSJung-uk Kim } 9365f9b24faSJung-uk Kim 9375f9b24faSJung-uk Kim FlagBit <<= 1; 9385f9b24faSJung-uk Kim } 9395f9b24faSJung-uk Kim } 940