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  *
11722b1667SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2023, 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 *
TrCreateOp(UINT32 ParseOpcode,UINT32 NumChildren,...)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 *
TrCreateLeafOp(UINT32 ParseOpcode)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 *
TrCreateValuedLeafOp(UINT32 ParseOpcode,UINT64 Value)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 *
TrCreateTargetOp(ACPI_PARSE_OBJECT * OriginalOp,ACPI_PARSE_OBJECT * ParentOp)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 *
TrCreateAssignmentOp(ACPI_PARSE_OBJECT * Target,ACPI_PARSE_OBJECT * Source)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 *
TrCreateNullTargetOp(void)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 *
TrCreateConstantLeafOp(UINT32 ParseOpcode)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 *
TrAllocateOp(UINT32 ParseOpcode)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 
820722b1667SJung-uk Kim     ACPI_FUNCTION_NAME (TrAllocateOp);
821722b1667SJung-uk Kim 
8225f9b24faSJung-uk Kim 
82367d9aa44SJung-uk Kim     Op = UtParseOpCacheCalloc ();
8245f9b24faSJung-uk Kim 
8255f9b24faSJung-uk Kim     Op->Asl.ParseOpcode       = (UINT16) ParseOpcode;
8266f1f1a63SJung-uk Kim     Op->Asl.Filename          = AslGbl_Files[ASL_FILE_INPUT].Filename;
8276f1f1a63SJung-uk Kim     Op->Asl.LineNumber        = AslGbl_CurrentLineNumber;
8286f1f1a63SJung-uk Kim     Op->Asl.LogicalLineNumber = AslGbl_LogicalLineNumber;
8296f1f1a63SJung-uk Kim     Op->Asl.LogicalByteOffset = AslGbl_CurrentLineOffset;
8306f1f1a63SJung-uk Kim     Op->Asl.Column            = AslGbl_CurrentColumn;
8315f9b24faSJung-uk Kim 
8325f9b24faSJung-uk Kim     UtSetParseOpName (Op);
8335f9b24faSJung-uk Kim 
8345f9b24faSJung-uk Kim     /* The following is for capturing comments */
8355f9b24faSJung-uk Kim 
836f1db5ef7SJung-uk Kim     if (AcpiGbl_CaptureComments)
8375f9b24faSJung-uk Kim     {
8386f1f1a63SJung-uk Kim         LatestOp = AslGbl_CommentState.LatestParseOp;
8395f9b24faSJung-uk Kim         Op->Asl.InlineComment     = NULL;
8405f9b24faSJung-uk Kim         Op->Asl.EndNodeComment    = NULL;
8415f9b24faSJung-uk Kim         Op->Asl.CommentList       = NULL;
8425f9b24faSJung-uk Kim         Op->Asl.FileChanged       = FALSE;
8435f9b24faSJung-uk Kim 
8445f9b24faSJung-uk Kim         /*
8455f9b24faSJung-uk Kim          * Check to see if the file name has changed before resetting the
8465f9b24faSJung-uk Kim          * latest parse op.
8475f9b24faSJung-uk Kim          */
8485f9b24faSJung-uk Kim         if (LatestOp &&
8495f9b24faSJung-uk Kim             (ParseOpcode != PARSEOP_INCLUDE) &&
8505f9b24faSJung-uk Kim             (ParseOpcode != PARSEOP_INCLUDE_END) &&
8515f9b24faSJung-uk Kim             strcmp (LatestOp->Asl.Filename, Op->Asl.Filename))
8525f9b24faSJung-uk Kim         {
8535f9b24faSJung-uk Kim             CvDbgPrint ("latest op: %s\n", LatestOp->Asl.ParseOpName);
8545f9b24faSJung-uk Kim             Op->Asl.FileChanged = TRUE;
8556f1f1a63SJung-uk Kim             if (AslGbl_IncludeFileStack)
8565f9b24faSJung-uk Kim             {
8576f1f1a63SJung-uk Kim                 Op->Asl.ParentFilename = AslGbl_IncludeFileStack->Filename;
8585f9b24faSJung-uk Kim             }
8595f9b24faSJung-uk Kim             else
8605f9b24faSJung-uk Kim             {
8615f9b24faSJung-uk Kim                 Op->Asl.ParentFilename = NULL;
8625f9b24faSJung-uk Kim             }
8635f9b24faSJung-uk Kim         }
8645f9b24faSJung-uk Kim 
8656f1f1a63SJung-uk Kim         AslGbl_CommentState.LatestParseOp = Op;
866722b1667SJung-uk Kim         CvDbgPrint ("%s=Set latest parse op to this op.\n",  ACPI_GET_FUNCTION_NAME);
8675f9b24faSJung-uk Kim         CvDbgPrint ("           Op->Asl.ParseOpName = %s\n",
8686f1f1a63SJung-uk Kim             AslGbl_CommentState.LatestParseOp->Asl.ParseOpName);
8695f9b24faSJung-uk Kim         CvDbgPrint ("           Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode);
8705f9b24faSJung-uk Kim 
8715f9b24faSJung-uk Kim         if (Op->Asl.FileChanged)
8725f9b24faSJung-uk Kim         {
8735f9b24faSJung-uk Kim             CvDbgPrint("    file has been changed!\n");
8745f9b24faSJung-uk Kim         }
8755f9b24faSJung-uk Kim 
8765f9b24faSJung-uk Kim         /*
8775f9b24faSJung-uk Kim          * if this parse op's syntax uses () and {} (i.e. Package(1){0x00}) then
8785f9b24faSJung-uk Kim          * set a flag in the comment state. This facilitates paring comments for
8795f9b24faSJung-uk Kim          * these types of opcodes.
8805f9b24faSJung-uk Kim          */
8815f9b24faSJung-uk Kim         if ((CvParseOpBlockType(Op) == (BLOCK_PAREN | BLOCK_BRACE)) &&
8825f9b24faSJung-uk Kim             (ParseOpcode != PARSEOP_DEFINITION_BLOCK))
8835f9b24faSJung-uk Kim         {
8845f9b24faSJung-uk Kim             CvDbgPrint ("Parsing paren/Brace op now!\n");
8856f1f1a63SJung-uk Kim             AslGbl_CommentState.ParsingParenBraceNode = Op;
8865f9b24faSJung-uk Kim         }
8875f9b24faSJung-uk Kim 
8886f1f1a63SJung-uk Kim         if (AslGbl_CommentListHead)
8895f9b24faSJung-uk Kim         {
8905f9b24faSJung-uk Kim             CvDbgPrint ("Transferring...\n");
8916f1f1a63SJung-uk Kim             Op->Asl.CommentList = AslGbl_CommentListHead;
8926f1f1a63SJung-uk Kim             AslGbl_CommentListHead = NULL;
8936f1f1a63SJung-uk Kim             AslGbl_CommentListTail = NULL;
8945f9b24faSJung-uk Kim             CvDbgPrint ("    Transferred current comment list to this op.\n");
8955f9b24faSJung-uk Kim             CvDbgPrint ("    %s\n", Op->Asl.CommentList->Comment);
8965f9b24faSJung-uk Kim         }
8975f9b24faSJung-uk Kim 
8986f1f1a63SJung-uk Kim         if (AslGbl_InlineCommentBuffer)
8995f9b24faSJung-uk Kim         {
9006f1f1a63SJung-uk Kim             Op->Asl.InlineComment = AslGbl_InlineCommentBuffer;
9016f1f1a63SJung-uk Kim             AslGbl_InlineCommentBuffer = NULL;
9025f9b24faSJung-uk Kim             CvDbgPrint ("Transferred current inline comment list to this op.\n");
9035f9b24faSJung-uk Kim         }
9045f9b24faSJung-uk Kim     }
9055f9b24faSJung-uk Kim 
9065f9b24faSJung-uk Kim     return (Op);
9075f9b24faSJung-uk Kim }
9085f9b24faSJung-uk Kim 
9095f9b24faSJung-uk Kim 
9105f9b24faSJung-uk Kim /*******************************************************************************
9115f9b24faSJung-uk Kim  *
9125f9b24faSJung-uk Kim  * FUNCTION:    TrPrintOpFlags
9135f9b24faSJung-uk Kim  *
9145f9b24faSJung-uk Kim  * PARAMETERS:  Flags               - Flags word to be decoded
9155f9b24faSJung-uk Kim  *              OutputLevel         - Debug output level: ASL_TREE_OUTPUT etc.
9165f9b24faSJung-uk Kim  *
9175f9b24faSJung-uk Kim  * RETURN:      None
9185f9b24faSJung-uk Kim  *
9195f9b24faSJung-uk Kim  * DESCRIPTION: Decode a flags word to text. Displays all flags that are set.
9205f9b24faSJung-uk Kim  *
9215f9b24faSJung-uk Kim  ******************************************************************************/
9225f9b24faSJung-uk Kim 
9235f9b24faSJung-uk Kim void
TrPrintOpFlags(UINT32 Flags,UINT32 OutputLevel)9245f9b24faSJung-uk Kim TrPrintOpFlags (
9255f9b24faSJung-uk Kim     UINT32                  Flags,
9265f9b24faSJung-uk Kim     UINT32                  OutputLevel)
9275f9b24faSJung-uk Kim {
9285f9b24faSJung-uk Kim     UINT32                  FlagBit = 1;
9295f9b24faSJung-uk Kim     UINT32                  i;
9305f9b24faSJung-uk Kim 
9315f9b24faSJung-uk Kim 
9325f9b24faSJung-uk Kim     for (i = 0; i < ACPI_NUM_OP_FLAGS; i++)
9335f9b24faSJung-uk Kim     {
9345f9b24faSJung-uk Kim         if (Flags & FlagBit)
9355f9b24faSJung-uk Kim         {
9366f1f1a63SJung-uk Kim             DbgPrint (OutputLevel, " %s", AslGbl_OpFlagNames[i]);
9375f9b24faSJung-uk Kim         }
9385f9b24faSJung-uk Kim 
9395f9b24faSJung-uk Kim         FlagBit <<= 1;
9405f9b24faSJung-uk Kim     }
9415f9b24faSJung-uk Kim }
942