10d84335fSJung-uk Kim /****************************************************************************** 20d84335fSJung-uk Kim * 30d84335fSJung-uk Kim * Module Name: cvparser - Converter functions that are called from the AML 40d84335fSJung-uk Kim * parser. 50d84335fSJung-uk Kim * 60d84335fSJung-uk Kim *****************************************************************************/ 70d84335fSJung-uk Kim 80d84335fSJung-uk Kim /****************************************************************************** 90d84335fSJung-uk Kim * 100d84335fSJung-uk Kim * 1. Copyright Notice 110d84335fSJung-uk Kim * 120d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 130d84335fSJung-uk Kim * All rights reserved. 140d84335fSJung-uk Kim * 150d84335fSJung-uk Kim * 2. License 160d84335fSJung-uk Kim * 170d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 180d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 190d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 200d84335fSJung-uk Kim * property rights. 210d84335fSJung-uk Kim * 220d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 230d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 240d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 250d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 260d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 270d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 280d84335fSJung-uk Kim * 290d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 300d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 310d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 320d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 330d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 340d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 350d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 360d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 370d84335fSJung-uk Kim * 380d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 390d84335fSJung-uk Kim * conditions are met: 400d84335fSJung-uk Kim * 410d84335fSJung-uk Kim * 3. Conditions 420d84335fSJung-uk Kim * 430d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 440d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 450d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 460d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 470d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 480d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 490d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 500d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 510d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 520d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 530d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 540d84335fSJung-uk Kim * 550d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 560d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 570d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 580d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 590d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 600d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 610d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 620d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 630d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 640d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 650d84335fSJung-uk Kim * make. 660d84335fSJung-uk Kim * 670d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 680d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 690d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 700d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 710d84335fSJung-uk Kim * distribution. 720d84335fSJung-uk Kim * 730d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 740d84335fSJung-uk Kim * Intel Code. 750d84335fSJung-uk Kim * 760d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 770d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 780d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 790d84335fSJung-uk Kim * without prior written authorization from Intel. 800d84335fSJung-uk Kim * 810d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 820d84335fSJung-uk Kim * 830d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 840d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 850d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 860d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 870d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 880d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 890d84335fSJung-uk Kim * PARTICULAR PURPOSE. 900d84335fSJung-uk Kim * 910d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 920d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 930d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 940d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 950d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 960d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 970d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 980d84335fSJung-uk Kim * LIMITED REMEDY. 990d84335fSJung-uk Kim * 1000d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1010d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1020d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1030d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1040d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1050d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1060d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1070d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1080d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1090d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1100d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1110d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1120d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1130d84335fSJung-uk Kim * such license, approval or letter. 1140d84335fSJung-uk Kim * 1150d84335fSJung-uk Kim ***************************************************************************** 1160d84335fSJung-uk Kim * 1170d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1180d84335fSJung-uk Kim * following license: 1190d84335fSJung-uk Kim * 1200d84335fSJung-uk Kim * Redistribution and use in source and binary forms, with or without 1210d84335fSJung-uk Kim * modification, are permitted provided that the following conditions 1220d84335fSJung-uk Kim * are met: 1230d84335fSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 1240d84335fSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 1250d84335fSJung-uk Kim * without modification. 1260d84335fSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1270d84335fSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 1280d84335fSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 1290d84335fSJung-uk Kim * including a substantially similar Disclaimer requirement for further 1300d84335fSJung-uk Kim * binary redistribution. 1310d84335fSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 1320d84335fSJung-uk Kim * of any contributors may be used to endorse or promote products derived 1330d84335fSJung-uk Kim * from this software without specific prior written permission. 1340d84335fSJung-uk Kim * 1350d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1360d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1370d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1380d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1390d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1400d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1410d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1420d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1430d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1440d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1450d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1460d84335fSJung-uk Kim * 1470d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1480d84335fSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 1490d84335fSJung-uk Kim * Software Foundation. 1500d84335fSJung-uk Kim * 1510d84335fSJung-uk Kim *****************************************************************************/ 1520d84335fSJung-uk Kim 1530d84335fSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 1540d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 1550d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 1560d84335fSJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 1570d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 1580d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 1590d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acconvert.h> 1600d84335fSJung-uk Kim 1610d84335fSJung-uk Kim 1620d84335fSJung-uk Kim /* local prototypes */ 1630d84335fSJung-uk Kim 1640d84335fSJung-uk Kim static BOOLEAN 1650d84335fSJung-uk Kim CvCommentExists ( 1660d84335fSJung-uk Kim UINT8 *Address); 1670d84335fSJung-uk Kim 1680d84335fSJung-uk Kim static BOOLEAN 1690d84335fSJung-uk Kim CvIsFilename ( 1700d84335fSJung-uk Kim char *Filename); 1710d84335fSJung-uk Kim 1720d84335fSJung-uk Kim static ACPI_FILE_NODE* 1730d84335fSJung-uk Kim CvFileAddressLookup( 1740d84335fSJung-uk Kim char *Address, 1750d84335fSJung-uk Kim ACPI_FILE_NODE *Head); 1760d84335fSJung-uk Kim 1770d84335fSJung-uk Kim static void 1780d84335fSJung-uk Kim CvAddToFileTree ( 1790d84335fSJung-uk Kim char *Filename, 1800d84335fSJung-uk Kim char *PreviousFilename); 1810d84335fSJung-uk Kim 1820d84335fSJung-uk Kim static void 1830d84335fSJung-uk Kim CvSetFileParent ( 1840d84335fSJung-uk Kim char *ChildFile, 1850d84335fSJung-uk Kim char *ParentFile); 1860d84335fSJung-uk Kim 1870d84335fSJung-uk Kim 1880d84335fSJung-uk Kim /******************************************************************************* 1890d84335fSJung-uk Kim * 1900d84335fSJung-uk Kim * FUNCTION: CvIsFilename 1910d84335fSJung-uk Kim * 1920d84335fSJung-uk Kim * PARAMETERS: filename - input filename 1930d84335fSJung-uk Kim * 1940d84335fSJung-uk Kim * RETURN: BOOLEAN - TRUE if all characters are between 0x20 and 0x7f 1950d84335fSJung-uk Kim * 1960d84335fSJung-uk Kim * DESCRIPTION: Take a given char * and see if it contains all printable 1970d84335fSJung-uk Kim * characters. If all characters have hexvalues 20-7f and ends with 1980d84335fSJung-uk Kim * .dsl, we will assume that it is a proper filename. 1990d84335fSJung-uk Kim * 2000d84335fSJung-uk Kim ******************************************************************************/ 2010d84335fSJung-uk Kim 2020d84335fSJung-uk Kim static BOOLEAN 2030d84335fSJung-uk Kim CvIsFilename ( 2040d84335fSJung-uk Kim char *Filename) 2050d84335fSJung-uk Kim { 2060d84335fSJung-uk Kim UINT64 Length = strlen(Filename); 2070d84335fSJung-uk Kim UINT64 i; 2080d84335fSJung-uk Kim char *FileExt = Filename + Length - 4; 2090d84335fSJung-uk Kim 2100d84335fSJung-uk Kim 2110d84335fSJung-uk Kim if ((Length > 4) && AcpiUtStricmp (FileExt, ".dsl")) 2120d84335fSJung-uk Kim { 2130d84335fSJung-uk Kim return FALSE; 2140d84335fSJung-uk Kim } 2150d84335fSJung-uk Kim 2160d84335fSJung-uk Kim for(i = 0; i<Length; ++i) 2170d84335fSJung-uk Kim { 218*af051161SJung-uk Kim if (!isprint ((int) Filename[i])) 2190d84335fSJung-uk Kim { 2200d84335fSJung-uk Kim return FALSE; 2210d84335fSJung-uk Kim } 2220d84335fSJung-uk Kim } 2230d84335fSJung-uk Kim return TRUE; 2240d84335fSJung-uk Kim } 2250d84335fSJung-uk Kim 2260d84335fSJung-uk Kim 2270d84335fSJung-uk Kim /******************************************************************************* 2280d84335fSJung-uk Kim * 2290d84335fSJung-uk Kim * FUNCTION: CvInitFileTree 2300d84335fSJung-uk Kim * 2310d84335fSJung-uk Kim * PARAMETERS: Table - input table 2320d84335fSJung-uk Kim * AmlStart - Address of the starting point of the AML. 2330d84335fSJung-uk Kim * AmlLength - Length of the AML file. 2340d84335fSJung-uk Kim * 2350d84335fSJung-uk Kim * RETURN: none 2360d84335fSJung-uk Kim * 2370d84335fSJung-uk Kim * DESCRIPTION: Initialize the file dependency tree by scanning the AML. 2380d84335fSJung-uk Kim * This is referred as ASL_CV_INIT_FILETREE. 2390d84335fSJung-uk Kim * 2400d84335fSJung-uk Kim ******************************************************************************/ 2410d84335fSJung-uk Kim 2420d84335fSJung-uk Kim void 2430d84335fSJung-uk Kim CvInitFileTree ( 2440d84335fSJung-uk Kim ACPI_TABLE_HEADER *Table, 2450d84335fSJung-uk Kim UINT8 *AmlStart, 2460d84335fSJung-uk Kim UINT32 AmlLength) 2470d84335fSJung-uk Kim { 2480d84335fSJung-uk Kim UINT8 *TreeAml; 2490d84335fSJung-uk Kim UINT8 *FileEnd; 2500d84335fSJung-uk Kim char *Filename = NULL; 2510d84335fSJung-uk Kim char *PreviousFilename = NULL; 2520d84335fSJung-uk Kim char *ParentFilename = NULL; 2530d84335fSJung-uk Kim char *ChildFilename = NULL; 2540d84335fSJung-uk Kim 2550d84335fSJung-uk Kim 2560d84335fSJung-uk Kim if (!Gbl_CaptureComments) 2570d84335fSJung-uk Kim { 2580d84335fSJung-uk Kim return; 2590d84335fSJung-uk Kim } 2600d84335fSJung-uk Kim 2610d84335fSJung-uk Kim CvDbgPrint ("AmlLength: %x\n", AmlLength); 2620d84335fSJung-uk Kim CvDbgPrint ("AmlStart: %p\n", AmlStart); 2630d84335fSJung-uk Kim CvDbgPrint ("AmlEnd?: %p\n", AmlStart+AmlLength); 2640d84335fSJung-uk Kim 2650d84335fSJung-uk Kim AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 2660d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart); 2670d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length); 2680d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Next = NULL; 2690d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Parent = NULL; 2700d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2); 2710d84335fSJung-uk Kim 2720d84335fSJung-uk Kim /* Set the root file to the current open file */ 2730d84335fSJung-uk Kim 2740d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile; 2750d84335fSJung-uk Kim 2760d84335fSJung-uk Kim /* 2770d84335fSJung-uk Kim * Set this to true because we dont need to output 2780d84335fSJung-uk Kim * an include statement for the topmost file 2790d84335fSJung-uk Kim */ 2800d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->IncludeWritten = TRUE; 2810d84335fSJung-uk Kim Filename = NULL; 2820d84335fSJung-uk Kim AcpiGbl_CurrentFilename = (char *)(AmlStart+2); 2830d84335fSJung-uk Kim AcpiGbl_RootFilename = (char *)(AmlStart+2); 2840d84335fSJung-uk Kim 2850d84335fSJung-uk Kim TreeAml = AmlStart; 2860d84335fSJung-uk Kim FileEnd = AmlStart + AmlLength; 2870d84335fSJung-uk Kim 2880d84335fSJung-uk Kim while (TreeAml <= FileEnd) 2890d84335fSJung-uk Kim { 2900d84335fSJung-uk Kim /* 2910d84335fSJung-uk Kim * Make sure that this filename contains all printable characters 2920d84335fSJung-uk Kim * and a .dsl extension at the end. If not, then it must be some 2930d84335fSJung-uk Kim * raw data that doesn't outline a filename. 2940d84335fSJung-uk Kim */ 2950d84335fSJung-uk Kim if ((*TreeAml == AML_COMMENT_OP) && 2960d84335fSJung-uk Kim (*(TreeAml+1) == FILENAME_COMMENT) && 2970d84335fSJung-uk Kim (CvIsFilename ((char *)(TreeAml+2)))) 2980d84335fSJung-uk Kim { 2990d84335fSJung-uk Kim CvDbgPrint ("A9 and a 08 file\n"); 3000d84335fSJung-uk Kim PreviousFilename = Filename; 3010d84335fSJung-uk Kim Filename = (char *) (TreeAml+2); 3020d84335fSJung-uk Kim CvAddToFileTree (Filename, PreviousFilename); 3030d84335fSJung-uk Kim ChildFilename = Filename; 3040d84335fSJung-uk Kim CvDbgPrint ("%s\n", Filename); 3050d84335fSJung-uk Kim } 3060d84335fSJung-uk Kim else if ((*TreeAml == AML_COMMENT_OP) && 3070d84335fSJung-uk Kim (*(TreeAml+1) == PARENTFILENAME_COMMENT) && 3080d84335fSJung-uk Kim (CvIsFilename ((char *)(TreeAml+2)))) 3090d84335fSJung-uk Kim { 3100d84335fSJung-uk Kim CvDbgPrint ("A9 and a 09 file\n"); 3110d84335fSJung-uk Kim ParentFilename = (char *)(TreeAml+2); 3120d84335fSJung-uk Kim CvSetFileParent (ChildFilename, ParentFilename); 3130d84335fSJung-uk Kim CvDbgPrint ("%s\n", ParentFilename); 3140d84335fSJung-uk Kim } 3150d84335fSJung-uk Kim ++TreeAml; 3160d84335fSJung-uk Kim } 3170d84335fSJung-uk Kim } 3180d84335fSJung-uk Kim 3190d84335fSJung-uk Kim 3200d84335fSJung-uk Kim /******************************************************************************* 3210d84335fSJung-uk Kim * 3220d84335fSJung-uk Kim * FUNCTION: CvClearOpComments 3230d84335fSJung-uk Kim * 3240d84335fSJung-uk Kim * PARAMETERS: Op -- clear all comments within this Op 3250d84335fSJung-uk Kim * 3260d84335fSJung-uk Kim * RETURN: none 3270d84335fSJung-uk Kim * 3280d84335fSJung-uk Kim * DESCRIPTION: Clear all converter-related fields of the given Op. 3290d84335fSJung-uk Kim * This is referred as ASL_CV_CLEAR_OP_COMMENTS. 3300d84335fSJung-uk Kim * 3310d84335fSJung-uk Kim ******************************************************************************/ 3320d84335fSJung-uk Kim 3330d84335fSJung-uk Kim void 3340d84335fSJung-uk Kim CvClearOpComments ( 3350d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 3360d84335fSJung-uk Kim { 3370d84335fSJung-uk Kim Op->Common.InlineComment = NULL; 3380d84335fSJung-uk Kim Op->Common.EndNodeComment = NULL; 3390d84335fSJung-uk Kim Op->Common.NameComment = NULL; 3400d84335fSJung-uk Kim Op->Common.CommentList = NULL; 3410d84335fSJung-uk Kim Op->Common.EndBlkComment = NULL; 3420d84335fSJung-uk Kim Op->Common.CloseBraceComment = NULL; 3430d84335fSJung-uk Kim Op->Common.CvFilename = NULL; 3440d84335fSJung-uk Kim Op->Common.CvParentFilename = NULL; 3450d84335fSJung-uk Kim } 3460d84335fSJung-uk Kim 3470d84335fSJung-uk Kim 3480d84335fSJung-uk Kim /******************************************************************************* 3490d84335fSJung-uk Kim * 3500d84335fSJung-uk Kim * FUNCTION: CvCommentExists 3510d84335fSJung-uk Kim * 3520d84335fSJung-uk Kim * PARAMETERS: address - check if this address appears in the list 3530d84335fSJung-uk Kim * 3540d84335fSJung-uk Kim * RETURN: BOOLEAN - TRUE if the address exists. 3550d84335fSJung-uk Kim * 3560d84335fSJung-uk Kim * DESCRIPTION: look at the pointer address and check if this appears in the 3570d84335fSJung-uk Kim * list of all addresses. If it exitsts in the list, return TRUE 3580d84335fSJung-uk Kim * if it exists. Otherwise add to the list and return FALSE. 3590d84335fSJung-uk Kim * 3600d84335fSJung-uk Kim ******************************************************************************/ 3610d84335fSJung-uk Kim 3620d84335fSJung-uk Kim static BOOLEAN 3630d84335fSJung-uk Kim CvCommentExists ( 3640d84335fSJung-uk Kim UINT8 *Address) 3650d84335fSJung-uk Kim { 3660d84335fSJung-uk Kim ACPI_COMMENT_ADDR_NODE *Current = AcpiGbl_CommentAddrListHead; 3670d84335fSJung-uk Kim UINT8 Option; 3680d84335fSJung-uk Kim 3690d84335fSJung-uk Kim 3700d84335fSJung-uk Kim if (!Address) 3710d84335fSJung-uk Kim { 3720d84335fSJung-uk Kim return (FALSE); 3730d84335fSJung-uk Kim } 3740d84335fSJung-uk Kim Option = *(Address + 1); 3750d84335fSJung-uk Kim 3760d84335fSJung-uk Kim /* 3770d84335fSJung-uk Kim * FILENAME_COMMENT and PARENTFILENAME_COMMENT are not treated as comments. 3780d84335fSJung-uk Kim * They serve as markers for where the file starts and ends. 3790d84335fSJung-uk Kim */ 3800d84335fSJung-uk Kim if ((Option == FILENAME_COMMENT) || (Option == PARENTFILENAME_COMMENT)) 3810d84335fSJung-uk Kim { 3820d84335fSJung-uk Kim return (FALSE); 3830d84335fSJung-uk Kim } 3840d84335fSJung-uk Kim 3850d84335fSJung-uk Kim if (!Current) 3860d84335fSJung-uk Kim { 3870d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead = 3880d84335fSJung-uk Kim AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 3890d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Addr = Address; 3900d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Next = NULL; 3910d84335fSJung-uk Kim return (FALSE); 3920d84335fSJung-uk Kim } 3930d84335fSJung-uk Kim else 3940d84335fSJung-uk Kim { 3950d84335fSJung-uk Kim while (Current) 3960d84335fSJung-uk Kim { 3970d84335fSJung-uk Kim if (Current->Addr != Address) 3980d84335fSJung-uk Kim { 3990d84335fSJung-uk Kim Current = Current->Next; 4000d84335fSJung-uk Kim } 4010d84335fSJung-uk Kim else 4020d84335fSJung-uk Kim { 4030d84335fSJung-uk Kim return (TRUE); 4040d84335fSJung-uk Kim } 4050d84335fSJung-uk Kim } 4060d84335fSJung-uk Kim 4070d84335fSJung-uk Kim /* 4080d84335fSJung-uk Kim * If the execution gets to this point, it means that this address 4090d84335fSJung-uk Kim * does not exists in the list. Add this address to the 4100d84335fSJung-uk Kim * beginning of the list. 4110d84335fSJung-uk Kim */ 4120d84335fSJung-uk Kim Current = AcpiGbl_CommentAddrListHead; 4130d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead = 4140d84335fSJung-uk Kim AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 4150d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Addr = Address; 4160d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Next = Current; 4170d84335fSJung-uk Kim return (FALSE); 4180d84335fSJung-uk Kim } 4190d84335fSJung-uk Kim } 4200d84335fSJung-uk Kim 4210d84335fSJung-uk Kim 4220d84335fSJung-uk Kim /******************************************************************************* 4230d84335fSJung-uk Kim * 4240d84335fSJung-uk Kim * FUNCTION: CvFilenameExists 4250d84335fSJung-uk Kim * 4260d84335fSJung-uk Kim * PARAMETERS: Filename - filename to search 4270d84335fSJung-uk Kim * 4280d84335fSJung-uk Kim * RETURN: ACPI_FILE_NODE - a pointer to a file node 4290d84335fSJung-uk Kim * 4300d84335fSJung-uk Kim * DESCRIPTION: Look for the given filename in the file dependency tree. 4310d84335fSJung-uk Kim * Returns the file node if it exists, returns NULL if it does not. 4320d84335fSJung-uk Kim * 4330d84335fSJung-uk Kim ******************************************************************************/ 4340d84335fSJung-uk Kim 4350d84335fSJung-uk Kim ACPI_FILE_NODE* 4360d84335fSJung-uk Kim CvFilenameExists( 4370d84335fSJung-uk Kim char *Filename, 4380d84335fSJung-uk Kim ACPI_FILE_NODE *Head) 4390d84335fSJung-uk Kim { 4400d84335fSJung-uk Kim ACPI_FILE_NODE *Current = Head; 4410d84335fSJung-uk Kim 4420d84335fSJung-uk Kim 443*af051161SJung-uk Kim if (!Filename) 444*af051161SJung-uk Kim { 445*af051161SJung-uk Kim return (NULL); 446*af051161SJung-uk Kim } 447*af051161SJung-uk Kim 4480d84335fSJung-uk Kim while (Current) 4490d84335fSJung-uk Kim { 4500d84335fSJung-uk Kim if (!AcpiUtStricmp (Current->Filename, Filename)) 4510d84335fSJung-uk Kim { 4520d84335fSJung-uk Kim return (Current); 4530d84335fSJung-uk Kim } 4540d84335fSJung-uk Kim Current = Current->Next; 4550d84335fSJung-uk Kim } 4560d84335fSJung-uk Kim return (NULL); 4570d84335fSJung-uk Kim } 4580d84335fSJung-uk Kim 4590d84335fSJung-uk Kim 4600d84335fSJung-uk Kim /******************************************************************************* 4610d84335fSJung-uk Kim * 4620d84335fSJung-uk Kim * FUNCTION: CvFileAddressLookup 4630d84335fSJung-uk Kim * 4640d84335fSJung-uk Kim * PARAMETERS: Address - address to look up 4650d84335fSJung-uk Kim * Head - file dependency tree 4660d84335fSJung-uk Kim * 4670d84335fSJung-uk Kim * RETURN: ACPI_FLE_NODE - pointer to a file node containing the address 4680d84335fSJung-uk Kim * 4690d84335fSJung-uk Kim * DESCRIPTION: Look for the given address in the file dependency tree. 4700d84335fSJung-uk Kim * Returns the first file node where the given address is within 4710d84335fSJung-uk Kim * the file node's starting and ending address. 4720d84335fSJung-uk Kim * 4730d84335fSJung-uk Kim ******************************************************************************/ 4740d84335fSJung-uk Kim 4750d84335fSJung-uk Kim static ACPI_FILE_NODE* 4760d84335fSJung-uk Kim CvFileAddressLookup( 4770d84335fSJung-uk Kim char *Address, 4780d84335fSJung-uk Kim ACPI_FILE_NODE *Head) 4790d84335fSJung-uk Kim { 4800d84335fSJung-uk Kim ACPI_FILE_NODE *Current = Head; 4810d84335fSJung-uk Kim 4820d84335fSJung-uk Kim 4830d84335fSJung-uk Kim while (Current) 4840d84335fSJung-uk Kim { 4850d84335fSJung-uk Kim if ((Address >= Current->FileStart) && 4860d84335fSJung-uk Kim (Address < Current->FileEnd || 4870d84335fSJung-uk Kim !Current->FileEnd)) 4880d84335fSJung-uk Kim { 4890d84335fSJung-uk Kim return (Current); 4900d84335fSJung-uk Kim } 4910d84335fSJung-uk Kim Current = Current->Next; 4920d84335fSJung-uk Kim } 4930d84335fSJung-uk Kim 4940d84335fSJung-uk Kim return (NULL); 4950d84335fSJung-uk Kim } 4960d84335fSJung-uk Kim 4970d84335fSJung-uk Kim 4980d84335fSJung-uk Kim /******************************************************************************* 4990d84335fSJung-uk Kim * 5000d84335fSJung-uk Kim * FUNCTION: CvLabelFileNode 5010d84335fSJung-uk Kim * 5020d84335fSJung-uk Kim * PARAMETERS: Op 5030d84335fSJung-uk Kim * 5040d84335fSJung-uk Kim * RETURN: None 5050d84335fSJung-uk Kim * 5060d84335fSJung-uk Kim * DESCRIPTION: Takes a given parse op, looks up its Op->Common.Aml field 5070d84335fSJung-uk Kim * within the file tree and fills in approperiate file information 5080d84335fSJung-uk Kim * from a matching node within the tree. 5090d84335fSJung-uk Kim * This is referred as ASL_CV_LABEL_FILENODE. 5100d84335fSJung-uk Kim * 5110d84335fSJung-uk Kim ******************************************************************************/ 5120d84335fSJung-uk Kim 5130d84335fSJung-uk Kim void 5140d84335fSJung-uk Kim CvLabelFileNode( 5150d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 5160d84335fSJung-uk Kim { 5170d84335fSJung-uk Kim ACPI_FILE_NODE *Node; 5180d84335fSJung-uk Kim 5190d84335fSJung-uk Kim 5200d84335fSJung-uk Kim if (!Op) 5210d84335fSJung-uk Kim { 5220d84335fSJung-uk Kim return; 5230d84335fSJung-uk Kim } 5240d84335fSJung-uk Kim 5250d84335fSJung-uk Kim Node = CvFileAddressLookup ((char *)Op->Common.Aml, AcpiGbl_FileTreeRoot); 5260d84335fSJung-uk Kim if (!Node) 5270d84335fSJung-uk Kim { 5280d84335fSJung-uk Kim return; 5290d84335fSJung-uk Kim } 5300d84335fSJung-uk Kim 5310d84335fSJung-uk Kim Op->Common.CvFilename = Node->Filename; 5320d84335fSJung-uk Kim if (Node->Parent) 5330d84335fSJung-uk Kim { 5340d84335fSJung-uk Kim Op->Common.CvParentFilename = Node->Parent->Filename; 5350d84335fSJung-uk Kim } 5360d84335fSJung-uk Kim else 5370d84335fSJung-uk Kim { 5380d84335fSJung-uk Kim Op->Common.CvParentFilename = Node->Filename; 5390d84335fSJung-uk Kim } 5400d84335fSJung-uk Kim } 5410d84335fSJung-uk Kim 5420d84335fSJung-uk Kim 5430d84335fSJung-uk Kim /******************************************************************************* 5440d84335fSJung-uk Kim * 5450d84335fSJung-uk Kim * FUNCTION: CvAddToFileTree 5460d84335fSJung-uk Kim * 5470d84335fSJung-uk Kim * PARAMETERS: Filename - Address containing the name of the current 5480d84335fSJung-uk Kim * filename 5490d84335fSJung-uk Kim * PreviousFilename - Address containing the name of the previous 5500d84335fSJung-uk Kim * filename 5510d84335fSJung-uk Kim * 5520d84335fSJung-uk Kim * RETURN: void 5530d84335fSJung-uk Kim * 5540d84335fSJung-uk Kim * DESCRIPTION: Add this filename to the AcpiGbl_FileTree if it does not exist. 5550d84335fSJung-uk Kim * 5560d84335fSJung-uk Kim ******************************************************************************/ 5570d84335fSJung-uk Kim 5580d84335fSJung-uk Kim static void 5590d84335fSJung-uk Kim CvAddToFileTree ( 5600d84335fSJung-uk Kim char *Filename, 5610d84335fSJung-uk Kim char *PreviousFilename) 5620d84335fSJung-uk Kim { 5630d84335fSJung-uk Kim ACPI_FILE_NODE *Node; 5640d84335fSJung-uk Kim 5650d84335fSJung-uk Kim 5660d84335fSJung-uk Kim if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 5670d84335fSJung-uk Kim PreviousFilename) 5680d84335fSJung-uk Kim { 5690d84335fSJung-uk Kim Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 5700d84335fSJung-uk Kim if (Node) 5710d84335fSJung-uk Kim { 5720d84335fSJung-uk Kim /* 5730d84335fSJung-uk Kim * Set the end point of the PreviousFilename to the address 5740d84335fSJung-uk Kim * of Filename. 5750d84335fSJung-uk Kim */ 5760d84335fSJung-uk Kim Node->FileEnd = Filename; 5770d84335fSJung-uk Kim } 5780d84335fSJung-uk Kim } 5790d84335fSJung-uk Kim else if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 5800d84335fSJung-uk Kim !PreviousFilename) 5810d84335fSJung-uk Kim { 5820d84335fSJung-uk Kim return; 5830d84335fSJung-uk Kim } 5840d84335fSJung-uk Kim 5850d84335fSJung-uk Kim Node = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot); 5860d84335fSJung-uk Kim if (Node && PreviousFilename) 5870d84335fSJung-uk Kim { 5880d84335fSJung-uk Kim /* 5890d84335fSJung-uk Kim * Update the end of the previous file and all of their parents' ending 5900d84335fSJung-uk Kim * Addresses. This is done to ensure that parent file ranges extend to 5910d84335fSJung-uk Kim * the end of their childrens' files. 5920d84335fSJung-uk Kim */ 5930d84335fSJung-uk Kim Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 5940d84335fSJung-uk Kim if (Node && (Node->FileEnd < Filename)) 5950d84335fSJung-uk Kim { 5960d84335fSJung-uk Kim Node->FileEnd = Filename; 5970d84335fSJung-uk Kim Node = Node->Parent; 5980d84335fSJung-uk Kim while (Node) 5990d84335fSJung-uk Kim { 6000d84335fSJung-uk Kim if (Node->FileEnd < Filename) 6010d84335fSJung-uk Kim { 6020d84335fSJung-uk Kim Node->FileEnd = Filename; 6030d84335fSJung-uk Kim } 6040d84335fSJung-uk Kim Node = Node->Parent; 6050d84335fSJung-uk Kim } 6060d84335fSJung-uk Kim } 6070d84335fSJung-uk Kim } 6080d84335fSJung-uk Kim else 6090d84335fSJung-uk Kim { 6100d84335fSJung-uk Kim Node = AcpiGbl_FileTreeRoot; 6110d84335fSJung-uk Kim AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 6120d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Next = Node; 6130d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Parent = NULL; 6140d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Filename = Filename; 6150d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileStart = Filename; 6160d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->IncludeWritten = FALSE; 6170d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->File = fopen(Filename, "w+"); 6180d84335fSJung-uk Kim 6190d84335fSJung-uk Kim /* 6200d84335fSJung-uk Kim * If we can't open the file, we need to abort here before we 6210d84335fSJung-uk Kim * accidentally write to a NULL file. 6220d84335fSJung-uk Kim */ 6230d84335fSJung-uk Kim if (!AcpiGbl_FileTreeRoot->File) 6240d84335fSJung-uk Kim { 6250d84335fSJung-uk Kim /* delete the .xxx file */ 6260d84335fSJung-uk Kim 6270d84335fSJung-uk Kim FlDeleteFile (ASL_FILE_AML_OUTPUT); 6280d84335fSJung-uk Kim sprintf (MsgBuffer, "\"%s\" - %s", Filename, strerror (errno)); 6290d84335fSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, NULL, MsgBuffer); 6300d84335fSJung-uk Kim AslAbort (); 6310d84335fSJung-uk Kim } 6320d84335fSJung-uk Kim } 6330d84335fSJung-uk Kim } 6340d84335fSJung-uk Kim 6350d84335fSJung-uk Kim 6360d84335fSJung-uk Kim /******************************************************************************* 6370d84335fSJung-uk Kim * 6380d84335fSJung-uk Kim * FUNCTION: CvSetFileParent 6390d84335fSJung-uk Kim * 6400d84335fSJung-uk Kim * PARAMETERS: ChildFile - contains the filename of the child file 6410d84335fSJung-uk Kim * ParentFile - contains the filename of the parent file. 6420d84335fSJung-uk Kim * 6430d84335fSJung-uk Kim * RETURN: none 6440d84335fSJung-uk Kim * 6450d84335fSJung-uk Kim * DESCRIPTION: point the parent pointer of the Child to the node that 6460d84335fSJung-uk Kim * corresponds with the parent file node. 6470d84335fSJung-uk Kim * 6480d84335fSJung-uk Kim ******************************************************************************/ 6490d84335fSJung-uk Kim 6500d84335fSJung-uk Kim static void 6510d84335fSJung-uk Kim CvSetFileParent ( 6520d84335fSJung-uk Kim char *ChildFile, 6530d84335fSJung-uk Kim char *ParentFile) 6540d84335fSJung-uk Kim { 6550d84335fSJung-uk Kim ACPI_FILE_NODE *Child; 6560d84335fSJung-uk Kim ACPI_FILE_NODE *Parent; 6570d84335fSJung-uk Kim 6580d84335fSJung-uk Kim 6590d84335fSJung-uk Kim Child = CvFilenameExists (ChildFile, AcpiGbl_FileTreeRoot); 6600d84335fSJung-uk Kim Parent = CvFilenameExists (ParentFile, AcpiGbl_FileTreeRoot); 6610d84335fSJung-uk Kim if (Child && Parent) 6620d84335fSJung-uk Kim { 6630d84335fSJung-uk Kim Child->Parent = Parent; 6640d84335fSJung-uk Kim 6650d84335fSJung-uk Kim while (Child->Parent) 6660d84335fSJung-uk Kim { 6670d84335fSJung-uk Kim if (Child->Parent->FileEnd < Child->FileStart) 6680d84335fSJung-uk Kim { 6690d84335fSJung-uk Kim Child->Parent->FileEnd = Child->FileStart; 6700d84335fSJung-uk Kim } 6710d84335fSJung-uk Kim Child = Child->Parent; 6720d84335fSJung-uk Kim } 6730d84335fSJung-uk Kim } 6740d84335fSJung-uk Kim } 6750d84335fSJung-uk Kim 6760d84335fSJung-uk Kim 6770d84335fSJung-uk Kim /******************************************************************************* 6780d84335fSJung-uk Kim * 6790d84335fSJung-uk Kim * FUNCTION: CvCaptureCommentsOnly 6800d84335fSJung-uk Kim * 6810d84335fSJung-uk Kim * PARAMETERS: ParserState - A parser state object 6820d84335fSJung-uk Kim * 6830d84335fSJung-uk Kim * RETURN: none 6840d84335fSJung-uk Kim * 6850d84335fSJung-uk Kim * DESCRIPTION: look at the aml that the parser state is pointing to, 6860d84335fSJung-uk Kim * capture any AML_COMMENT_OP and it's arguments and increment the 6870d84335fSJung-uk Kim * aml pointer past the comment. Comments are transferred to parse 6880d84335fSJung-uk Kim * nodes through CvTransferComments() as well as 6890d84335fSJung-uk Kim * AcpiPsBuildNamedOp(). 6900d84335fSJung-uk Kim * This is referred as ASL_CV_CAPTURE_COMMENTS_ONLY. 6910d84335fSJung-uk Kim * 6920d84335fSJung-uk Kim ******************************************************************************/ 6930d84335fSJung-uk Kim 6940d84335fSJung-uk Kim void 6950d84335fSJung-uk Kim CvCaptureCommentsOnly ( 6960d84335fSJung-uk Kim ACPI_PARSE_STATE *ParserState) 6970d84335fSJung-uk Kim { 6980d84335fSJung-uk Kim UINT8 *Aml = ParserState->Aml; 6990d84335fSJung-uk Kim UINT16 Opcode = (UINT16) ACPI_GET8 (Aml); 7000d84335fSJung-uk Kim UINT32 Length = 0; 7010d84335fSJung-uk Kim UINT8 CommentOption = (UINT16) ACPI_GET8 (Aml+1); 7020d84335fSJung-uk Kim BOOLEAN StdDefBlockFlag = FALSE; 7030d84335fSJung-uk Kim ACPI_COMMENT_NODE *CommentNode; 7040d84335fSJung-uk Kim ACPI_FILE_NODE *FileNode; 7050d84335fSJung-uk Kim 7060d84335fSJung-uk Kim 7070d84335fSJung-uk Kim if (!Gbl_CaptureComments || 7080d84335fSJung-uk Kim Opcode != AML_COMMENT_OP) 7090d84335fSJung-uk Kim { 7100d84335fSJung-uk Kim return; 7110d84335fSJung-uk Kim } 7120d84335fSJung-uk Kim 7130d84335fSJung-uk Kim while (Opcode == AML_COMMENT_OP) 7140d84335fSJung-uk Kim { 7150d84335fSJung-uk Kim CvDbgPrint ("comment aml address: %p\n", Aml); 7160d84335fSJung-uk Kim 7170d84335fSJung-uk Kim if (CvCommentExists(ParserState->Aml)) 7180d84335fSJung-uk Kim { 7190d84335fSJung-uk Kim CvDbgPrint ("Avoiding capturing an existing comment.\n"); 7200d84335fSJung-uk Kim } 7210d84335fSJung-uk Kim else 7220d84335fSJung-uk Kim { 7230d84335fSJung-uk Kim CommentOption = *(Aml+1); 7240d84335fSJung-uk Kim 7250d84335fSJung-uk Kim /* Increment past the comment option and point the approperiate char pointers.*/ 7260d84335fSJung-uk Kim 7270d84335fSJung-uk Kim Aml += 2; 7280d84335fSJung-uk Kim 7290d84335fSJung-uk Kim /* found a comment. Now, set pointers to these comments. */ 7300d84335fSJung-uk Kim 7310d84335fSJung-uk Kim switch (CommentOption) 7320d84335fSJung-uk Kim { 7330d84335fSJung-uk Kim case STD_DEFBLK_COMMENT: 7340d84335fSJung-uk Kim 7350d84335fSJung-uk Kim StdDefBlockFlag = TRUE; 7360d84335fSJung-uk Kim 7370d84335fSJung-uk Kim /* add to a linked list of nodes. This list will be taken by the parse node created next. */ 7380d84335fSJung-uk Kim 7390d84335fSJung-uk Kim CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 7400d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 7410d84335fSJung-uk Kim CommentNode->Next = NULL; 7420d84335fSJung-uk Kim 7430d84335fSJung-uk Kim if (!AcpiGbl_DefBlkCommentListHead) 7440d84335fSJung-uk Kim { 7450d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListHead = CommentNode; 7460d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail = CommentNode; 7470d84335fSJung-uk Kim } 7480d84335fSJung-uk Kim else 7490d84335fSJung-uk Kim { 7500d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail->Next = CommentNode; 7510d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail = AcpiGbl_DefBlkCommentListTail->Next; 7520d84335fSJung-uk Kim } 7530d84335fSJung-uk Kim break; 7540d84335fSJung-uk Kim 7550d84335fSJung-uk Kim case STANDARD_COMMENT: 7560d84335fSJung-uk Kim 7570d84335fSJung-uk Kim CvDbgPrint ("found regular comment.\n"); 7580d84335fSJung-uk Kim 7590d84335fSJung-uk Kim /* add to a linked list of nodes. This list will be taken by the parse node created next. */ 7600d84335fSJung-uk Kim 7610d84335fSJung-uk Kim CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 7620d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 7630d84335fSJung-uk Kim CommentNode->Next = NULL; 7640d84335fSJung-uk Kim 7650d84335fSJung-uk Kim if (!AcpiGbl_RegCommentListHead) 7660d84335fSJung-uk Kim { 7670d84335fSJung-uk Kim AcpiGbl_RegCommentListHead = CommentNode; 7680d84335fSJung-uk Kim AcpiGbl_RegCommentListTail = CommentNode; 7690d84335fSJung-uk Kim } 7700d84335fSJung-uk Kim else 7710d84335fSJung-uk Kim { 7720d84335fSJung-uk Kim AcpiGbl_RegCommentListTail->Next = CommentNode; 7730d84335fSJung-uk Kim AcpiGbl_RegCommentListTail = AcpiGbl_RegCommentListTail->Next; 7740d84335fSJung-uk Kim } 7750d84335fSJung-uk Kim break; 7760d84335fSJung-uk Kim 7770d84335fSJung-uk Kim case ENDBLK_COMMENT: 7780d84335fSJung-uk Kim 7790d84335fSJung-uk Kim CvDbgPrint ("found endblk comment.\n"); 7800d84335fSJung-uk Kim 7810d84335fSJung-uk Kim /* add to a linked list of nodes. This will be taken by the next created parse node. */ 7820d84335fSJung-uk Kim 7830d84335fSJung-uk Kim CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 7840d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 7850d84335fSJung-uk Kim CommentNode->Next = NULL; 7860d84335fSJung-uk Kim 7870d84335fSJung-uk Kim if (!AcpiGbl_EndBlkCommentListHead) 7880d84335fSJung-uk Kim { 7890d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListHead = CommentNode; 7900d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail = CommentNode; 7910d84335fSJung-uk Kim } 7920d84335fSJung-uk Kim else 7930d84335fSJung-uk Kim { 7940d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail->Next = CommentNode; 7950d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail = AcpiGbl_EndBlkCommentListTail->Next; 7960d84335fSJung-uk Kim } 7970d84335fSJung-uk Kim break; 7980d84335fSJung-uk Kim 7990d84335fSJung-uk Kim case INLINE_COMMENT: 8000d84335fSJung-uk Kim 8010d84335fSJung-uk Kim CvDbgPrint ("found inline comment.\n"); 8020d84335fSJung-uk Kim AcpiGbl_CurrentInlineComment = ACPI_CAST_PTR (char, Aml); 8030d84335fSJung-uk Kim break; 8040d84335fSJung-uk Kim 8050d84335fSJung-uk Kim case ENDNODE_COMMENT: 8060d84335fSJung-uk Kim 8070d84335fSJung-uk Kim CvDbgPrint ("found EndNode comment.\n"); 8080d84335fSJung-uk Kim AcpiGbl_CurrentEndNodeComment = ACPI_CAST_PTR (char, Aml); 8090d84335fSJung-uk Kim break; 8100d84335fSJung-uk Kim 8110d84335fSJung-uk Kim case CLOSE_BRACE_COMMENT: 8120d84335fSJung-uk Kim 8130d84335fSJung-uk Kim CvDbgPrint ("found close brace comment.\n"); 8140d84335fSJung-uk Kim AcpiGbl_CurrentCloseBraceComment = ACPI_CAST_PTR (char, Aml); 8150d84335fSJung-uk Kim break; 8160d84335fSJung-uk Kim 8170d84335fSJung-uk Kim case END_DEFBLK_COMMENT: 8180d84335fSJung-uk Kim 8190d84335fSJung-uk Kim CvDbgPrint ("Found comment that belongs after the } for a definition block.\n"); 8200d84335fSJung-uk Kim AcpiGbl_CurrentScope->Common.CloseBraceComment = ACPI_CAST_PTR (char, Aml); 8210d84335fSJung-uk Kim break; 8220d84335fSJung-uk Kim 8230d84335fSJung-uk Kim case FILENAME_COMMENT: 8240d84335fSJung-uk Kim 8250d84335fSJung-uk Kim CvDbgPrint ("Found a filename: %s\n", ACPI_CAST_PTR (char, Aml)); 8260d84335fSJung-uk Kim FileNode = CvFilenameExists (ACPI_CAST_PTR (char, Aml), AcpiGbl_FileTreeRoot); 8270d84335fSJung-uk Kim 8280d84335fSJung-uk Kim /* 8290d84335fSJung-uk Kim * If there is an INCLUDE_COMMENT followed by a 8300d84335fSJung-uk Kim * FILENAME_COMMENT, then the INCLUDE_COMMENT is a comment 8310d84335fSJung-uk Kim * that is emitted before the #include for the file. 8320d84335fSJung-uk Kim * We will save the IncludeComment within the FileNode 8330d84335fSJung-uk Kim * associated with this FILENAME_COMMENT. 8340d84335fSJung-uk Kim */ 8350d84335fSJung-uk Kim if (FileNode && AcpiGbl_IncCommentListHead) 8360d84335fSJung-uk Kim { 8370d84335fSJung-uk Kim FileNode->IncludeComment = AcpiGbl_IncCommentListHead; 8380d84335fSJung-uk Kim AcpiGbl_IncCommentListHead = NULL; 8390d84335fSJung-uk Kim AcpiGbl_IncCommentListTail = NULL; 8400d84335fSJung-uk Kim } 8410d84335fSJung-uk Kim break; 8420d84335fSJung-uk Kim 8430d84335fSJung-uk Kim case PARENTFILENAME_COMMENT: 8440d84335fSJung-uk Kim CvDbgPrint (" Found a parent filename.\n"); 8450d84335fSJung-uk Kim break; 8460d84335fSJung-uk Kim 8470d84335fSJung-uk Kim case INCLUDE_COMMENT: 8480d84335fSJung-uk Kim 8490d84335fSJung-uk Kim /* 8500d84335fSJung-uk Kim * Add to a linked list. This list will be taken by the 8510d84335fSJung-uk Kim * parse node created next. See the FILENAME_COMMENT case 8520d84335fSJung-uk Kim * for more details 8530d84335fSJung-uk Kim */ 8540d84335fSJung-uk Kim CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 8550d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 8560d84335fSJung-uk Kim CommentNode->Next = NULL; 8570d84335fSJung-uk Kim 8580d84335fSJung-uk Kim if (!AcpiGbl_IncCommentListHead) 8590d84335fSJung-uk Kim { 8600d84335fSJung-uk Kim AcpiGbl_IncCommentListHead = CommentNode; 8610d84335fSJung-uk Kim AcpiGbl_IncCommentListTail = CommentNode; 8620d84335fSJung-uk Kim } 8630d84335fSJung-uk Kim else 8640d84335fSJung-uk Kim { 8650d84335fSJung-uk Kim AcpiGbl_IncCommentListTail->Next = CommentNode; 8660d84335fSJung-uk Kim AcpiGbl_IncCommentListTail = AcpiGbl_IncCommentListTail->Next; 8670d84335fSJung-uk Kim } 8680d84335fSJung-uk Kim 8690d84335fSJung-uk Kim CvDbgPrint ("Found a include comment: %s\n", CommentNode->Comment); 8700d84335fSJung-uk Kim break; 8710d84335fSJung-uk Kim 8720d84335fSJung-uk Kim default: 8730d84335fSJung-uk Kim 8740d84335fSJung-uk Kim /* Not a valid comment option. Revert the AML */ 8750d84335fSJung-uk Kim 8760d84335fSJung-uk Kim Aml -= 2; 8770d84335fSJung-uk Kim goto DefBlock; 8780d84335fSJung-uk Kim break; 8790d84335fSJung-uk Kim 8800d84335fSJung-uk Kim } /* end switch statement */ 8810d84335fSJung-uk Kim 8820d84335fSJung-uk Kim } /* end else */ 8830d84335fSJung-uk Kim 8840d84335fSJung-uk Kim /* determine the length and move forward that amount */ 8850d84335fSJung-uk Kim 8860d84335fSJung-uk Kim Length = 0; 8870d84335fSJung-uk Kim while (ParserState->Aml[Length]) 8880d84335fSJung-uk Kim { 8890d84335fSJung-uk Kim Length++; 8900d84335fSJung-uk Kim } 8910d84335fSJung-uk Kim 8920d84335fSJung-uk Kim ParserState->Aml += Length + 1; 8930d84335fSJung-uk Kim 8940d84335fSJung-uk Kim 8950d84335fSJung-uk Kim /* Peek at the next Opcode. */ 8960d84335fSJung-uk Kim 8970d84335fSJung-uk Kim Aml = ParserState->Aml; 8980d84335fSJung-uk Kim Opcode = (UINT16) ACPI_GET8 (Aml); 8990d84335fSJung-uk Kim 9000d84335fSJung-uk Kim } 9010d84335fSJung-uk Kim 9020d84335fSJung-uk Kim DefBlock: 9030d84335fSJung-uk Kim if (StdDefBlockFlag) 9040d84335fSJung-uk Kim { 9050d84335fSJung-uk Kim /* 9060d84335fSJung-uk Kim * Give all of its comments to the current scope, which is known as 9070d84335fSJung-uk Kim * the definition block, since STD_DEFBLK_COMMENT only appears after 9080d84335fSJung-uk Kim * definition block headers. 9090d84335fSJung-uk Kim */ 9100d84335fSJung-uk Kim AcpiGbl_CurrentScope->Common.CommentList 9110d84335fSJung-uk Kim = AcpiGbl_DefBlkCommentListHead; 9120d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListHead = NULL; 9130d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail = NULL; 9140d84335fSJung-uk Kim } 9150d84335fSJung-uk Kim } 9160d84335fSJung-uk Kim 9170d84335fSJung-uk Kim 9180d84335fSJung-uk Kim /******************************************************************************* 9190d84335fSJung-uk Kim * 9200d84335fSJung-uk Kim * FUNCTION: CvCaptureComments 9210d84335fSJung-uk Kim * 9220d84335fSJung-uk Kim * PARAMETERS: ParserState - A parser state object 9230d84335fSJung-uk Kim * 9240d84335fSJung-uk Kim * RETURN: none 9250d84335fSJung-uk Kim * 9260d84335fSJung-uk Kim * DESCRIPTION: Wrapper function for CvCaptureCommentsOnly 9270d84335fSJung-uk Kim * This is referred as ASL_CV_CAPTURE_COMMENTS. 9280d84335fSJung-uk Kim * 9290d84335fSJung-uk Kim ******************************************************************************/ 9300d84335fSJung-uk Kim 9310d84335fSJung-uk Kim void 9320d84335fSJung-uk Kim CvCaptureComments ( 9330d84335fSJung-uk Kim ACPI_WALK_STATE *WalkState) 9340d84335fSJung-uk Kim { 9350d84335fSJung-uk Kim UINT8 *Aml; 9360d84335fSJung-uk Kim UINT16 Opcode; 9370d84335fSJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9380d84335fSJung-uk Kim 9390d84335fSJung-uk Kim 9400d84335fSJung-uk Kim if (!Gbl_CaptureComments) 9410d84335fSJung-uk Kim { 9420d84335fSJung-uk Kim return; 9430d84335fSJung-uk Kim } 9440d84335fSJung-uk Kim 9450d84335fSJung-uk Kim /* 9460d84335fSJung-uk Kim * Before parsing, check to see that comments that come directly after 9470d84335fSJung-uk Kim * deferred opcodes aren't being processed. 9480d84335fSJung-uk Kim */ 9490d84335fSJung-uk Kim Aml = WalkState->ParserState.Aml; 9500d84335fSJung-uk Kim Opcode = (UINT16) ACPI_GET8 (Aml); 9510d84335fSJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Opcode); 9520d84335fSJung-uk Kim 9530d84335fSJung-uk Kim if (!(OpInfo->Flags & AML_DEFER) || 9540d84335fSJung-uk Kim ((OpInfo->Flags & AML_DEFER) && 9550d84335fSJung-uk Kim (WalkState->PassNumber != ACPI_IMODE_LOAD_PASS1))) 9560d84335fSJung-uk Kim { 9570d84335fSJung-uk Kim CvCaptureCommentsOnly (&WalkState->ParserState); 9580d84335fSJung-uk Kim WalkState->Aml = WalkState->ParserState.Aml; 9590d84335fSJung-uk Kim } 9600d84335fSJung-uk Kim 9610d84335fSJung-uk Kim } 9620d84335fSJung-uk Kim 9630d84335fSJung-uk Kim 9640d84335fSJung-uk Kim /******************************************************************************* 9650d84335fSJung-uk Kim * 9660d84335fSJung-uk Kim * FUNCTION: CvTransferComments 9670d84335fSJung-uk Kim * 9680d84335fSJung-uk Kim * PARAMETERS: Op - Transfer comments to this Op 9690d84335fSJung-uk Kim * 9700d84335fSJung-uk Kim * RETURN: none 9710d84335fSJung-uk Kim * 9720d84335fSJung-uk Kim * DESCRIPTION: Transfer all of the commments stored in global containers to the 9730d84335fSJung-uk Kim * given Op. This will be invoked shortly after the parser creates 9740d84335fSJung-uk Kim * a ParseOp. 9750d84335fSJung-uk Kim * This is referred as ASL_CV_TRANSFER_COMMENTS. 9760d84335fSJung-uk Kim * 9770d84335fSJung-uk Kim ******************************************************************************/ 9780d84335fSJung-uk Kim 9790d84335fSJung-uk Kim void 9800d84335fSJung-uk Kim CvTransferComments ( 9810d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 9820d84335fSJung-uk Kim { 9830d84335fSJung-uk Kim Op->Common.InlineComment = AcpiGbl_CurrentInlineComment; 9840d84335fSJung-uk Kim AcpiGbl_CurrentInlineComment = NULL; 9850d84335fSJung-uk Kim 9860d84335fSJung-uk Kim Op->Common.EndNodeComment = AcpiGbl_CurrentEndNodeComment; 9870d84335fSJung-uk Kim AcpiGbl_CurrentEndNodeComment = NULL; 9880d84335fSJung-uk Kim 9890d84335fSJung-uk Kim Op->Common.CloseBraceComment = AcpiGbl_CurrentCloseBraceComment; 9900d84335fSJung-uk Kim AcpiGbl_CurrentCloseBraceComment = NULL; 9910d84335fSJung-uk Kim 9920d84335fSJung-uk Kim Op->Common.CommentList = AcpiGbl_RegCommentListHead; 9930d84335fSJung-uk Kim AcpiGbl_RegCommentListHead = NULL; 9940d84335fSJung-uk Kim AcpiGbl_RegCommentListTail = NULL; 9950d84335fSJung-uk Kim 9960d84335fSJung-uk Kim Op->Common.EndBlkComment = AcpiGbl_EndBlkCommentListHead; 9970d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListHead = NULL; 9980d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail = NULL; 9990d84335fSJung-uk Kim 10000d84335fSJung-uk Kim } 1001