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 * 12*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, 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 char *FileExt = Filename + Length - 4; 2085f9b24faSJung-uk Kim UINT64 i; 2090d84335fSJung-uk Kim 2100d84335fSJung-uk Kim 2110d84335fSJung-uk Kim if ((Length > 4) && AcpiUtStricmp (FileExt, ".dsl")) 2120d84335fSJung-uk Kim { 2135f9b24faSJung-uk Kim return (FALSE); 2140d84335fSJung-uk Kim } 2150d84335fSJung-uk Kim 2160d84335fSJung-uk Kim for(i = 0; i<Length; ++i) 2170d84335fSJung-uk Kim { 218af051161SJung-uk Kim if (!isprint ((int) Filename[i])) 2190d84335fSJung-uk Kim { 2205f9b24faSJung-uk Kim return (FALSE); 2210d84335fSJung-uk Kim } 2220d84335fSJung-uk Kim } 2235f9b24faSJung-uk Kim 2245f9b24faSJung-uk Kim return (TRUE); 2250d84335fSJung-uk Kim } 2260d84335fSJung-uk Kim 2270d84335fSJung-uk Kim 2280d84335fSJung-uk Kim /******************************************************************************* 2290d84335fSJung-uk Kim * 2300d84335fSJung-uk Kim * FUNCTION: CvInitFileTree 2310d84335fSJung-uk Kim * 2320d84335fSJung-uk Kim * PARAMETERS: Table - input table 233ec0234b4SJung-uk Kim * RootFile - Output file that defines the DefinitionBlock 2340d84335fSJung-uk Kim * 2355f9b24faSJung-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, 245ec0234b4SJung-uk Kim FILE *RootFile) 2460d84335fSJung-uk Kim { 2470d84335fSJung-uk Kim UINT8 *TreeAml; 2480d84335fSJung-uk Kim UINT8 *FileEnd; 2490d84335fSJung-uk Kim char *Filename = NULL; 2500d84335fSJung-uk Kim char *PreviousFilename = NULL; 2510d84335fSJung-uk Kim char *ParentFilename = NULL; 2520d84335fSJung-uk Kim char *ChildFilename = NULL; 253ec0234b4SJung-uk Kim UINT8 *AmlStart; 254ec0234b4SJung-uk Kim UINT32 AmlLength; 2550d84335fSJung-uk Kim 2560d84335fSJung-uk Kim 257f1db5ef7SJung-uk Kim if (!AcpiGbl_CaptureComments) 2580d84335fSJung-uk Kim { 2590d84335fSJung-uk Kim return; 2600d84335fSJung-uk Kim } 2610d84335fSJung-uk Kim 262ec0234b4SJung-uk Kim 263ec0234b4SJung-uk Kim AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); 264ec0234b4SJung-uk Kim AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)); 265ec0234b4SJung-uk Kim 2660d84335fSJung-uk Kim CvDbgPrint ("AmlLength: %x\n", AmlLength); 2670d84335fSJung-uk Kim CvDbgPrint ("AmlStart: %p\n", AmlStart); 268ec0234b4SJung-uk Kim CvDbgPrint ("AmlEnd: %p\n", AmlStart+AmlLength); 2690d84335fSJung-uk Kim 2700d84335fSJung-uk Kim AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 2715f9b24faSJung-uk Kim 2720d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart); 2730d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length); 2740d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Next = NULL; 2750d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Parent = NULL; 2760d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2); 2770d84335fSJung-uk Kim 2780d84335fSJung-uk Kim /* Set the root file to the current open file */ 2790d84335fSJung-uk Kim 280ec0234b4SJung-uk Kim AcpiGbl_FileTreeRoot->File = RootFile; 2810d84335fSJung-uk Kim 2820d84335fSJung-uk Kim /* 283cd6518c7SJung-uk Kim * Set this to true because we don't need to output 2840d84335fSJung-uk Kim * an include statement for the topmost file 2850d84335fSJung-uk Kim */ 2860d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->IncludeWritten = TRUE; 2870d84335fSJung-uk Kim Filename = NULL; 2880d84335fSJung-uk Kim AcpiGbl_CurrentFilename = (char *)(AmlStart+2); 2890d84335fSJung-uk Kim AcpiGbl_RootFilename = (char *)(AmlStart+2); 2900d84335fSJung-uk Kim 2910d84335fSJung-uk Kim TreeAml = AmlStart; 2920d84335fSJung-uk Kim FileEnd = AmlStart + AmlLength; 2930d84335fSJung-uk Kim 2940d84335fSJung-uk Kim while (TreeAml <= FileEnd) 2950d84335fSJung-uk Kim { 2960d84335fSJung-uk Kim /* 2970d84335fSJung-uk Kim * Make sure that this filename contains all printable characters 2980d84335fSJung-uk Kim * and a .dsl extension at the end. If not, then it must be some 2990d84335fSJung-uk Kim * raw data that doesn't outline a filename. 3000d84335fSJung-uk Kim */ 3010d84335fSJung-uk Kim if ((*TreeAml == AML_COMMENT_OP) && 3020d84335fSJung-uk Kim (*(TreeAml +1) == FILENAME_COMMENT) && 3030d84335fSJung-uk Kim (CvIsFilename ((char *)(TreeAml +2)))) 3040d84335fSJung-uk Kim { 3050d84335fSJung-uk Kim CvDbgPrint ("A9 and a 08 file\n"); 3060d84335fSJung-uk Kim PreviousFilename = Filename; 3070d84335fSJung-uk Kim Filename = (char *) (TreeAml +2); 3085f9b24faSJung-uk Kim 3090d84335fSJung-uk Kim CvAddToFileTree (Filename, PreviousFilename); 3100d84335fSJung-uk Kim ChildFilename = Filename; 3110d84335fSJung-uk Kim CvDbgPrint ("%s\n", Filename); 3120d84335fSJung-uk Kim } 3130d84335fSJung-uk Kim else if ((*TreeAml == AML_COMMENT_OP) && 3140d84335fSJung-uk Kim (*(TreeAml +1) == PARENTFILENAME_COMMENT) && 3150d84335fSJung-uk Kim (CvIsFilename ((char *)(TreeAml +2)))) 3160d84335fSJung-uk Kim { 3170d84335fSJung-uk Kim CvDbgPrint ("A9 and a 09 file\n"); 3180d84335fSJung-uk Kim ParentFilename = (char *)(TreeAml +2); 3190d84335fSJung-uk Kim CvSetFileParent (ChildFilename, ParentFilename); 3200d84335fSJung-uk Kim CvDbgPrint ("%s\n", ParentFilename); 3210d84335fSJung-uk Kim } 3225f9b24faSJung-uk Kim 3230d84335fSJung-uk Kim ++TreeAml; 3240d84335fSJung-uk Kim } 3250d84335fSJung-uk Kim } 3260d84335fSJung-uk Kim 3270d84335fSJung-uk Kim 3280d84335fSJung-uk Kim /******************************************************************************* 3290d84335fSJung-uk Kim * 3300d84335fSJung-uk Kim * FUNCTION: CvClearOpComments 3310d84335fSJung-uk Kim * 3320d84335fSJung-uk Kim * PARAMETERS: Op -- clear all comments within this Op 3330d84335fSJung-uk Kim * 3345f9b24faSJung-uk Kim * RETURN: None 3350d84335fSJung-uk Kim * 3360d84335fSJung-uk Kim * DESCRIPTION: Clear all converter-related fields of the given Op. 3370d84335fSJung-uk Kim * This is referred as ASL_CV_CLEAR_OP_COMMENTS. 3380d84335fSJung-uk Kim * 3390d84335fSJung-uk Kim ******************************************************************************/ 3400d84335fSJung-uk Kim 3410d84335fSJung-uk Kim void 3420d84335fSJung-uk Kim CvClearOpComments ( 3430d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 3440d84335fSJung-uk Kim { 3455f9b24faSJung-uk Kim 3460d84335fSJung-uk Kim Op->Common.InlineComment = NULL; 3470d84335fSJung-uk Kim Op->Common.EndNodeComment = NULL; 3480d84335fSJung-uk Kim Op->Common.NameComment = NULL; 3490d84335fSJung-uk Kim Op->Common.CommentList = NULL; 3500d84335fSJung-uk Kim Op->Common.EndBlkComment = NULL; 3510d84335fSJung-uk Kim Op->Common.CloseBraceComment = NULL; 3520d84335fSJung-uk Kim Op->Common.CvFilename = NULL; 3530d84335fSJung-uk Kim Op->Common.CvParentFilename = NULL; 3540d84335fSJung-uk Kim } 3550d84335fSJung-uk Kim 3560d84335fSJung-uk Kim 3570d84335fSJung-uk Kim /******************************************************************************* 3580d84335fSJung-uk Kim * 3590d84335fSJung-uk Kim * FUNCTION: CvCommentExists 3600d84335fSJung-uk Kim * 3615f9b24faSJung-uk Kim * PARAMETERS: Address - check if this address appears in the list 3620d84335fSJung-uk Kim * 3630d84335fSJung-uk Kim * RETURN: BOOLEAN - TRUE if the address exists. 3640d84335fSJung-uk Kim * 3655f9b24faSJung-uk Kim * DESCRIPTION: Look at the pointer address and check if this appears in the 3665f9b24faSJung-uk Kim * list of all addresses. If it exists in the list, return TRUE 3670d84335fSJung-uk Kim * if it exists. Otherwise add to the list and return FALSE. 3680d84335fSJung-uk Kim * 3690d84335fSJung-uk Kim ******************************************************************************/ 3700d84335fSJung-uk Kim 3710d84335fSJung-uk Kim static BOOLEAN 3720d84335fSJung-uk Kim CvCommentExists ( 3730d84335fSJung-uk Kim UINT8 *Address) 3740d84335fSJung-uk Kim { 3750d84335fSJung-uk Kim ACPI_COMMENT_ADDR_NODE *Current = AcpiGbl_CommentAddrListHead; 3760d84335fSJung-uk Kim UINT8 Option; 3770d84335fSJung-uk Kim 3780d84335fSJung-uk Kim 3790d84335fSJung-uk Kim if (!Address) 3800d84335fSJung-uk Kim { 3810d84335fSJung-uk Kim return (FALSE); 3820d84335fSJung-uk Kim } 3835f9b24faSJung-uk Kim 3840d84335fSJung-uk Kim Option = *(Address + 1); 3850d84335fSJung-uk Kim 3860d84335fSJung-uk Kim /* 3875f9b24faSJung-uk Kim * FILENAME_COMMENT and PARENTFILENAME_COMMENT are not treated as 3885f9b24faSJung-uk Kim * comments. They serve as markers for where the file starts and ends. 3890d84335fSJung-uk Kim */ 3905f9b24faSJung-uk Kim if ((Option == FILENAME_COMMENT) || 3915f9b24faSJung-uk Kim (Option == PARENTFILENAME_COMMENT)) 3920d84335fSJung-uk Kim { 3930d84335fSJung-uk Kim return (FALSE); 3940d84335fSJung-uk Kim } 3950d84335fSJung-uk Kim 3960d84335fSJung-uk Kim if (!Current) 3970d84335fSJung-uk Kim { 3980d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead = 3990d84335fSJung-uk Kim AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 4000d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Addr = Address; 4010d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Next = NULL; 4020d84335fSJung-uk Kim return (FALSE); 4030d84335fSJung-uk Kim } 4040d84335fSJung-uk Kim else 4050d84335fSJung-uk Kim { 4060d84335fSJung-uk Kim while (Current) 4070d84335fSJung-uk Kim { 4080d84335fSJung-uk Kim if (Current->Addr != Address) 4090d84335fSJung-uk Kim { 4100d84335fSJung-uk Kim Current = Current->Next; 4110d84335fSJung-uk Kim } 4120d84335fSJung-uk Kim else 4130d84335fSJung-uk Kim { 4140d84335fSJung-uk Kim return (TRUE); 4150d84335fSJung-uk Kim } 4160d84335fSJung-uk Kim } 4170d84335fSJung-uk Kim 4180d84335fSJung-uk Kim /* 4195f9b24faSJung-uk Kim * If the execution gets to this point, it means that this 4205f9b24faSJung-uk Kim * address does not exists in the list. Add this address to the 4210d84335fSJung-uk Kim * beginning of the list. 4220d84335fSJung-uk Kim */ 4230d84335fSJung-uk Kim Current = AcpiGbl_CommentAddrListHead; 4240d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead = 4250d84335fSJung-uk Kim AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 4265f9b24faSJung-uk Kim 4270d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Addr = Address; 4280d84335fSJung-uk Kim AcpiGbl_CommentAddrListHead->Next = Current; 4290d84335fSJung-uk Kim return (FALSE); 4300d84335fSJung-uk Kim } 4310d84335fSJung-uk Kim } 4320d84335fSJung-uk Kim 4330d84335fSJung-uk Kim 4340d84335fSJung-uk Kim /******************************************************************************* 4350d84335fSJung-uk Kim * 4360d84335fSJung-uk Kim * FUNCTION: CvFilenameExists 4370d84335fSJung-uk Kim * 4380d84335fSJung-uk Kim * PARAMETERS: Filename - filename to search 4390d84335fSJung-uk Kim * 4400d84335fSJung-uk Kim * RETURN: ACPI_FILE_NODE - a pointer to a file node 4410d84335fSJung-uk Kim * 4420d84335fSJung-uk Kim * DESCRIPTION: Look for the given filename in the file dependency tree. 4430d84335fSJung-uk Kim * Returns the file node if it exists, returns NULL if it does not. 4440d84335fSJung-uk Kim * 4450d84335fSJung-uk Kim ******************************************************************************/ 4460d84335fSJung-uk Kim 4470d84335fSJung-uk Kim ACPI_FILE_NODE* 4480d84335fSJung-uk Kim CvFilenameExists( 4490d84335fSJung-uk Kim char *Filename, 4500d84335fSJung-uk Kim ACPI_FILE_NODE *Head) 4510d84335fSJung-uk Kim { 4520d84335fSJung-uk Kim ACPI_FILE_NODE *Current = Head; 4530d84335fSJung-uk Kim 4540d84335fSJung-uk Kim 455af051161SJung-uk Kim if (!Filename) 456af051161SJung-uk Kim { 457af051161SJung-uk Kim return (NULL); 458af051161SJung-uk Kim } 459af051161SJung-uk Kim 4600d84335fSJung-uk Kim while (Current) 4610d84335fSJung-uk Kim { 4620d84335fSJung-uk Kim if (!AcpiUtStricmp (Current->Filename, Filename)) 4630d84335fSJung-uk Kim { 4640d84335fSJung-uk Kim return (Current); 4650d84335fSJung-uk Kim } 4665f9b24faSJung-uk Kim 4670d84335fSJung-uk Kim Current = Current->Next; 4680d84335fSJung-uk Kim } 4690d84335fSJung-uk Kim return (NULL); 4700d84335fSJung-uk Kim } 4710d84335fSJung-uk Kim 4720d84335fSJung-uk Kim 4730d84335fSJung-uk Kim /******************************************************************************* 4740d84335fSJung-uk Kim * 4750d84335fSJung-uk Kim * FUNCTION: CvFileAddressLookup 4760d84335fSJung-uk Kim * 4770d84335fSJung-uk Kim * PARAMETERS: Address - address to look up 4780d84335fSJung-uk Kim * Head - file dependency tree 4790d84335fSJung-uk Kim * 4805f9b24faSJung-uk Kim * RETURN: ACPI_FILE_NODE - pointer to a file node containing the address 4810d84335fSJung-uk Kim * 4820d84335fSJung-uk Kim * DESCRIPTION: Look for the given address in the file dependency tree. 4830d84335fSJung-uk Kim * Returns the first file node where the given address is within 4840d84335fSJung-uk Kim * the file node's starting and ending address. 4850d84335fSJung-uk Kim * 4860d84335fSJung-uk Kim ******************************************************************************/ 4870d84335fSJung-uk Kim 4880d84335fSJung-uk Kim static ACPI_FILE_NODE * 4890d84335fSJung-uk Kim CvFileAddressLookup( 4900d84335fSJung-uk Kim char *Address, 4910d84335fSJung-uk Kim ACPI_FILE_NODE *Head) 4920d84335fSJung-uk Kim { 4930d84335fSJung-uk Kim ACPI_FILE_NODE *Current = Head; 4940d84335fSJung-uk Kim 4950d84335fSJung-uk Kim 4960d84335fSJung-uk Kim while (Current) 4970d84335fSJung-uk Kim { 4980d84335fSJung-uk Kim if ((Address >= Current->FileStart) && 4990d84335fSJung-uk Kim (Address < Current->FileEnd || 5000d84335fSJung-uk Kim !Current->FileEnd)) 5010d84335fSJung-uk Kim { 5020d84335fSJung-uk Kim return (Current); 5030d84335fSJung-uk Kim } 5045f9b24faSJung-uk Kim 5050d84335fSJung-uk Kim Current = Current->Next; 5060d84335fSJung-uk Kim } 5070d84335fSJung-uk Kim 5080d84335fSJung-uk Kim return (NULL); 5090d84335fSJung-uk Kim } 5100d84335fSJung-uk Kim 5110d84335fSJung-uk Kim 5120d84335fSJung-uk Kim /******************************************************************************* 5130d84335fSJung-uk Kim * 5140d84335fSJung-uk Kim * FUNCTION: CvLabelFileNode 5150d84335fSJung-uk Kim * 5160d84335fSJung-uk Kim * PARAMETERS: Op 5170d84335fSJung-uk Kim * 5180d84335fSJung-uk Kim * RETURN: None 5190d84335fSJung-uk Kim * 5200d84335fSJung-uk Kim * DESCRIPTION: Takes a given parse op, looks up its Op->Common.Aml field 521cd6518c7SJung-uk Kim * within the file tree and fills in appropriate file information 5220d84335fSJung-uk Kim * from a matching node within the tree. 5230d84335fSJung-uk Kim * This is referred as ASL_CV_LABEL_FILENODE. 5240d84335fSJung-uk Kim * 5250d84335fSJung-uk Kim ******************************************************************************/ 5260d84335fSJung-uk Kim 5270d84335fSJung-uk Kim void 5280d84335fSJung-uk Kim CvLabelFileNode( 5290d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 5300d84335fSJung-uk Kim { 5310d84335fSJung-uk Kim ACPI_FILE_NODE *Node; 5320d84335fSJung-uk Kim 5330d84335fSJung-uk Kim 5340d84335fSJung-uk Kim if (!Op) 5350d84335fSJung-uk Kim { 5360d84335fSJung-uk Kim return; 5370d84335fSJung-uk Kim } 5380d84335fSJung-uk Kim 5395f9b24faSJung-uk Kim Node = CvFileAddressLookup ((char *) 5405f9b24faSJung-uk Kim Op->Common.Aml, AcpiGbl_FileTreeRoot); 5410d84335fSJung-uk Kim if (!Node) 5420d84335fSJung-uk Kim { 5430d84335fSJung-uk Kim return; 5440d84335fSJung-uk Kim } 5450d84335fSJung-uk Kim 5460d84335fSJung-uk Kim Op->Common.CvFilename = Node->Filename; 5470d84335fSJung-uk Kim if (Node->Parent) 5480d84335fSJung-uk Kim { 5490d84335fSJung-uk Kim Op->Common.CvParentFilename = Node->Parent->Filename; 5500d84335fSJung-uk Kim } 5510d84335fSJung-uk Kim else 5520d84335fSJung-uk Kim { 5530d84335fSJung-uk Kim Op->Common.CvParentFilename = Node->Filename; 5540d84335fSJung-uk Kim } 5550d84335fSJung-uk Kim } 5560d84335fSJung-uk Kim 5570d84335fSJung-uk Kim 5580d84335fSJung-uk Kim /******************************************************************************* 5590d84335fSJung-uk Kim * 5600d84335fSJung-uk Kim * FUNCTION: CvAddToFileTree 5610d84335fSJung-uk Kim * 5620d84335fSJung-uk Kim * PARAMETERS: Filename - Address containing the name of the current 5630d84335fSJung-uk Kim * filename 5640d84335fSJung-uk Kim * PreviousFilename - Address containing the name of the previous 5650d84335fSJung-uk Kim * filename 5660d84335fSJung-uk Kim * 5675f9b24faSJung-uk Kim * RETURN: None 5680d84335fSJung-uk Kim * 5690d84335fSJung-uk Kim * DESCRIPTION: Add this filename to the AcpiGbl_FileTree if it does not exist. 5700d84335fSJung-uk Kim * 5710d84335fSJung-uk Kim ******************************************************************************/ 5720d84335fSJung-uk Kim 5730d84335fSJung-uk Kim static void 5740d84335fSJung-uk Kim CvAddToFileTree ( 5750d84335fSJung-uk Kim char *Filename, 5760d84335fSJung-uk Kim char *PreviousFilename) 5770d84335fSJung-uk Kim { 5780d84335fSJung-uk Kim ACPI_FILE_NODE *Node; 5790d84335fSJung-uk Kim 5800d84335fSJung-uk Kim 5810d84335fSJung-uk Kim if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 5820d84335fSJung-uk Kim PreviousFilename) 5830d84335fSJung-uk Kim { 5840d84335fSJung-uk Kim Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 5850d84335fSJung-uk Kim if (Node) 5860d84335fSJung-uk Kim { 5870d84335fSJung-uk Kim /* 5880d84335fSJung-uk Kim * Set the end point of the PreviousFilename to the address 5890d84335fSJung-uk Kim * of Filename. 5900d84335fSJung-uk Kim */ 5910d84335fSJung-uk Kim Node->FileEnd = Filename; 5920d84335fSJung-uk Kim } 5930d84335fSJung-uk Kim } 5940d84335fSJung-uk Kim else if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 5950d84335fSJung-uk Kim !PreviousFilename) 5960d84335fSJung-uk Kim { 5970d84335fSJung-uk Kim return; 5980d84335fSJung-uk Kim } 5990d84335fSJung-uk Kim 6000d84335fSJung-uk Kim Node = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot); 6010d84335fSJung-uk Kim if (Node && PreviousFilename) 6020d84335fSJung-uk Kim { 6030d84335fSJung-uk Kim /* 6045f9b24faSJung-uk Kim * Update the end of the previous file and all of their parents' 6055f9b24faSJung-uk Kim * ending addresses. This is done to ensure that parent file 6065f9b24faSJung-uk Kim * ranges extend to the end of their childrens' files. 6070d84335fSJung-uk Kim */ 6080d84335fSJung-uk Kim Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 6090d84335fSJung-uk Kim if (Node && (Node->FileEnd < Filename)) 6100d84335fSJung-uk Kim { 6110d84335fSJung-uk Kim Node->FileEnd = Filename; 6120d84335fSJung-uk Kim Node = Node->Parent; 6130d84335fSJung-uk Kim while (Node) 6140d84335fSJung-uk Kim { 6150d84335fSJung-uk Kim if (Node->FileEnd < Filename) 6160d84335fSJung-uk Kim { 6170d84335fSJung-uk Kim Node->FileEnd = Filename; 6180d84335fSJung-uk Kim } 6195f9b24faSJung-uk Kim 6200d84335fSJung-uk Kim Node = Node->Parent; 6210d84335fSJung-uk Kim } 6220d84335fSJung-uk Kim } 6230d84335fSJung-uk Kim } 6240d84335fSJung-uk Kim else 6250d84335fSJung-uk Kim { 6260d84335fSJung-uk Kim Node = AcpiGbl_FileTreeRoot; 6270d84335fSJung-uk Kim AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 6285f9b24faSJung-uk Kim 6290d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Next = Node; 6300d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Parent = NULL; 6310d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->Filename = Filename; 6320d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->FileStart = Filename; 6330d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->IncludeWritten = FALSE; 6340d84335fSJung-uk Kim AcpiGbl_FileTreeRoot->File = fopen(Filename, "w+"); 6350d84335fSJung-uk Kim 6360d84335fSJung-uk Kim /* 6370d84335fSJung-uk Kim * If we can't open the file, we need to abort here before we 6380d84335fSJung-uk Kim * accidentally write to a NULL file. 6390d84335fSJung-uk Kim */ 6400d84335fSJung-uk Kim if (!AcpiGbl_FileTreeRoot->File) 6410d84335fSJung-uk Kim { 6420d84335fSJung-uk Kim /* delete the .xxx file */ 6430d84335fSJung-uk Kim 6440d84335fSJung-uk Kim FlDeleteFile (ASL_FILE_AML_OUTPUT); 6456f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "\"%s\" - %s", Filename, strerror (errno)); 6465f9b24faSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, 6476f1f1a63SJung-uk Kim NULL, AslGbl_MsgBuffer); 6480d84335fSJung-uk Kim AslAbort (); 6490d84335fSJung-uk Kim } 6500d84335fSJung-uk Kim } 6510d84335fSJung-uk Kim } 6520d84335fSJung-uk Kim 6530d84335fSJung-uk Kim 6540d84335fSJung-uk Kim /******************************************************************************* 6550d84335fSJung-uk Kim * 6560d84335fSJung-uk Kim * FUNCTION: CvSetFileParent 6570d84335fSJung-uk Kim * 6580d84335fSJung-uk Kim * PARAMETERS: ChildFile - contains the filename of the child file 6590d84335fSJung-uk Kim * ParentFile - contains the filename of the parent file. 6600d84335fSJung-uk Kim * 6615f9b24faSJung-uk Kim * RETURN: None 6620d84335fSJung-uk Kim * 6635f9b24faSJung-uk Kim * DESCRIPTION: Point the parent pointer of the Child to the node that 6640d84335fSJung-uk Kim * corresponds with the parent file node. 6650d84335fSJung-uk Kim * 6660d84335fSJung-uk Kim ******************************************************************************/ 6670d84335fSJung-uk Kim 6680d84335fSJung-uk Kim static void 6690d84335fSJung-uk Kim CvSetFileParent ( 6700d84335fSJung-uk Kim char *ChildFile, 6710d84335fSJung-uk Kim char *ParentFile) 6720d84335fSJung-uk Kim { 6730d84335fSJung-uk Kim ACPI_FILE_NODE *Child; 6740d84335fSJung-uk Kim ACPI_FILE_NODE *Parent; 6750d84335fSJung-uk Kim 6760d84335fSJung-uk Kim 6770d84335fSJung-uk Kim Child = CvFilenameExists (ChildFile, AcpiGbl_FileTreeRoot); 6780d84335fSJung-uk Kim Parent = CvFilenameExists (ParentFile, AcpiGbl_FileTreeRoot); 6795f9b24faSJung-uk Kim 6800d84335fSJung-uk Kim if (Child && Parent) 6810d84335fSJung-uk Kim { 6820d84335fSJung-uk Kim Child->Parent = Parent; 6830d84335fSJung-uk Kim 6840d84335fSJung-uk Kim while (Child->Parent) 6850d84335fSJung-uk Kim { 6860d84335fSJung-uk Kim if (Child->Parent->FileEnd < Child->FileStart) 6870d84335fSJung-uk Kim { 6880d84335fSJung-uk Kim Child->Parent->FileEnd = Child->FileStart; 6890d84335fSJung-uk Kim } 6905f9b24faSJung-uk Kim 6910d84335fSJung-uk Kim Child = Child->Parent; 6920d84335fSJung-uk Kim } 6930d84335fSJung-uk Kim } 6940d84335fSJung-uk Kim } 6950d84335fSJung-uk Kim 6960d84335fSJung-uk Kim 6970d84335fSJung-uk Kim /******************************************************************************* 6980d84335fSJung-uk Kim * 6990d84335fSJung-uk Kim * FUNCTION: CvCaptureCommentsOnly 7000d84335fSJung-uk Kim * 7010d84335fSJung-uk Kim * PARAMETERS: ParserState - A parser state object 7020d84335fSJung-uk Kim * 7035f9b24faSJung-uk Kim * RETURN: None 7040d84335fSJung-uk Kim * 7055f9b24faSJung-uk Kim * DESCRIPTION: Look at the aml that the parser state is pointing to, 7060d84335fSJung-uk Kim * capture any AML_COMMENT_OP and it's arguments and increment the 7070d84335fSJung-uk Kim * aml pointer past the comment. Comments are transferred to parse 7080d84335fSJung-uk Kim * nodes through CvTransferComments() as well as 7090d84335fSJung-uk Kim * AcpiPsBuildNamedOp(). 7100d84335fSJung-uk Kim * This is referred as ASL_CV_CAPTURE_COMMENTS_ONLY. 7110d84335fSJung-uk Kim * 7120d84335fSJung-uk Kim ******************************************************************************/ 7130d84335fSJung-uk Kim 7140d84335fSJung-uk Kim void 7150d84335fSJung-uk Kim CvCaptureCommentsOnly ( 7160d84335fSJung-uk Kim ACPI_PARSE_STATE *ParserState) 7170d84335fSJung-uk Kim { 7180d84335fSJung-uk Kim UINT8 *Aml = ParserState->Aml; 7190d84335fSJung-uk Kim UINT16 Opcode = (UINT16) ACPI_GET8 (Aml); 7200d84335fSJung-uk Kim UINT32 Length = 0; 72167d9aa44SJung-uk Kim UINT8 CommentOption; 7220d84335fSJung-uk Kim BOOLEAN StdDefBlockFlag = FALSE; 7230d84335fSJung-uk Kim ACPI_COMMENT_NODE *CommentNode; 7240d84335fSJung-uk Kim ACPI_FILE_NODE *FileNode; 7250d84335fSJung-uk Kim 7260d84335fSJung-uk Kim 727f1db5ef7SJung-uk Kim if (!AcpiGbl_CaptureComments || 7280d84335fSJung-uk Kim Opcode != AML_COMMENT_OP) 7290d84335fSJung-uk Kim { 7300d84335fSJung-uk Kim return; 7310d84335fSJung-uk Kim } 7320d84335fSJung-uk Kim 7330d84335fSJung-uk Kim while (Opcode == AML_COMMENT_OP) 7340d84335fSJung-uk Kim { 7350d84335fSJung-uk Kim CvDbgPrint ("comment aml address: %p\n", Aml); 7360d84335fSJung-uk Kim 7370d84335fSJung-uk Kim if (CvCommentExists(ParserState->Aml)) 7380d84335fSJung-uk Kim { 7390d84335fSJung-uk Kim CvDbgPrint ("Avoiding capturing an existing comment.\n"); 7400d84335fSJung-uk Kim } 7410d84335fSJung-uk Kim else 7420d84335fSJung-uk Kim { 7430d84335fSJung-uk Kim CommentOption = *(Aml +1); 7440d84335fSJung-uk Kim 7455f9b24faSJung-uk Kim /* 7465f9b24faSJung-uk Kim * Increment past the comment option and point the 7475f9b24faSJung-uk Kim * appropriate char pointers 7485f9b24faSJung-uk Kim */ 7490d84335fSJung-uk Kim Aml += 2; 7500d84335fSJung-uk Kim 7515f9b24faSJung-uk Kim /* Found a comment. Now, set pointers to these comments. */ 7520d84335fSJung-uk Kim 7530d84335fSJung-uk Kim switch (CommentOption) 7540d84335fSJung-uk Kim { 7550d84335fSJung-uk Kim case STD_DEFBLK_COMMENT: 7560d84335fSJung-uk Kim 7570d84335fSJung-uk Kim StdDefBlockFlag = TRUE; 7580d84335fSJung-uk Kim 7595f9b24faSJung-uk Kim /* 7605f9b24faSJung-uk Kim * Add to a linked list of nodes. This list will be 7615f9b24faSJung-uk Kim * taken by the parse node created next. 7625f9b24faSJung-uk Kim */ 7635f9b24faSJung-uk Kim CommentNode = AcpiOsAcquireObject ( 7645f9b24faSJung-uk Kim AcpiGbl_RegCommentCache); 7650d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 7660d84335fSJung-uk Kim CommentNode->Next = NULL; 7670d84335fSJung-uk Kim 7680d84335fSJung-uk Kim if (!AcpiGbl_DefBlkCommentListHead) 7690d84335fSJung-uk Kim { 7700d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListHead = CommentNode; 7710d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail = CommentNode; 7720d84335fSJung-uk Kim } 7730d84335fSJung-uk Kim else 7740d84335fSJung-uk Kim { 7750d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail->Next = CommentNode; 7765f9b24faSJung-uk Kim AcpiGbl_DefBlkCommentListTail = 7775f9b24faSJung-uk Kim AcpiGbl_DefBlkCommentListTail->Next; 7780d84335fSJung-uk Kim } 7790d84335fSJung-uk Kim break; 7800d84335fSJung-uk Kim 7810d84335fSJung-uk Kim case STANDARD_COMMENT: 7820d84335fSJung-uk Kim 7830d84335fSJung-uk Kim CvDbgPrint ("found regular comment.\n"); 7840d84335fSJung-uk Kim 7855f9b24faSJung-uk Kim /* 7865f9b24faSJung-uk Kim * Add to a linked list of nodes. This list will be 7875f9b24faSJung-uk Kim * taken by the parse node created next. 7885f9b24faSJung-uk Kim */ 7895f9b24faSJung-uk Kim CommentNode = AcpiOsAcquireObject ( 7905f9b24faSJung-uk Kim AcpiGbl_RegCommentCache); 7910d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 7920d84335fSJung-uk Kim CommentNode->Next = NULL; 7930d84335fSJung-uk Kim 7940d84335fSJung-uk Kim if (!AcpiGbl_RegCommentListHead) 7950d84335fSJung-uk Kim { 7960d84335fSJung-uk Kim AcpiGbl_RegCommentListHead = CommentNode; 7970d84335fSJung-uk Kim AcpiGbl_RegCommentListTail = CommentNode; 7980d84335fSJung-uk Kim } 7990d84335fSJung-uk Kim else 8000d84335fSJung-uk Kim { 8010d84335fSJung-uk Kim AcpiGbl_RegCommentListTail->Next = CommentNode; 8025f9b24faSJung-uk Kim AcpiGbl_RegCommentListTail = 8035f9b24faSJung-uk Kim AcpiGbl_RegCommentListTail->Next; 8040d84335fSJung-uk Kim } 8050d84335fSJung-uk Kim break; 8060d84335fSJung-uk Kim 8070d84335fSJung-uk Kim case ENDBLK_COMMENT: 8080d84335fSJung-uk Kim 8090d84335fSJung-uk Kim CvDbgPrint ("found endblk comment.\n"); 8100d84335fSJung-uk Kim 8115f9b24faSJung-uk Kim /* Add to a linked list of nodes. This will be 8125f9b24faSJung-uk Kim * taken by the next created parse node. 8135f9b24faSJung-uk Kim */ 8145f9b24faSJung-uk Kim CommentNode = AcpiOsAcquireObject ( 8155f9b24faSJung-uk Kim AcpiGbl_RegCommentCache); 8160d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 8170d84335fSJung-uk Kim CommentNode->Next = NULL; 8180d84335fSJung-uk Kim 8190d84335fSJung-uk Kim if (!AcpiGbl_EndBlkCommentListHead) 8200d84335fSJung-uk Kim { 8210d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListHead = CommentNode; 8220d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail = CommentNode; 8230d84335fSJung-uk Kim } 8240d84335fSJung-uk Kim else 8250d84335fSJung-uk Kim { 8260d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail->Next = CommentNode; 8275f9b24faSJung-uk Kim AcpiGbl_EndBlkCommentListTail = 8285f9b24faSJung-uk Kim AcpiGbl_EndBlkCommentListTail->Next; 8290d84335fSJung-uk Kim } 8300d84335fSJung-uk Kim break; 8310d84335fSJung-uk Kim 8320d84335fSJung-uk Kim case INLINE_COMMENT: 8330d84335fSJung-uk Kim 8340d84335fSJung-uk Kim CvDbgPrint ("found inline comment.\n"); 8355f9b24faSJung-uk Kim AcpiGbl_CurrentInlineComment = 8365f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml); 8370d84335fSJung-uk Kim break; 8380d84335fSJung-uk Kim 8390d84335fSJung-uk Kim case ENDNODE_COMMENT: 8400d84335fSJung-uk Kim 8410d84335fSJung-uk Kim CvDbgPrint ("found EndNode comment.\n"); 8425f9b24faSJung-uk Kim AcpiGbl_CurrentEndNodeComment = 8435f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml); 8440d84335fSJung-uk Kim break; 8450d84335fSJung-uk Kim 8460d84335fSJung-uk Kim case CLOSE_BRACE_COMMENT: 8470d84335fSJung-uk Kim 8480d84335fSJung-uk Kim CvDbgPrint ("found close brace comment.\n"); 8495f9b24faSJung-uk Kim AcpiGbl_CurrentCloseBraceComment = 8505f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml); 8510d84335fSJung-uk Kim break; 8520d84335fSJung-uk Kim 8530d84335fSJung-uk Kim case END_DEFBLK_COMMENT: 8540d84335fSJung-uk Kim 8555f9b24faSJung-uk Kim CvDbgPrint ("Found comment that belongs after" 8565f9b24faSJung-uk Kim " the } for a definition block.\n"); 8575f9b24faSJung-uk Kim AcpiGbl_CurrentScope->Common.CloseBraceComment = 8585f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml); 8590d84335fSJung-uk Kim break; 8600d84335fSJung-uk Kim 8610d84335fSJung-uk Kim case FILENAME_COMMENT: 8620d84335fSJung-uk Kim 8635f9b24faSJung-uk Kim CvDbgPrint ("Found a filename: %s\n", 8645f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml)); 8655f9b24faSJung-uk Kim FileNode = CvFilenameExists ( 8665f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Aml), AcpiGbl_FileTreeRoot); 8670d84335fSJung-uk Kim 8680d84335fSJung-uk Kim /* 8690d84335fSJung-uk Kim * If there is an INCLUDE_COMMENT followed by a 8700d84335fSJung-uk Kim * FILENAME_COMMENT, then the INCLUDE_COMMENT is a comment 8710d84335fSJung-uk Kim * that is emitted before the #include for the file. 8720d84335fSJung-uk Kim * We will save the IncludeComment within the FileNode 8730d84335fSJung-uk Kim * associated with this FILENAME_COMMENT. 8740d84335fSJung-uk Kim */ 8750d84335fSJung-uk Kim if (FileNode && AcpiGbl_IncCommentListHead) 8760d84335fSJung-uk Kim { 8770d84335fSJung-uk Kim FileNode->IncludeComment = AcpiGbl_IncCommentListHead; 8780d84335fSJung-uk Kim AcpiGbl_IncCommentListHead = NULL; 8790d84335fSJung-uk Kim AcpiGbl_IncCommentListTail = NULL; 8800d84335fSJung-uk Kim } 8810d84335fSJung-uk Kim break; 8820d84335fSJung-uk Kim 8830d84335fSJung-uk Kim case PARENTFILENAME_COMMENT: 8840d84335fSJung-uk Kim CvDbgPrint (" Found a parent filename.\n"); 8850d84335fSJung-uk Kim break; 8860d84335fSJung-uk Kim 8870d84335fSJung-uk Kim case INCLUDE_COMMENT: 8880d84335fSJung-uk Kim 8890d84335fSJung-uk Kim /* 8900d84335fSJung-uk Kim * Add to a linked list. This list will be taken by the 8910d84335fSJung-uk Kim * parse node created next. See the FILENAME_COMMENT case 8920d84335fSJung-uk Kim * for more details 8930d84335fSJung-uk Kim */ 8945f9b24faSJung-uk Kim CommentNode = AcpiOsAcquireObject ( 8955f9b24faSJung-uk Kim AcpiGbl_RegCommentCache); 8960d84335fSJung-uk Kim CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 8970d84335fSJung-uk Kim CommentNode->Next = NULL; 8980d84335fSJung-uk Kim 8990d84335fSJung-uk Kim if (!AcpiGbl_IncCommentListHead) 9000d84335fSJung-uk Kim { 9010d84335fSJung-uk Kim AcpiGbl_IncCommentListHead = CommentNode; 9020d84335fSJung-uk Kim AcpiGbl_IncCommentListTail = CommentNode; 9030d84335fSJung-uk Kim } 9040d84335fSJung-uk Kim else 9050d84335fSJung-uk Kim { 9060d84335fSJung-uk Kim AcpiGbl_IncCommentListTail->Next = CommentNode; 9075f9b24faSJung-uk Kim AcpiGbl_IncCommentListTail = 9085f9b24faSJung-uk Kim AcpiGbl_IncCommentListTail->Next; 9090d84335fSJung-uk Kim } 9100d84335fSJung-uk Kim 9115f9b24faSJung-uk Kim CvDbgPrint ("Found a include comment: %s\n", 9125f9b24faSJung-uk Kim CommentNode->Comment); 9130d84335fSJung-uk Kim break; 9140d84335fSJung-uk Kim 9150d84335fSJung-uk Kim default: 9160d84335fSJung-uk Kim 9170d84335fSJung-uk Kim /* Not a valid comment option. Revert the AML */ 9180d84335fSJung-uk Kim 9190d84335fSJung-uk Kim goto DefBlock; 9200d84335fSJung-uk Kim 9215f9b24faSJung-uk Kim } /* End switch statement */ 9220d84335fSJung-uk Kim 9235f9b24faSJung-uk Kim } /* End else */ 9240d84335fSJung-uk Kim 9255f9b24faSJung-uk Kim /* Determine the length and move forward that amount */ 9260d84335fSJung-uk Kim 9270d84335fSJung-uk Kim Length = 0; 9280d84335fSJung-uk Kim while (ParserState->Aml[Length]) 9290d84335fSJung-uk Kim { 9300d84335fSJung-uk Kim Length++; 9310d84335fSJung-uk Kim } 9320d84335fSJung-uk Kim 9330d84335fSJung-uk Kim ParserState->Aml += Length + 1; 9340d84335fSJung-uk Kim 9350d84335fSJung-uk Kim /* Peek at the next Opcode. */ 9360d84335fSJung-uk Kim 9370d84335fSJung-uk Kim Aml = ParserState->Aml; 9380d84335fSJung-uk Kim Opcode = (UINT16) ACPI_GET8 (Aml); 9390d84335fSJung-uk Kim } 9400d84335fSJung-uk Kim 9410d84335fSJung-uk Kim DefBlock: 9420d84335fSJung-uk Kim if (StdDefBlockFlag) 9430d84335fSJung-uk Kim { 9440d84335fSJung-uk Kim /* 9450d84335fSJung-uk Kim * Give all of its comments to the current scope, which is known as 9460d84335fSJung-uk Kim * the definition block, since STD_DEFBLK_COMMENT only appears after 9470d84335fSJung-uk Kim * definition block headers. 9480d84335fSJung-uk Kim */ 9490d84335fSJung-uk Kim AcpiGbl_CurrentScope->Common.CommentList 9500d84335fSJung-uk Kim = AcpiGbl_DefBlkCommentListHead; 9510d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListHead = NULL; 9520d84335fSJung-uk Kim AcpiGbl_DefBlkCommentListTail = NULL; 9530d84335fSJung-uk Kim } 9540d84335fSJung-uk Kim } 9550d84335fSJung-uk Kim 9560d84335fSJung-uk Kim 9570d84335fSJung-uk Kim /******************************************************************************* 9580d84335fSJung-uk Kim * 9590d84335fSJung-uk Kim * FUNCTION: CvCaptureComments 9600d84335fSJung-uk Kim * 9610d84335fSJung-uk Kim * PARAMETERS: ParserState - A parser state object 9620d84335fSJung-uk Kim * 9635f9b24faSJung-uk Kim * RETURN: None 9640d84335fSJung-uk Kim * 9650d84335fSJung-uk Kim * DESCRIPTION: Wrapper function for CvCaptureCommentsOnly 9660d84335fSJung-uk Kim * This is referred as ASL_CV_CAPTURE_COMMENTS. 9670d84335fSJung-uk Kim * 9680d84335fSJung-uk Kim ******************************************************************************/ 9690d84335fSJung-uk Kim 9700d84335fSJung-uk Kim void 9710d84335fSJung-uk Kim CvCaptureComments ( 9720d84335fSJung-uk Kim ACPI_WALK_STATE *WalkState) 9730d84335fSJung-uk Kim { 9740d84335fSJung-uk Kim UINT8 *Aml; 9750d84335fSJung-uk Kim UINT16 Opcode; 9760d84335fSJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9770d84335fSJung-uk Kim 9780d84335fSJung-uk Kim 979f1db5ef7SJung-uk Kim if (!AcpiGbl_CaptureComments) 9800d84335fSJung-uk Kim { 9810d84335fSJung-uk Kim return; 9820d84335fSJung-uk Kim } 9830d84335fSJung-uk Kim 9840d84335fSJung-uk Kim /* 9855f9b24faSJung-uk Kim * Before parsing, check to see that comments that come directly 9865f9b24faSJung-uk Kim * after deferred opcodes aren't being processed. 9870d84335fSJung-uk Kim */ 9880d84335fSJung-uk Kim Aml = WalkState->ParserState.Aml; 9890d84335fSJung-uk Kim Opcode = (UINT16) ACPI_GET8 (Aml); 9900d84335fSJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Opcode); 9910d84335fSJung-uk Kim 9920d84335fSJung-uk Kim if (!(OpInfo->Flags & AML_DEFER) || 9930d84335fSJung-uk Kim ((OpInfo->Flags & AML_DEFER) && 9940d84335fSJung-uk Kim (WalkState->PassNumber != ACPI_IMODE_LOAD_PASS1))) 9950d84335fSJung-uk Kim { 9960d84335fSJung-uk Kim CvCaptureCommentsOnly (&WalkState->ParserState); 9970d84335fSJung-uk Kim WalkState->Aml = WalkState->ParserState.Aml; 9980d84335fSJung-uk Kim } 9990d84335fSJung-uk Kim 10000d84335fSJung-uk Kim } 10010d84335fSJung-uk Kim 10020d84335fSJung-uk Kim 10030d84335fSJung-uk Kim /******************************************************************************* 10040d84335fSJung-uk Kim * 10050d84335fSJung-uk Kim * FUNCTION: CvTransferComments 10060d84335fSJung-uk Kim * 10070d84335fSJung-uk Kim * PARAMETERS: Op - Transfer comments to this Op 10080d84335fSJung-uk Kim * 10095f9b24faSJung-uk Kim * RETURN: None 10100d84335fSJung-uk Kim * 1011cd6518c7SJung-uk Kim * DESCRIPTION: Transfer all of the comments stored in global containers to the 10120d84335fSJung-uk Kim * given Op. This will be invoked shortly after the parser creates 10130d84335fSJung-uk Kim * a ParseOp. 10140d84335fSJung-uk Kim * This is referred as ASL_CV_TRANSFER_COMMENTS. 10150d84335fSJung-uk Kim * 10160d84335fSJung-uk Kim ******************************************************************************/ 10170d84335fSJung-uk Kim 10180d84335fSJung-uk Kim void 10190d84335fSJung-uk Kim CvTransferComments ( 10200d84335fSJung-uk Kim ACPI_PARSE_OBJECT *Op) 10210d84335fSJung-uk Kim { 10225f9b24faSJung-uk Kim 10230d84335fSJung-uk Kim Op->Common.InlineComment = AcpiGbl_CurrentInlineComment; 10240d84335fSJung-uk Kim AcpiGbl_CurrentInlineComment = NULL; 10250d84335fSJung-uk Kim 10260d84335fSJung-uk Kim Op->Common.EndNodeComment = AcpiGbl_CurrentEndNodeComment; 10270d84335fSJung-uk Kim AcpiGbl_CurrentEndNodeComment = NULL; 10280d84335fSJung-uk Kim 10290d84335fSJung-uk Kim Op->Common.CloseBraceComment = AcpiGbl_CurrentCloseBraceComment; 10300d84335fSJung-uk Kim AcpiGbl_CurrentCloseBraceComment = NULL; 10310d84335fSJung-uk Kim 10320d84335fSJung-uk Kim Op->Common.CommentList = AcpiGbl_RegCommentListHead; 10330d84335fSJung-uk Kim AcpiGbl_RegCommentListHead = NULL; 10340d84335fSJung-uk Kim AcpiGbl_RegCommentListTail = NULL; 10350d84335fSJung-uk Kim 10360d84335fSJung-uk Kim Op->Common.EndBlkComment = AcpiGbl_EndBlkCommentListHead; 10370d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListHead = NULL; 10380d84335fSJung-uk Kim AcpiGbl_EndBlkCommentListTail = NULL; 10390d84335fSJung-uk Kim } 1040