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