153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 353289f6aSNate Lawson * Module Name: aslutils -- compiler utilities 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*722b1667SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp. 1253289f6aSNate Lawson * All rights reserved. 1353289f6aSNate Lawson * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 121d244b227SJung-uk Kim * are met: 122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124d244b227SJung-uk Kim * without modification. 125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129d244b227SJung-uk Kim * binary redistribution. 130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132d244b227SJung-uk Kim * from this software without specific prior written permission. 13353289f6aSNate Lawson * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148d244b227SJung-uk Kim * Software Foundation. 14953289f6aSNate Lawson * 1500d84335fSJung-uk Kim *****************************************************************************/ 15153289f6aSNate Lawson 152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 15353289f6aSNate Lawson #include "aslcompiler.y.h" 154a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 155ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 156ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 1573c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 158f8146b88SJung-uk Kim #include <sys/stat.h> 159f8146b88SJung-uk Kim 16053289f6aSNate Lawson 16153289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 16253289f6aSNate Lawson ACPI_MODULE_NAME ("aslutils") 16353289f6aSNate Lawson 1643f0275a0SJung-uk Kim 165fba7fc7eSJung-uk Kim /* Local prototypes */ 16653289f6aSNate Lawson 167fba7fc7eSJung-uk Kim static void 168fba7fc7eSJung-uk Kim UtPadNameWithUnderscores ( 169fba7fc7eSJung-uk Kim char *NameSeg, 170fba7fc7eSJung-uk Kim char *PaddedNameSeg); 171fba7fc7eSJung-uk Kim 172fba7fc7eSJung-uk Kim static void 173fba7fc7eSJung-uk Kim UtAttachNameseg ( 174fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 175fba7fc7eSJung-uk Kim char *Name); 17653289f6aSNate Lawson 17744b0f624SJung-uk Kim static void 17844b0f624SJung-uk Kim UtDisplayErrorSummary ( 17944b0f624SJung-uk Kim UINT32 FileId); 18044b0f624SJung-uk Kim 18153289f6aSNate Lawson 18253289f6aSNate Lawson /******************************************************************************* 18353289f6aSNate Lawson * 184f8146b88SJung-uk Kim * FUNCTION: UtIsBigEndianMachine 185f8146b88SJung-uk Kim * 186f8146b88SJung-uk Kim * PARAMETERS: None 187f8146b88SJung-uk Kim * 188f8146b88SJung-uk Kim * RETURN: TRUE if machine is big endian 189f8146b88SJung-uk Kim * FALSE if machine is little endian 190f8146b88SJung-uk Kim * 191f8146b88SJung-uk Kim * DESCRIPTION: Detect whether machine is little endian or big endian. 192f8146b88SJung-uk Kim * 193f8146b88SJung-uk Kim ******************************************************************************/ 194f8146b88SJung-uk Kim 195f8146b88SJung-uk Kim UINT8 196f8146b88SJung-uk Kim UtIsBigEndianMachine ( 197f8146b88SJung-uk Kim void) 198f8146b88SJung-uk Kim { 199f8146b88SJung-uk Kim union { 200f8146b88SJung-uk Kim UINT32 Integer; 201f8146b88SJung-uk Kim UINT8 Bytes[4]; 202f8146b88SJung-uk Kim } Overlay = {0xFF000000}; 203f8146b88SJung-uk Kim 204f8146b88SJung-uk Kim 205f8146b88SJung-uk Kim return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */ 206f8146b88SJung-uk Kim } 207f8146b88SJung-uk Kim 208f8146b88SJung-uk Kim 2091970d693SJung-uk Kim /******************************************************************************* 2101970d693SJung-uk Kim * 2111970d693SJung-uk Kim * FUNCTION: UtIsIdInteger 2121970d693SJung-uk Kim * 2131970d693SJung-uk Kim * PARAMETERS: Pointer to an ACPI ID (HID, CID) string 2141970d693SJung-uk Kim * 2151970d693SJung-uk Kim * RETURN: TRUE if string is an integer 2161970d693SJung-uk Kim * FALSE if string is not an integer 2171970d693SJung-uk Kim * 2181970d693SJung-uk Kim * DESCRIPTION: Determine whether the input ACPI ID string can be converted to 2191970d693SJung-uk Kim * an integer value. 2201970d693SJung-uk Kim * 2211970d693SJung-uk Kim ******************************************************************************/ 2221970d693SJung-uk Kim 2231970d693SJung-uk Kim BOOLEAN 2241970d693SJung-uk Kim UtIsIdInteger ( 2251970d693SJung-uk Kim UINT8 *Target) 2261970d693SJung-uk Kim { 2271970d693SJung-uk Kim UINT32 i; 2281970d693SJung-uk Kim 2291970d693SJung-uk Kim 2301970d693SJung-uk Kim /* The first three characters of the string must be alphabetic */ 2311970d693SJung-uk Kim 2321970d693SJung-uk Kim for (i = 0; i < 3; i++) 2331970d693SJung-uk Kim { 2341970d693SJung-uk Kim if (!isalpha ((int) Target[i])) 2351970d693SJung-uk Kim { 2361970d693SJung-uk Kim break; 2371970d693SJung-uk Kim } 2381970d693SJung-uk Kim } 2391970d693SJung-uk Kim 2401970d693SJung-uk Kim if (i < 3) 2411970d693SJung-uk Kim { 2421970d693SJung-uk Kim return (TRUE); 2431970d693SJung-uk Kim } 2441970d693SJung-uk Kim 2451970d693SJung-uk Kim return (FALSE); 2461970d693SJung-uk Kim } 2471970d693SJung-uk Kim 2481970d693SJung-uk Kim 249f8146b88SJung-uk Kim /****************************************************************************** 250f8146b88SJung-uk Kim * 251f8146b88SJung-uk Kim * FUNCTION: UtQueryForOverwrite 252f8146b88SJung-uk Kim * 253f8146b88SJung-uk Kim * PARAMETERS: Pathname - Output filename 254f8146b88SJung-uk Kim * 255f8146b88SJung-uk Kim * RETURN: TRUE if file does not exist or overwrite is authorized 256f8146b88SJung-uk Kim * 257f8146b88SJung-uk Kim * DESCRIPTION: Query for file overwrite if it already exists. 258f8146b88SJung-uk Kim * 259f8146b88SJung-uk Kim ******************************************************************************/ 260f8146b88SJung-uk Kim 261f8146b88SJung-uk Kim BOOLEAN 262f8146b88SJung-uk Kim UtQueryForOverwrite ( 263f8146b88SJung-uk Kim char *Pathname) 264f8146b88SJung-uk Kim { 265f8146b88SJung-uk Kim struct stat StatInfo; 266a009b7dcSJung-uk Kim int InChar; 267f8146b88SJung-uk Kim 268f8146b88SJung-uk Kim 269f8146b88SJung-uk Kim if (!stat (Pathname, &StatInfo)) 270f8146b88SJung-uk Kim { 271f8146b88SJung-uk Kim fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ", 272f8146b88SJung-uk Kim Pathname); 273f8146b88SJung-uk Kim 274a009b7dcSJung-uk Kim InChar = fgetc (stdin); 275a009b7dcSJung-uk Kim if (InChar == '\n') 276a009b7dcSJung-uk Kim { 277a009b7dcSJung-uk Kim InChar = fgetc (stdin); 278a009b7dcSJung-uk Kim } 279a009b7dcSJung-uk Kim 280a009b7dcSJung-uk Kim if ((InChar != 'y') && (InChar != 'Y')) 281f8146b88SJung-uk Kim { 282f8146b88SJung-uk Kim return (FALSE); 283f8146b88SJung-uk Kim } 284f8146b88SJung-uk Kim } 285f8146b88SJung-uk Kim 286f8146b88SJung-uk Kim return (TRUE); 287f8146b88SJung-uk Kim } 288f8146b88SJung-uk Kim 289f8146b88SJung-uk Kim 290f8146b88SJung-uk Kim /******************************************************************************* 291f8146b88SJung-uk Kim * 292835b56bfSJung-uk Kim * FUNCTION: UtNodeIsDescendantOf 293835b56bfSJung-uk Kim * 294835b56bfSJung-uk Kim * PARAMETERS: Node1 - Child node 295835b56bfSJung-uk Kim * Node2 - Possible parent node 296835b56bfSJung-uk Kim * 297835b56bfSJung-uk Kim * RETURN: Boolean 298835b56bfSJung-uk Kim * 299835b56bfSJung-uk Kim * DESCRIPTION: Returns TRUE if Node1 is a descendant of Node2. Otherwise, 300835b56bfSJung-uk Kim * return FALSE. Note, we assume a NULL Node2 element to be the 301835b56bfSJung-uk Kim * topmost (root) scope. All nodes are descendants of the root. 302835b56bfSJung-uk Kim * Note: Nodes at the same level (siblings) are not considered 303835b56bfSJung-uk Kim * descendants. 304835b56bfSJung-uk Kim * 305835b56bfSJung-uk Kim ******************************************************************************/ 306835b56bfSJung-uk Kim 307835b56bfSJung-uk Kim BOOLEAN 308835b56bfSJung-uk Kim UtNodeIsDescendantOf ( 309835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node1, 310835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node2) 311835b56bfSJung-uk Kim { 312835b56bfSJung-uk Kim 313835b56bfSJung-uk Kim if (Node1 == Node2) 314835b56bfSJung-uk Kim { 315835b56bfSJung-uk Kim return (FALSE); 316835b56bfSJung-uk Kim } 317835b56bfSJung-uk Kim 318835b56bfSJung-uk Kim if (!Node2) 319835b56bfSJung-uk Kim { 320835b56bfSJung-uk Kim return (TRUE); /* All nodes descend from the root */ 321835b56bfSJung-uk Kim } 322835b56bfSJung-uk Kim 323835b56bfSJung-uk Kim /* Walk upward until the root is reached or parent is found */ 324835b56bfSJung-uk Kim 325835b56bfSJung-uk Kim while (Node1) 326835b56bfSJung-uk Kim { 327835b56bfSJung-uk Kim if (Node1 == Node2) 328835b56bfSJung-uk Kim { 329835b56bfSJung-uk Kim return (TRUE); 330835b56bfSJung-uk Kim } 331835b56bfSJung-uk Kim 332835b56bfSJung-uk Kim Node1 = Node1->Parent; 333835b56bfSJung-uk Kim } 334835b56bfSJung-uk Kim 335835b56bfSJung-uk Kim return (FALSE); 336835b56bfSJung-uk Kim } 337835b56bfSJung-uk Kim 338835b56bfSJung-uk Kim 339835b56bfSJung-uk Kim /******************************************************************************* 340835b56bfSJung-uk Kim * 341ec0234b4SJung-uk Kim * FUNCTION: UtGetParentMethodNode 342835b56bfSJung-uk Kim * 343835b56bfSJung-uk Kim * PARAMETERS: Node - Namespace node for any object 344835b56bfSJung-uk Kim * 345835b56bfSJung-uk Kim * RETURN: Namespace node for the parent method 346835b56bfSJung-uk Kim * NULL - object is not within a method 347835b56bfSJung-uk Kim * 348835b56bfSJung-uk Kim * DESCRIPTION: Find the parent (owning) method node for a namespace object 349835b56bfSJung-uk Kim * 350835b56bfSJung-uk Kim ******************************************************************************/ 351835b56bfSJung-uk Kim 352ec0234b4SJung-uk Kim ACPI_NAMESPACE_NODE * 353ec0234b4SJung-uk Kim UtGetParentMethodNode ( 354835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *Node) 355835b56bfSJung-uk Kim { 356835b56bfSJung-uk Kim ACPI_NAMESPACE_NODE *ParentNode; 357835b56bfSJung-uk Kim 358835b56bfSJung-uk Kim 359835b56bfSJung-uk Kim if (!Node) 360835b56bfSJung-uk Kim { 361835b56bfSJung-uk Kim return (NULL); 362835b56bfSJung-uk Kim } 363835b56bfSJung-uk Kim 364835b56bfSJung-uk Kim /* Walk upward until a method is found, or the root is reached */ 365835b56bfSJung-uk Kim 366835b56bfSJung-uk Kim ParentNode = Node->Parent; 367835b56bfSJung-uk Kim while (ParentNode) 368835b56bfSJung-uk Kim { 369835b56bfSJung-uk Kim if (ParentNode->Type == ACPI_TYPE_METHOD) 370835b56bfSJung-uk Kim { 371835b56bfSJung-uk Kim return (ParentNode); 372835b56bfSJung-uk Kim } 373835b56bfSJung-uk Kim 374835b56bfSJung-uk Kim ParentNode = ParentNode->Parent; 375835b56bfSJung-uk Kim } 376835b56bfSJung-uk Kim 377835b56bfSJung-uk Kim return (NULL); /* Object is not within a control method */ 378835b56bfSJung-uk Kim } 379835b56bfSJung-uk Kim 380835b56bfSJung-uk Kim 381835b56bfSJung-uk Kim /******************************************************************************* 382835b56bfSJung-uk Kim * 383ec0234b4SJung-uk Kim * FUNCTION: UtGetParentMethodOp 384ec0234b4SJung-uk Kim * 385ec0234b4SJung-uk Kim * PARAMETERS: Op - Parse Op to be checked 386ec0234b4SJung-uk Kim * 387ec0234b4SJung-uk Kim * RETURN: Control method Op if found. NULL otherwise 388ec0234b4SJung-uk Kim * 389ec0234b4SJung-uk Kim * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if 390ec0234b4SJung-uk Kim * the input Op is not within a control method. 391ec0234b4SJung-uk Kim * 392ec0234b4SJung-uk Kim ******************************************************************************/ 393ec0234b4SJung-uk Kim 394ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT * 395ec0234b4SJung-uk Kim UtGetParentMethodOp ( 396ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *Op) 397ec0234b4SJung-uk Kim { 398ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 399ec0234b4SJung-uk Kim 400ec0234b4SJung-uk Kim 401ec0234b4SJung-uk Kim NextOp = Op->Asl.Parent; 402ec0234b4SJung-uk Kim while (NextOp) 403ec0234b4SJung-uk Kim { 404ec0234b4SJung-uk Kim if (NextOp->Asl.AmlOpcode == AML_METHOD_OP) 405ec0234b4SJung-uk Kim { 406ec0234b4SJung-uk Kim return (NextOp); 407ec0234b4SJung-uk Kim } 408ec0234b4SJung-uk Kim 409ec0234b4SJung-uk Kim NextOp = NextOp->Asl.Parent; 410ec0234b4SJung-uk Kim } 411ec0234b4SJung-uk Kim 412ec0234b4SJung-uk Kim return (NULL); /* No parent method found */ 413ec0234b4SJung-uk Kim } 414ec0234b4SJung-uk Kim 415ec0234b4SJung-uk Kim 416ec0234b4SJung-uk Kim /******************************************************************************* 417ec0234b4SJung-uk Kim * 418a88e22b7SJung-uk Kim * FUNCTION: UtDisplaySupportedTables 419a88e22b7SJung-uk Kim * 420a88e22b7SJung-uk Kim * PARAMETERS: None 421a88e22b7SJung-uk Kim * 422a88e22b7SJung-uk Kim * RETURN: None 423a88e22b7SJung-uk Kim * 424a88e22b7SJung-uk Kim * DESCRIPTION: Print all supported ACPI table names. 425a88e22b7SJung-uk Kim * 426a88e22b7SJung-uk Kim ******************************************************************************/ 427a88e22b7SJung-uk Kim 428a88e22b7SJung-uk Kim void 429a88e22b7SJung-uk Kim UtDisplaySupportedTables ( 430a88e22b7SJung-uk Kim void) 431a88e22b7SJung-uk Kim { 432a371a5fdSJung-uk Kim const AH_TABLE *TableData; 4331df130f1SJung-uk Kim UINT32 i; 434a88e22b7SJung-uk Kim 435a88e22b7SJung-uk Kim 4361df130f1SJung-uk Kim printf ("\nACPI tables supported by iASL version %8.8X:\n" 43797c0b5abSJung-uk Kim " (Compiler, Disassembler, Template Generator)\n", 4381df130f1SJung-uk Kim ACPI_CA_VERSION); 439a88e22b7SJung-uk Kim 440a371a5fdSJung-uk Kim /* All ACPI tables with the common table header */ 441a88e22b7SJung-uk Kim 44297c0b5abSJung-uk Kim printf ("\nKnown/Supported ACPI tables:\n"); 4436f1f1a63SJung-uk Kim for (TableData = AcpiGbl_SupportedTables, i = 1; 444a371a5fdSJung-uk Kim TableData->Signature; TableData++, i++) 445a88e22b7SJung-uk Kim { 446a371a5fdSJung-uk Kim printf ("%8u) %s %s\n", i, 447a371a5fdSJung-uk Kim TableData->Signature, TableData->Description); 448a88e22b7SJung-uk Kim } 44997c0b5abSJung-uk Kim 45097c0b5abSJung-uk Kim printf ("\nTotal %u ACPI tables\n\n", i-1); 451a88e22b7SJung-uk Kim } 452a88e22b7SJung-uk Kim 453a88e22b7SJung-uk Kim 454a88e22b7SJung-uk Kim /******************************************************************************* 455a88e22b7SJung-uk Kim * 456f38b0f21SJung-uk Kim * FUNCTION: UtDisplayConstantOpcodes 45753289f6aSNate Lawson * 45853289f6aSNate Lawson * PARAMETERS: None 45953289f6aSNate Lawson * 46053289f6aSNate Lawson * RETURN: None 46153289f6aSNate Lawson * 46253289f6aSNate Lawson * DESCRIPTION: Print AML opcodes that can be used in constant expressions. 46353289f6aSNate Lawson * 46453289f6aSNate Lawson ******************************************************************************/ 46553289f6aSNate Lawson 46653289f6aSNate Lawson void 46753289f6aSNate Lawson UtDisplayConstantOpcodes ( 46853289f6aSNate Lawson void) 46953289f6aSNate Lawson { 47053289f6aSNate Lawson UINT32 i; 47153289f6aSNate Lawson 472fba7fc7eSJung-uk Kim 47353289f6aSNate Lawson printf ("Constant expression opcode information\n\n"); 47453289f6aSNate Lawson 47553289f6aSNate Lawson for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++) 47653289f6aSNate Lawson { 47753289f6aSNate Lawson if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT) 47853289f6aSNate Lawson { 47953289f6aSNate Lawson printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name); 48053289f6aSNate Lawson } 48153289f6aSNate Lawson } 48253289f6aSNate Lawson } 48353289f6aSNate Lawson 48453289f6aSNate Lawson 48553289f6aSNate Lawson /******************************************************************************* 48653289f6aSNate Lawson * 48753289f6aSNate Lawson * FUNCTION: UtBeginEvent 48853289f6aSNate Lawson * 489fba7fc7eSJung-uk Kim * PARAMETERS: Name - Ascii name of this event 49053289f6aSNate Lawson * 491f38b0f21SJung-uk Kim * RETURN: Event number (integer index) 49253289f6aSNate Lawson * 49353289f6aSNate Lawson * DESCRIPTION: Saves the current time with this event 49453289f6aSNate Lawson * 49553289f6aSNate Lawson ******************************************************************************/ 49653289f6aSNate Lawson 497fba7fc7eSJung-uk Kim UINT8 49853289f6aSNate Lawson UtBeginEvent ( 49953289f6aSNate Lawson char *Name) 50053289f6aSNate Lawson { 50153289f6aSNate Lawson 502fba7fc7eSJung-uk Kim if (AslGbl_NextEvent >= ASL_NUM_EVENTS) 503fba7fc7eSJung-uk Kim { 504fba7fc7eSJung-uk Kim AcpiOsPrintf ("Ran out of compiler event structs!\n"); 505fba7fc7eSJung-uk Kim return (AslGbl_NextEvent); 506fba7fc7eSJung-uk Kim } 507fba7fc7eSJung-uk Kim 508fba7fc7eSJung-uk Kim /* Init event with current (start) time */ 509fba7fc7eSJung-uk Kim 510fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer (); 511fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].EventName = Name; 512fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].Valid = TRUE; 513fba7fc7eSJung-uk Kim return (AslGbl_NextEvent++); 51453289f6aSNate Lawson } 51553289f6aSNate Lawson 51653289f6aSNate Lawson 51753289f6aSNate Lawson /******************************************************************************* 51853289f6aSNate Lawson * 51953289f6aSNate Lawson * FUNCTION: UtEndEvent 52053289f6aSNate Lawson * 52153289f6aSNate Lawson * PARAMETERS: Event - Event number (integer index) 52253289f6aSNate Lawson * 52353289f6aSNate Lawson * RETURN: None 52453289f6aSNate Lawson * 52553289f6aSNate Lawson * DESCRIPTION: Saves the current time (end time) with this event 52653289f6aSNate Lawson * 52753289f6aSNate Lawson ******************************************************************************/ 52853289f6aSNate Lawson 52953289f6aSNate Lawson void 53053289f6aSNate Lawson UtEndEvent ( 531fba7fc7eSJung-uk Kim UINT8 Event) 53253289f6aSNate Lawson { 53353289f6aSNate Lawson 534fba7fc7eSJung-uk Kim if (Event >= ASL_NUM_EVENTS) 535fba7fc7eSJung-uk Kim { 536fba7fc7eSJung-uk Kim return; 537fba7fc7eSJung-uk Kim } 538fba7fc7eSJung-uk Kim 539fba7fc7eSJung-uk Kim /* Insert end time for event */ 540fba7fc7eSJung-uk Kim 541fba7fc7eSJung-uk Kim AslGbl_Events[Event].EndTime = AcpiOsGetTimer (); 54253289f6aSNate Lawson } 54353289f6aSNate Lawson 54453289f6aSNate Lawson 54553289f6aSNate Lawson /******************************************************************************* 54653289f6aSNate Lawson * 54753289f6aSNate Lawson * FUNCTION: DbgPrint 54853289f6aSNate Lawson * 549fba7fc7eSJung-uk Kim * PARAMETERS: Type - Type of output 550fba7fc7eSJung-uk Kim * Fmt - Printf format string 55153289f6aSNate Lawson * ... - variable printf list 55253289f6aSNate Lawson * 55353289f6aSNate Lawson * RETURN: None 55453289f6aSNate Lawson * 55553289f6aSNate Lawson * DESCRIPTION: Conditional print statement. Prints to stderr only if the 55653289f6aSNate Lawson * debug flag is set. 55753289f6aSNate Lawson * 55853289f6aSNate Lawson ******************************************************************************/ 55953289f6aSNate Lawson 56053289f6aSNate Lawson void 56153289f6aSNate Lawson DbgPrint ( 56253289f6aSNate Lawson UINT32 Type, 56353289f6aSNate Lawson char *Fmt, 56453289f6aSNate Lawson ...) 56553289f6aSNate Lawson { 56653289f6aSNate Lawson va_list Args; 56753289f6aSNate Lawson 56853289f6aSNate Lawson 5696f1f1a63SJung-uk Kim if (!AslGbl_DebugFlag) 57053289f6aSNate Lawson { 57153289f6aSNate Lawson return; 57253289f6aSNate Lawson } 57353289f6aSNate Lawson 57453289f6aSNate Lawson if ((Type == ASL_PARSE_OUTPUT) && 57553289f6aSNate Lawson (!(AslCompilerdebug))) 57653289f6aSNate Lawson { 57753289f6aSNate Lawson return; 57853289f6aSNate Lawson } 57953289f6aSNate Lawson 5808d744e47SJung-uk Kim va_start (Args, Fmt); 58153289f6aSNate Lawson (void) vfprintf (stderr, Fmt, Args); 58253289f6aSNate Lawson va_end (Args); 58353289f6aSNate Lawson return; 58453289f6aSNate Lawson } 58553289f6aSNate Lawson 58653289f6aSNate Lawson 58753289f6aSNate Lawson /******************************************************************************* 58853289f6aSNate Lawson * 58953289f6aSNate Lawson * FUNCTION: UtSetParseOpName 59053289f6aSNate Lawson * 591f38b0f21SJung-uk Kim * PARAMETERS: Op - Parse op to be named. 59253289f6aSNate Lawson * 59353289f6aSNate Lawson * RETURN: None 59453289f6aSNate Lawson * 59553289f6aSNate Lawson * DESCRIPTION: Insert the ascii name of the parse opcode 59653289f6aSNate Lawson * 59753289f6aSNate Lawson ******************************************************************************/ 59853289f6aSNate Lawson 59953289f6aSNate Lawson void 60053289f6aSNate Lawson UtSetParseOpName ( 60153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 60253289f6aSNate Lawson { 603fba7fc7eSJung-uk Kim 604f1db5ef7SJung-uk Kim AcpiUtSafeStrncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode), 6051a39cfb0SJung-uk Kim ACPI_MAX_PARSEOP_NAME); 60653289f6aSNate Lawson } 60753289f6aSNate Lawson 60853289f6aSNate Lawson 60953289f6aSNate Lawson /******************************************************************************* 61053289f6aSNate Lawson * 61144b0f624SJung-uk Kim * FUNCTION: UtDisplayOneSummary 61253289f6aSNate Lawson * 613*722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file 61453289f6aSNate Lawson * 61553289f6aSNate Lawson * RETURN: None 61653289f6aSNate Lawson * 61744b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for one input file 61853289f6aSNate Lawson * 61953289f6aSNate Lawson ******************************************************************************/ 62053289f6aSNate Lawson 62153289f6aSNate Lawson void 62244b0f624SJung-uk Kim UtDisplayOneSummary ( 62344b0f624SJung-uk Kim UINT32 FileId, 62444b0f624SJung-uk Kim BOOLEAN DisplayErrorSummary) 62553289f6aSNate Lawson { 6263f0275a0SJung-uk Kim UINT32 i; 62744b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *FileNode; 6289ad8b64eSJung-uk Kim BOOLEAN DisplayAMLSummary; 6293f0275a0SJung-uk Kim 63053289f6aSNate Lawson 6319ad8b64eSJung-uk Kim DisplayAMLSummary = 6329ad8b64eSJung-uk Kim !AslGbl_PreprocessOnly && !AslGbl_ParserErrorDetected && 6339ad8b64eSJung-uk Kim ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) && 6349ad8b64eSJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle; 6359ad8b64eSJung-uk Kim 63653289f6aSNate Lawson if (FileId != ASL_FILE_STDOUT) 63753289f6aSNate Lawson { 63853289f6aSNate Lawson /* Compiler name and version number */ 63953289f6aSNate Lawson 64061673a1fSJung-uk Kim FlPrintFile (FileId, "%s version %X\n\n", 64161673a1fSJung-uk Kim ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION); 64253289f6aSNate Lawson } 64353289f6aSNate Lawson 6443f0275a0SJung-uk Kim /* Summary of main input and output files */ 6453f0275a0SJung-uk Kim 64644b0f624SJung-uk Kim FileNode = FlGetCurrentFileNode (); 647a009b7dcSJung-uk Kim 64844b0f624SJung-uk Kim if (FileNode->ParserErrorDetected) 64944b0f624SJung-uk Kim { 65053289f6aSNate Lawson FlPrintFile (FileId, 65144b0f624SJung-uk Kim "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n", 652a009b7dcSJung-uk Kim "Input file:", AslGbl_Files[ASL_FILE_INPUT].Filename); 65344b0f624SJung-uk Kim } 654a009b7dcSJung-uk Kim else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_DATA) 655a009b7dcSJung-uk Kim { 656a009b7dcSJung-uk Kim FlPrintFile (FileId, 657a009b7dcSJung-uk Kim "%-14s %s - %7u bytes %6u fields %8u source lines\n", 658a009b7dcSJung-uk Kim "Table Input:", 659a009b7dcSJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename, 660a009b7dcSJung-uk Kim FileNode->OriginalInputFileSize, FileNode->TotalFields, 661a009b7dcSJung-uk Kim FileNode->TotalLineCount); 662a009b7dcSJung-uk Kim 663a009b7dcSJung-uk Kim FlPrintFile (FileId, 664a009b7dcSJung-uk Kim "%-14s %s - %7u bytes\n", 665a009b7dcSJung-uk Kim "Binary Output:", 666a009b7dcSJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FileNode->OutputByteLength); 667a009b7dcSJung-uk Kim } 668a009b7dcSJung-uk Kim else if (FileNode->FileType == ASL_INPUT_TYPE_ASCII_ASL) 66944b0f624SJung-uk Kim { 67044b0f624SJung-uk Kim FlPrintFile (FileId, 67144b0f624SJung-uk Kim "%-14s %s - %7u bytes %6u keywords %6u source lines\n", 6723f0275a0SJung-uk Kim "ASL Input:", 67344b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename, 67444b0f624SJung-uk Kim FileNode->OriginalInputFileSize, 67544b0f624SJung-uk Kim FileNode->TotalKeywords, 67644b0f624SJung-uk Kim FileNode->TotalLineCount); 67753289f6aSNate Lawson 67853289f6aSNate Lawson /* AML summary */ 67953289f6aSNate Lawson 6809ad8b64eSJung-uk Kim if (DisplayAMLSummary) 6815ef50723SJung-uk Kim { 68253289f6aSNate Lawson FlPrintFile (FileId, 68344b0f624SJung-uk Kim "%-14s %s - %7u bytes %6u opcodes %6u named objects\n", 6843f0275a0SJung-uk Kim "AML Output:", 6856f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, 686f8146b88SJung-uk Kim FlGetFileSize (ASL_FILE_AML_OUTPUT), 68744b0f624SJung-uk Kim FileNode->TotalExecutableOpcodes, 68844b0f624SJung-uk Kim FileNode->TotalNamedObjects); 68953289f6aSNate Lawson } 690a88e22b7SJung-uk Kim } 69153289f6aSNate Lawson 6923f0275a0SJung-uk Kim /* Display summary of any optional files */ 6933f0275a0SJung-uk Kim 6943f0275a0SJung-uk Kim for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++) 6953f0275a0SJung-uk Kim { 6966f1f1a63SJung-uk Kim if (!AslGbl_Files[i].Filename || !AslGbl_Files[i].Handle) 6973f0275a0SJung-uk Kim { 6983f0275a0SJung-uk Kim continue; 6993f0275a0SJung-uk Kim } 7003f0275a0SJung-uk Kim 7013f0275a0SJung-uk Kim /* .SRC is a temp file unless specifically requested */ 7023f0275a0SJung-uk Kim 7036f1f1a63SJung-uk Kim if ((i == ASL_FILE_SOURCE_OUTPUT) && (!AslGbl_SourceOutputFlag)) 7043f0275a0SJung-uk Kim { 7053f0275a0SJung-uk Kim continue; 7063f0275a0SJung-uk Kim } 7073f0275a0SJung-uk Kim 7085ef50723SJung-uk Kim /* .PRE is the preprocessor intermediate file */ 7094c52cad2SJung-uk Kim 7106f1f1a63SJung-uk Kim if ((i == ASL_FILE_PREPROCESSOR) && (!AslGbl_KeepPreprocessorTempFile)) 7114c52cad2SJung-uk Kim { 7124c52cad2SJung-uk Kim continue; 7134c52cad2SJung-uk Kim } 7144c52cad2SJung-uk Kim 7159ad8b64eSJung-uk Kim FlPrintFile (FileId, "%-14s %s - %7u bytes\n", 71644b0f624SJung-uk Kim AslGbl_FileDescs[i].ShortDescription, 7176f1f1a63SJung-uk Kim AslGbl_Files[i].Filename, FlGetFileSize (i)); 7183f0275a0SJung-uk Kim } 7193f0275a0SJung-uk Kim 72044b0f624SJung-uk Kim 72144b0f624SJung-uk Kim /* 72244b0f624SJung-uk Kim * Optionally emit an error summary for a file. This is used to enhance the 72344b0f624SJung-uk Kim * appearance of listing files. 72444b0f624SJung-uk Kim */ 72544b0f624SJung-uk Kim if (DisplayErrorSummary) 72644b0f624SJung-uk Kim { 72744b0f624SJung-uk Kim UtDisplayErrorSummary (FileId); 72844b0f624SJung-uk Kim } 72944b0f624SJung-uk Kim } 73044b0f624SJung-uk Kim 73144b0f624SJung-uk Kim 73244b0f624SJung-uk Kim /******************************************************************************* 73344b0f624SJung-uk Kim * 73444b0f624SJung-uk Kim * FUNCTION: UtDisplayErrorSummary 73544b0f624SJung-uk Kim * 736*722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file 73744b0f624SJung-uk Kim * 73844b0f624SJung-uk Kim * RETURN: None 73944b0f624SJung-uk Kim * 74044b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for all input files 74144b0f624SJung-uk Kim * 74244b0f624SJung-uk Kim ******************************************************************************/ 74344b0f624SJung-uk Kim 74444b0f624SJung-uk Kim static void 74544b0f624SJung-uk Kim UtDisplayErrorSummary ( 74644b0f624SJung-uk Kim UINT32 FileId) 74744b0f624SJung-uk Kim { 74844b0f624SJung-uk Kim BOOLEAN ErrorDetected; 74944b0f624SJung-uk Kim 75044b0f624SJung-uk Kim 75144b0f624SJung-uk Kim ErrorDetected = AslGbl_ParserErrorDetected || 75244b0f624SJung-uk Kim ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors); 75344b0f624SJung-uk Kim 75444b0f624SJung-uk Kim if (ErrorDetected) 75544b0f624SJung-uk Kim { 75644b0f624SJung-uk Kim FlPrintFile (FileId, "\nCompilation failed. "); 75744b0f624SJung-uk Kim } 75844b0f624SJung-uk Kim else 75944b0f624SJung-uk Kim { 76044b0f624SJung-uk Kim FlPrintFile (FileId, "\nCompilation successful. "); 76144b0f624SJung-uk Kim } 76253289f6aSNate Lawson 76353289f6aSNate Lawson FlPrintFile (FileId, 76444b0f624SJung-uk Kim "%u Errors, %u Warnings, %u Remarks", 7656f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_ERROR], 7666f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING] + 7676f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING2] + 7686f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_WARNING3], 7696f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_REMARK]); 770a88e22b7SJung-uk Kim 7716f1f1a63SJung-uk Kim if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) 772a88e22b7SJung-uk Kim { 77344b0f624SJung-uk Kim if (AslGbl_ParserErrorDetected) 77444b0f624SJung-uk Kim { 77544b0f624SJung-uk Kim FlPrintFile (FileId, 77644b0f624SJung-uk Kim "\nNo AML files were generated due to syntax error(s)\n"); 77744b0f624SJung-uk Kim return; 77844b0f624SJung-uk Kim } 77944b0f624SJung-uk Kim else if (ErrorDetected) 78044b0f624SJung-uk Kim { 78144b0f624SJung-uk Kim FlPrintFile (FileId, 78244b0f624SJung-uk Kim "\nNo AML files were generated due to compiler error(s)\n"); 78344b0f624SJung-uk Kim return; 78444b0f624SJung-uk Kim } 78544b0f624SJung-uk Kim 7867cf3e94aSJung-uk Kim FlPrintFile (FileId, ", %u Optimizations", 7876f1f1a63SJung-uk Kim AslGbl_ExceptionCount[ASL_OPTIMIZATION]); 7887cf3e94aSJung-uk Kim 7896f1f1a63SJung-uk Kim if (AslGbl_TotalFolds) 7907cf3e94aSJung-uk Kim { 7916f1f1a63SJung-uk Kim FlPrintFile (FileId, ", %u Constants Folded", AslGbl_TotalFolds); 7927cf3e94aSJung-uk Kim } 793a88e22b7SJung-uk Kim } 794a88e22b7SJung-uk Kim 795a88e22b7SJung-uk Kim FlPrintFile (FileId, "\n"); 79653289f6aSNate Lawson } 79753289f6aSNate Lawson 79853289f6aSNate Lawson 79953289f6aSNate Lawson /******************************************************************************* 80053289f6aSNate Lawson * 80144b0f624SJung-uk Kim * FUNCTION: UtDisplaySummary 80244b0f624SJung-uk Kim * 803*722b1667SJung-uk Kim * PARAMETERS: FileID - ID of output file 80444b0f624SJung-uk Kim * 80544b0f624SJung-uk Kim * RETURN: None 80644b0f624SJung-uk Kim * 80744b0f624SJung-uk Kim * DESCRIPTION: Display compilation statistics for all input files 80844b0f624SJung-uk Kim * 80944b0f624SJung-uk Kim ******************************************************************************/ 81044b0f624SJung-uk Kim 81144b0f624SJung-uk Kim void 81244b0f624SJung-uk Kim UtDisplaySummary ( 81344b0f624SJung-uk Kim UINT32 FileId) 81444b0f624SJung-uk Kim { 81544b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 81644b0f624SJung-uk Kim 81744b0f624SJung-uk Kim 81844b0f624SJung-uk Kim while (Current) 81944b0f624SJung-uk Kim { 82044b0f624SJung-uk Kim switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename)) 82144b0f624SJung-uk Kim { 82244b0f624SJung-uk Kim case SWITCH_TO_SAME_FILE: 82344b0f624SJung-uk Kim case SWITCH_TO_DIFFERENT_FILE: 82444b0f624SJung-uk Kim 82544b0f624SJung-uk Kim UtDisplayOneSummary (FileId, FALSE); 82644b0f624SJung-uk Kim Current = Current->Next; 82744b0f624SJung-uk Kim break; 82844b0f624SJung-uk Kim 82944b0f624SJung-uk Kim case FILE_NOT_FOUND: 83044b0f624SJung-uk Kim default: 83144b0f624SJung-uk Kim 83244b0f624SJung-uk Kim Current = NULL; 83344b0f624SJung-uk Kim break; 83444b0f624SJung-uk Kim } 83544b0f624SJung-uk Kim } 83644b0f624SJung-uk Kim UtDisplayErrorSummary (FileId); 83744b0f624SJung-uk Kim } 83844b0f624SJung-uk Kim 83944b0f624SJung-uk Kim /******************************************************************************* 84044b0f624SJung-uk Kim * 841f38b0f21SJung-uk Kim * FUNCTION: UtCheckIntegerRange 84253289f6aSNate Lawson * 84353289f6aSNate Lawson * PARAMETERS: Op - Integer parse node 84453289f6aSNate Lawson * LowValue - Smallest allowed value 84553289f6aSNate Lawson * HighValue - Largest allowed value 84653289f6aSNate Lawson * 84753289f6aSNate Lawson * RETURN: Op if OK, otherwise NULL 84853289f6aSNate Lawson * 84953289f6aSNate Lawson * DESCRIPTION: Check integer for an allowable range 85053289f6aSNate Lawson * 85153289f6aSNate Lawson ******************************************************************************/ 85253289f6aSNate Lawson 85353289f6aSNate Lawson ACPI_PARSE_OBJECT * 85453289f6aSNate Lawson UtCheckIntegerRange ( 85553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 85653289f6aSNate Lawson UINT32 LowValue, 85753289f6aSNate Lawson UINT32 HighValue) 85853289f6aSNate Lawson { 85953289f6aSNate Lawson 86053289f6aSNate Lawson if (!Op) 86153289f6aSNate Lawson { 8628ef1a331SJung-uk Kim return (NULL); 86353289f6aSNate Lawson } 86453289f6aSNate Lawson 8651df130f1SJung-uk Kim if ((Op->Asl.Value.Integer < LowValue) || 8661df130f1SJung-uk Kim (Op->Asl.Value.Integer > HighValue)) 86753289f6aSNate Lawson { 8686f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "0x%X, allowable: 0x%X-0x%X", 8691df130f1SJung-uk Kim (UINT32) Op->Asl.Value.Integer, LowValue, HighValue); 8701df130f1SJung-uk Kim 8716f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RANGE, Op, AslGbl_MsgBuffer); 8721df130f1SJung-uk Kim return (NULL); 87353289f6aSNate Lawson } 87453289f6aSNate Lawson 8751df130f1SJung-uk Kim return (Op); 87653289f6aSNate Lawson } 87753289f6aSNate Lawson 87853289f6aSNate Lawson 87953289f6aSNate Lawson /******************************************************************************* 88053289f6aSNate Lawson * 88153289f6aSNate Lawson * FUNCTION: UtInternalizeName 88253289f6aSNate Lawson * 88353289f6aSNate Lawson * PARAMETERS: ExternalName - Name to convert 88453289f6aSNate Lawson * ConvertedName - Where the converted name is returned 88553289f6aSNate Lawson * 88653289f6aSNate Lawson * RETURN: Status 88753289f6aSNate Lawson * 88853289f6aSNate Lawson * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name 88953289f6aSNate Lawson * 89053289f6aSNate Lawson ******************************************************************************/ 89153289f6aSNate Lawson 89253289f6aSNate Lawson ACPI_STATUS 89353289f6aSNate Lawson UtInternalizeName ( 89453289f6aSNate Lawson char *ExternalName, 89553289f6aSNate Lawson char **ConvertedName) 89653289f6aSNate Lawson { 89753289f6aSNate Lawson ACPI_NAMESTRING_INFO Info; 89853289f6aSNate Lawson ACPI_STATUS Status; 89953289f6aSNate Lawson 90053289f6aSNate Lawson 90153289f6aSNate Lawson if (!ExternalName) 90253289f6aSNate Lawson { 90353289f6aSNate Lawson return (AE_OK); 90453289f6aSNate Lawson } 90553289f6aSNate Lawson 90653289f6aSNate Lawson /* Get the length of the new internal name */ 90753289f6aSNate Lawson 90853289f6aSNate Lawson Info.ExternalName = ExternalName; 90953289f6aSNate Lawson AcpiNsGetInternalNameLength (&Info); 91053289f6aSNate Lawson 91153289f6aSNate Lawson /* We need a segment to store the internal name */ 91253289f6aSNate Lawson 91367d9aa44SJung-uk Kim Info.InternalName = UtLocalCacheCalloc (Info.Length); 91453289f6aSNate Lawson 91553289f6aSNate Lawson /* Build the name */ 91653289f6aSNate Lawson 91753289f6aSNate Lawson Status = AcpiNsBuildInternalName (&Info); 91853289f6aSNate Lawson if (ACPI_FAILURE (Status)) 91953289f6aSNate Lawson { 92053289f6aSNate Lawson return (Status); 92153289f6aSNate Lawson } 92253289f6aSNate Lawson 92353289f6aSNate Lawson *ConvertedName = Info.InternalName; 92453289f6aSNate Lawson return (AE_OK); 92553289f6aSNate Lawson } 92653289f6aSNate Lawson 92753289f6aSNate Lawson 92853289f6aSNate Lawson /******************************************************************************* 92953289f6aSNate Lawson * 93053289f6aSNate Lawson * FUNCTION: UtPadNameWithUnderscores 93153289f6aSNate Lawson * 93253289f6aSNate Lawson * PARAMETERS: NameSeg - Input nameseg 93353289f6aSNate Lawson * PaddedNameSeg - Output padded nameseg 93453289f6aSNate Lawson * 93553289f6aSNate Lawson * RETURN: Padded nameseg. 93653289f6aSNate Lawson * 93753289f6aSNate Lawson * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full 93853289f6aSNate Lawson * ACPI_NAME. 93953289f6aSNate Lawson * 94053289f6aSNate Lawson ******************************************************************************/ 94153289f6aSNate Lawson 942fba7fc7eSJung-uk Kim static void 94353289f6aSNate Lawson UtPadNameWithUnderscores ( 94453289f6aSNate Lawson char *NameSeg, 94553289f6aSNate Lawson char *PaddedNameSeg) 94653289f6aSNate Lawson { 94753289f6aSNate Lawson UINT32 i; 94853289f6aSNate Lawson 94953289f6aSNate Lawson 950278f0de6SJung-uk Kim for (i = 0; (i < ACPI_NAMESEG_SIZE); i++) 95153289f6aSNate Lawson { 95253289f6aSNate Lawson if (*NameSeg) 95353289f6aSNate Lawson { 95453289f6aSNate Lawson *PaddedNameSeg = *NameSeg; 95553289f6aSNate Lawson NameSeg++; 95653289f6aSNate Lawson } 95753289f6aSNate Lawson else 95853289f6aSNate Lawson { 95953289f6aSNate Lawson *PaddedNameSeg = '_'; 96053289f6aSNate Lawson } 961f8146b88SJung-uk Kim 96253289f6aSNate Lawson PaddedNameSeg++; 96353289f6aSNate Lawson } 96453289f6aSNate Lawson } 96553289f6aSNate Lawson 96653289f6aSNate Lawson 96753289f6aSNate Lawson /******************************************************************************* 96853289f6aSNate Lawson * 96953289f6aSNate Lawson * FUNCTION: UtAttachNameseg 97053289f6aSNate Lawson * 97153289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 97253289f6aSNate Lawson * Name - Full ExternalName 97353289f6aSNate Lawson * 974fba7fc7eSJung-uk Kim * RETURN: None; Sets the NameSeg field in parent node 97553289f6aSNate Lawson * 97653289f6aSNate Lawson * DESCRIPTION: Extract the last nameseg of the ExternalName and store it 97753289f6aSNate Lawson * in the NameSeg field of the Op. 97853289f6aSNate Lawson * 97953289f6aSNate Lawson ******************************************************************************/ 98053289f6aSNate Lawson 981fba7fc7eSJung-uk Kim static void 98253289f6aSNate Lawson UtAttachNameseg ( 98353289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 98453289f6aSNate Lawson char *Name) 98553289f6aSNate Lawson { 98653289f6aSNate Lawson char *NameSeg; 98753289f6aSNate Lawson char PaddedNameSeg[4]; 98853289f6aSNate Lawson 98953289f6aSNate Lawson 99053289f6aSNate Lawson if (!Name) 99153289f6aSNate Lawson { 99253289f6aSNate Lawson return; 99353289f6aSNate Lawson } 99453289f6aSNate Lawson 99553289f6aSNate Lawson /* Look for the last dot in the namepath */ 99653289f6aSNate Lawson 99753289f6aSNate Lawson NameSeg = strrchr (Name, '.'); 99853289f6aSNate Lawson if (NameSeg) 99953289f6aSNate Lawson { 100053289f6aSNate Lawson /* Found last dot, we have also found the final nameseg */ 100153289f6aSNate Lawson 100253289f6aSNate Lawson NameSeg++; 100353289f6aSNate Lawson UtPadNameWithUnderscores (NameSeg, PaddedNameSeg); 100453289f6aSNate Lawson } 100553289f6aSNate Lawson else 100653289f6aSNate Lawson { 100753289f6aSNate Lawson /* No dots in the namepath, there is only a single nameseg. */ 100853289f6aSNate Lawson /* Handle prefixes */ 100953289f6aSNate Lawson 1010efcc2a30SJung-uk Kim while (ACPI_IS_ROOT_PREFIX (*Name) || 1011efcc2a30SJung-uk Kim ACPI_IS_PARENT_PREFIX (*Name)) 101253289f6aSNate Lawson { 101353289f6aSNate Lawson Name++; 101453289f6aSNate Lawson } 101553289f6aSNate Lawson 10168ef1a331SJung-uk Kim /* Remaining string should be one single nameseg */ 101753289f6aSNate Lawson 101853289f6aSNate Lawson UtPadNameWithUnderscores (Name, PaddedNameSeg); 101953289f6aSNate Lawson } 102053289f6aSNate Lawson 1021278f0de6SJung-uk Kim ACPI_COPY_NAMESEG (Op->Asl.NameSeg, PaddedNameSeg); 102253289f6aSNate Lawson } 102353289f6aSNate Lawson 102453289f6aSNate Lawson 102553289f6aSNate Lawson /******************************************************************************* 102653289f6aSNate Lawson * 102753289f6aSNate Lawson * FUNCTION: UtAttachNamepathToOwner 102853289f6aSNate Lawson * 102953289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 103053289f6aSNate Lawson * NameOp - Node that contains the name 103153289f6aSNate Lawson * 103253289f6aSNate Lawson * RETURN: Sets the ExternalName and Namepath in the parent node 103353289f6aSNate Lawson * 103453289f6aSNate Lawson * DESCRIPTION: Store the name in two forms in the parent node: The original 103553289f6aSNate Lawson * (external) name, and the internalized name that is used within 103653289f6aSNate Lawson * the ACPI namespace manager. 103753289f6aSNate Lawson * 103853289f6aSNate Lawson ******************************************************************************/ 103953289f6aSNate Lawson 104053289f6aSNate Lawson void 104153289f6aSNate Lawson UtAttachNamepathToOwner ( 104253289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 104353289f6aSNate Lawson ACPI_PARSE_OBJECT *NameOp) 104453289f6aSNate Lawson { 104553289f6aSNate Lawson ACPI_STATUS Status; 104653289f6aSNate Lawson 104753289f6aSNate Lawson 104853289f6aSNate Lawson /* Full external path */ 104953289f6aSNate Lawson 105053289f6aSNate Lawson Op->Asl.ExternalName = NameOp->Asl.Value.String; 105153289f6aSNate Lawson 1052fba7fc7eSJung-uk Kim /* Save the NameOp for possible error reporting later */ 1053fba7fc7eSJung-uk Kim 1054fba7fc7eSJung-uk Kim Op->Asl.ParentMethod = (void *) NameOp; 1055fba7fc7eSJung-uk Kim 105653289f6aSNate Lawson /* Last nameseg of the path */ 105753289f6aSNate Lawson 105853289f6aSNate Lawson UtAttachNameseg (Op, Op->Asl.ExternalName); 105953289f6aSNate Lawson 106053289f6aSNate Lawson /* Create internalized path */ 106153289f6aSNate Lawson 106253289f6aSNate Lawson Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath); 106353289f6aSNate Lawson if (ACPI_FAILURE (Status)) 106453289f6aSNate Lawson { 106553289f6aSNate Lawson /* TBD: abort on no memory */ 106653289f6aSNate Lawson } 106753289f6aSNate Lawson } 106853289f6aSNate Lawson 106953289f6aSNate Lawson 107053289f6aSNate Lawson /******************************************************************************* 107153289f6aSNate Lawson * 1072a009b7dcSJung-uk Kim * FUNCTION: UtNameContainsAllPrefix 1073a009b7dcSJung-uk Kim * 1074a009b7dcSJung-uk Kim * PARAMETERS: Op - Op containing NameString 1075a009b7dcSJung-uk Kim * 1076a009b7dcSJung-uk Kim * RETURN: NameString consists of all ^ characters 1077a009b7dcSJung-uk Kim * 1078a009b7dcSJung-uk Kim * DESCRIPTION: Determine if this Op contains a name segment that consists of 1079a009b7dcSJung-uk Kim * all '^' characters. 1080a009b7dcSJung-uk Kim * 1081a009b7dcSJung-uk Kim ******************************************************************************/ 1082a009b7dcSJung-uk Kim 1083a009b7dcSJung-uk Kim BOOLEAN 1084a009b7dcSJung-uk Kim UtNameContainsAllPrefix ( 1085a009b7dcSJung-uk Kim ACPI_PARSE_OBJECT *Op) 1086a009b7dcSJung-uk Kim { 1087a009b7dcSJung-uk Kim UINT32 Length = Op->Asl.AmlLength; 1088a009b7dcSJung-uk Kim UINT32 i; 1089a009b7dcSJung-uk Kim 1090a009b7dcSJung-uk Kim for (i = 0; i < Length; i++) 1091a009b7dcSJung-uk Kim { 1092a009b7dcSJung-uk Kim if (Op->Asl.Value.String[i] != '^') 1093a009b7dcSJung-uk Kim { 1094a009b7dcSJung-uk Kim return (FALSE); 1095a009b7dcSJung-uk Kim } 1096a009b7dcSJung-uk Kim } 1097a009b7dcSJung-uk Kim 1098a009b7dcSJung-uk Kim return (TRUE); 1099a009b7dcSJung-uk Kim } 1100a009b7dcSJung-uk Kim 1101a009b7dcSJung-uk Kim /******************************************************************************* 1102a009b7dcSJung-uk Kim * 110353289f6aSNate Lawson * FUNCTION: UtDoConstant 110453289f6aSNate Lawson * 11052f6a1a81SJung-uk Kim * PARAMETERS: String - Hex/Decimal/Octal 110653289f6aSNate Lawson * 110753289f6aSNate Lawson * RETURN: Converted Integer 110853289f6aSNate Lawson * 11092f6a1a81SJung-uk Kim * DESCRIPTION: Convert a string to an integer, with overflow/error checking. 111053289f6aSNate Lawson * 111153289f6aSNate Lawson ******************************************************************************/ 111253289f6aSNate Lawson 11139a179dd8SJung-uk Kim UINT64 111453289f6aSNate Lawson UtDoConstant ( 111553289f6aSNate Lawson char *String) 111653289f6aSNate Lawson { 111753289f6aSNate Lawson ACPI_STATUS Status; 11182f6a1a81SJung-uk Kim UINT64 ConvertedInteger; 1119f15e9afbSJung-uk Kim char ErrBuf[128]; 1120f15e9afbSJung-uk Kim const ACPI_EXCEPTION_INFO *ExceptionInfo; 112153289f6aSNate Lawson 112253289f6aSNate Lawson 11232f6a1a81SJung-uk Kim Status = AcpiUtStrtoul64 (String, &ConvertedInteger); 112453289f6aSNate Lawson if (ACPI_FAILURE (Status)) 112553289f6aSNate Lawson { 1126f15e9afbSJung-uk Kim ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status); 1127f15e9afbSJung-uk Kim sprintf (ErrBuf, " %s while converting to 64-bit integer", 1128f15e9afbSJung-uk Kim ExceptionInfo->Description); 11292f6a1a81SJung-uk Kim 11306f1f1a63SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber, 11316f1f1a63SJung-uk Kim AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset, 11326f1f1a63SJung-uk Kim AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename, ErrBuf); 113353289f6aSNate Lawson } 113453289f6aSNate Lawson 11352f6a1a81SJung-uk Kim return (ConvertedInteger); 113653289f6aSNate Lawson } 1137a009b7dcSJung-uk Kim 1138a009b7dcSJung-uk Kim 1139a009b7dcSJung-uk Kim /****************************************************************************** 1140a009b7dcSJung-uk Kim * 1141a009b7dcSJung-uk Kim * FUNCTION: AcpiUtStrdup 1142a009b7dcSJung-uk Kim * 1143a009b7dcSJung-uk Kim * PARAMETERS: String1 - string to duplicate 1144a009b7dcSJung-uk Kim * 1145a009b7dcSJung-uk Kim * RETURN: int that signifies string relationship. Zero means strings 1146a009b7dcSJung-uk Kim * are equal. 1147a009b7dcSJung-uk Kim * 1148a009b7dcSJung-uk Kim * DESCRIPTION: Duplicate the string using UtCacheAlloc to avoid manual memory 1149a009b7dcSJung-uk Kim * reclamation. 1150a009b7dcSJung-uk Kim * 1151a009b7dcSJung-uk Kim ******************************************************************************/ 1152a009b7dcSJung-uk Kim 1153a009b7dcSJung-uk Kim char * 1154a009b7dcSJung-uk Kim AcpiUtStrdup ( 1155a009b7dcSJung-uk Kim char *String) 1156a009b7dcSJung-uk Kim { 1157a009b7dcSJung-uk Kim char *NewString = (char *) UtLocalCalloc (strlen (String) + 1); 1158a009b7dcSJung-uk Kim 1159a009b7dcSJung-uk Kim 1160a009b7dcSJung-uk Kim strcpy (NewString, String); 1161a009b7dcSJung-uk Kim return (NewString); 1162a009b7dcSJung-uk Kim } 1163a009b7dcSJung-uk Kim 1164a009b7dcSJung-uk Kim 1165a009b7dcSJung-uk Kim /****************************************************************************** 1166a009b7dcSJung-uk Kim * 1167a009b7dcSJung-uk Kim * FUNCTION: AcpiUtStrcat 1168a009b7dcSJung-uk Kim * 1169a009b7dcSJung-uk Kim * PARAMETERS: String1 1170a009b7dcSJung-uk Kim * String2 1171a009b7dcSJung-uk Kim * 1172a009b7dcSJung-uk Kim * RETURN: New string with String1 concatenated with String2 1173a009b7dcSJung-uk Kim * 1174a009b7dcSJung-uk Kim * DESCRIPTION: Concatenate string1 and string2 1175a009b7dcSJung-uk Kim * 1176a009b7dcSJung-uk Kim ******************************************************************************/ 1177a009b7dcSJung-uk Kim 1178a009b7dcSJung-uk Kim char * 1179a009b7dcSJung-uk Kim AcpiUtStrcat ( 1180a009b7dcSJung-uk Kim char *String1, 1181a009b7dcSJung-uk Kim char *String2) 1182a009b7dcSJung-uk Kim { 1183a009b7dcSJung-uk Kim UINT32 String1Length = strlen (String1); 1184a009b7dcSJung-uk Kim char *NewString = (char *) UtLocalCalloc (strlen (String1) + strlen (String2) + 1); 1185a009b7dcSJung-uk Kim 1186a009b7dcSJung-uk Kim strcpy (NewString, String1); 1187a009b7dcSJung-uk Kim strcpy (NewString + String1Length, String2); 1188a009b7dcSJung-uk Kim return (NewString); 1189a009b7dcSJung-uk Kim } 1190