1d638c6eeSSascha Wildner /****************************************************************************** 2d638c6eeSSascha Wildner * 3d638c6eeSSascha Wildner * Module Name: cvparser - Converter functions that are called from the AML 4d638c6eeSSascha Wildner * parser. 5d638c6eeSSascha Wildner * 6d638c6eeSSascha Wildner *****************************************************************************/ 7d638c6eeSSascha Wildner 8b4315fc7SSascha Wildner /****************************************************************************** 9b4315fc7SSascha Wildner * 10b4315fc7SSascha Wildner * 1. Copyright Notice 11b4315fc7SSascha Wildner * 12b4315fc7SSascha Wildner * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 13d638c6eeSSascha Wildner * All rights reserved. 14d638c6eeSSascha Wildner * 15b4315fc7SSascha Wildner * 2. License 16b4315fc7SSascha Wildner * 17b4315fc7SSascha Wildner * 2.1. This is your license from Intel Corp. under its intellectual property 18b4315fc7SSascha Wildner * rights. You may have additional license terms from the party that provided 19b4315fc7SSascha Wildner * you this software, covering your right to use that party's intellectual 20b4315fc7SSascha Wildner * property rights. 21b4315fc7SSascha Wildner * 22b4315fc7SSascha Wildner * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23b4315fc7SSascha Wildner * copy of the source code appearing in this file ("Covered Code") an 24b4315fc7SSascha Wildner * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25b4315fc7SSascha Wildner * base code distributed originally by Intel ("Original Intel Code") to copy, 26b4315fc7SSascha Wildner * make derivatives, distribute, use and display any portion of the Covered 27b4315fc7SSascha Wildner * Code in any form, with the right to sublicense such rights; and 28b4315fc7SSascha Wildner * 29b4315fc7SSascha Wildner * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30b4315fc7SSascha Wildner * license (with the right to sublicense), under only those claims of Intel 31b4315fc7SSascha Wildner * patents that are infringed by the Original Intel Code, to make, use, sell, 32b4315fc7SSascha Wildner * offer to sell, and import the Covered Code and derivative works thereof 33b4315fc7SSascha Wildner * solely to the minimum extent necessary to exercise the above copyright 34b4315fc7SSascha Wildner * license, and in no event shall the patent license extend to any additions 35b4315fc7SSascha Wildner * to or modifications of the Original Intel Code. No other license or right 36b4315fc7SSascha Wildner * is granted directly or by implication, estoppel or otherwise; 37b4315fc7SSascha Wildner * 38b4315fc7SSascha Wildner * The above copyright and patent license is granted only if the following 39b4315fc7SSascha Wildner * conditions are met: 40b4315fc7SSascha Wildner * 41b4315fc7SSascha Wildner * 3. Conditions 42b4315fc7SSascha Wildner * 43b4315fc7SSascha Wildner * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered 45b4315fc7SSascha Wildner * Code or modification with rights to further distribute source must include 46b4315fc7SSascha Wildner * the above Copyright Notice, the above License, this list of Conditions, 47b4315fc7SSascha Wildner * and the following Disclaimer and Export Compliance provision. In addition, 48b4315fc7SSascha Wildner * Licensee must cause all Covered Code to which Licensee contributes to 49b4315fc7SSascha Wildner * contain a file documenting the changes Licensee made to create that Covered 50b4315fc7SSascha Wildner * Code and the date of any change. Licensee must include in that file the 51b4315fc7SSascha Wildner * documentation of any changes made by any predecessor Licensee. Licensee 52b4315fc7SSascha Wildner * must include a prominent statement that the modification is derived, 53b4315fc7SSascha Wildner * directly or indirectly, from Original Intel Code. 54b4315fc7SSascha Wildner * 55b4315fc7SSascha Wildner * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered 57b4315fc7SSascha Wildner * Code or modification without rights to further distribute source must 58b4315fc7SSascha Wildner * include the following Disclaimer and Export Compliance provision in the 59b4315fc7SSascha Wildner * documentation and/or other materials provided with distribution. In 60b4315fc7SSascha Wildner * addition, Licensee may not authorize further sublicense of source of any 61b4315fc7SSascha Wildner * portion of the Covered Code, and must include terms to the effect that the 62b4315fc7SSascha Wildner * license from Licensee to its licensee is limited to the intellectual 63b4315fc7SSascha Wildner * property embodied in the software Licensee provides to its licensee, and 64b4315fc7SSascha Wildner * not to intellectual property embodied in modifications its licensee may 65b4315fc7SSascha Wildner * make. 66b4315fc7SSascha Wildner * 67b4315fc7SSascha Wildner * 3.3. Redistribution of Executable. Redistribution in executable form of any 68b4315fc7SSascha Wildner * substantial portion of the Covered Code or modification must reproduce the 69b4315fc7SSascha Wildner * above Copyright Notice, and the following Disclaimer and Export Compliance 70b4315fc7SSascha Wildner * provision in the documentation and/or other materials provided with the 71b4315fc7SSascha Wildner * distribution. 72b4315fc7SSascha Wildner * 73b4315fc7SSascha Wildner * 3.4. Intel retains all right, title, and interest in and to the Original 74b4315fc7SSascha Wildner * Intel Code. 75b4315fc7SSascha Wildner * 76b4315fc7SSascha Wildner * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77b4315fc7SSascha Wildner * Intel shall be used in advertising or otherwise to promote the sale, use or 78b4315fc7SSascha Wildner * other dealings in products derived from or relating to the Covered Code 79b4315fc7SSascha Wildner * without prior written authorization from Intel. 80b4315fc7SSascha Wildner * 81b4315fc7SSascha Wildner * 4. Disclaimer and Export Compliance 82b4315fc7SSascha Wildner * 83b4315fc7SSascha Wildner * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84b4315fc7SSascha Wildner * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85b4315fc7SSascha Wildner * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86b4315fc7SSascha Wildner * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87b4315fc7SSascha Wildner * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88b4315fc7SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89b4315fc7SSascha Wildner * PARTICULAR PURPOSE. 90b4315fc7SSascha Wildner * 91b4315fc7SSascha Wildner * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92b4315fc7SSascha Wildner * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93b4315fc7SSascha Wildner * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94b4315fc7SSascha Wildner * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95b4315fc7SSascha Wildner * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96b4315fc7SSascha Wildner * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97b4315fc7SSascha Wildner * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98b4315fc7SSascha Wildner * LIMITED REMEDY. 99b4315fc7SSascha Wildner * 100b4315fc7SSascha Wildner * 4.3. Licensee shall not export, either directly or indirectly, any of this 101b4315fc7SSascha Wildner * software or system incorporating such software without first obtaining any 102b4315fc7SSascha Wildner * required license or other approval from the U. S. Department of Commerce or 103b4315fc7SSascha Wildner * any other agency or department of the United States Government. In the 104b4315fc7SSascha Wildner * event Licensee exports any such software from the United States or 105b4315fc7SSascha Wildner * re-exports any such software from a foreign destination, Licensee shall 106b4315fc7SSascha Wildner * ensure that the distribution and export/re-export of the software is in 107b4315fc7SSascha Wildner * compliance with all laws, regulations, orders, or other restrictions of the 108b4315fc7SSascha Wildner * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109b4315fc7SSascha Wildner * any of its subsidiaries will export/re-export any technical data, process, 110b4315fc7SSascha Wildner * software, or service, directly or indirectly, to any country for which the 111b4315fc7SSascha Wildner * United States government or any agency thereof requires an export license, 112b4315fc7SSascha Wildner * other governmental approval, or letter of assurance, without first obtaining 113b4315fc7SSascha Wildner * such license, approval or letter. 114b4315fc7SSascha Wildner * 115b4315fc7SSascha Wildner ***************************************************************************** 116b4315fc7SSascha Wildner * 117b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the 118b4315fc7SSascha Wildner * following license: 119b4315fc7SSascha Wildner * 120d638c6eeSSascha Wildner * Redistribution and use in source and binary forms, with or without 121d638c6eeSSascha Wildner * modification, are permitted provided that the following conditions 122d638c6eeSSascha Wildner * are met: 123d638c6eeSSascha Wildner * 1. Redistributions of source code must retain the above copyright 124d638c6eeSSascha Wildner * notice, this list of conditions, and the following disclaimer, 125d638c6eeSSascha Wildner * without modification. 126d638c6eeSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer 127d638c6eeSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below 128d638c6eeSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon 129d638c6eeSSascha Wildner * including a substantially similar Disclaimer requirement for further 130d638c6eeSSascha Wildner * binary redistribution. 131d638c6eeSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names 132d638c6eeSSascha Wildner * of any contributors may be used to endorse or promote products derived 133d638c6eeSSascha Wildner * from this software without specific prior written permission. 134d638c6eeSSascha Wildner * 135b4315fc7SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 136b4315fc7SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 137b4315fc7SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 138b4315fc7SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 139b4315fc7SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 140b4315fc7SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 141b4315fc7SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 142b4315fc7SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 143b4315fc7SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 144b4315fc7SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 145b4315fc7SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 146b4315fc7SSascha Wildner * 147b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the 148d638c6eeSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free 149d638c6eeSSascha Wildner * Software Foundation. 150d638c6eeSSascha Wildner * 151b4315fc7SSascha Wildner *****************************************************************************/ 152d638c6eeSSascha Wildner 153d638c6eeSSascha Wildner #include "aslcompiler.h" 154d638c6eeSSascha Wildner #include "acparser.h" 155d638c6eeSSascha Wildner #include "acdispat.h" 156d638c6eeSSascha Wildner #include "amlcode.h" 157d638c6eeSSascha Wildner #include "acinterp.h" 158d638c6eeSSascha Wildner #include "acdisasm.h" 159d638c6eeSSascha Wildner #include "acconvert.h" 160d638c6eeSSascha Wildner 161d638c6eeSSascha Wildner 162d638c6eeSSascha Wildner /* local prototypes */ 163d638c6eeSSascha Wildner 164d638c6eeSSascha Wildner static BOOLEAN 165d638c6eeSSascha Wildner CvCommentExists ( 166d638c6eeSSascha Wildner UINT8 *Address); 167d638c6eeSSascha Wildner 168d638c6eeSSascha Wildner static BOOLEAN 169d638c6eeSSascha Wildner CvIsFilename ( 170d638c6eeSSascha Wildner char *Filename); 171d638c6eeSSascha Wildner 172d638c6eeSSascha Wildner static ACPI_FILE_NODE* 173d638c6eeSSascha Wildner CvFileAddressLookup( 174d638c6eeSSascha Wildner char *Address, 175d638c6eeSSascha Wildner ACPI_FILE_NODE *Head); 176d638c6eeSSascha Wildner 177d638c6eeSSascha Wildner static void 178d638c6eeSSascha Wildner CvAddToFileTree ( 179d638c6eeSSascha Wildner char *Filename, 180d638c6eeSSascha Wildner char *PreviousFilename); 181d638c6eeSSascha Wildner 182d638c6eeSSascha Wildner static void 183d638c6eeSSascha Wildner CvSetFileParent ( 184d638c6eeSSascha Wildner char *ChildFile, 185d638c6eeSSascha Wildner char *ParentFile); 186d638c6eeSSascha Wildner 187d638c6eeSSascha Wildner 188d638c6eeSSascha Wildner /******************************************************************************* 189d638c6eeSSascha Wildner * 190d638c6eeSSascha Wildner * FUNCTION: CvIsFilename 191d638c6eeSSascha Wildner * 192d638c6eeSSascha Wildner * PARAMETERS: filename - input filename 193d638c6eeSSascha Wildner * 194d638c6eeSSascha Wildner * RETURN: BOOLEAN - TRUE if all characters are between 0x20 and 0x7f 195d638c6eeSSascha Wildner * 196d638c6eeSSascha Wildner * DESCRIPTION: Take a given char * and see if it contains all printable 197d638c6eeSSascha Wildner * characters. If all characters have hexvalues 20-7f and ends with 198d638c6eeSSascha Wildner * .dsl, we will assume that it is a proper filename. 199d638c6eeSSascha Wildner * 200d638c6eeSSascha Wildner ******************************************************************************/ 201d638c6eeSSascha Wildner 202d638c6eeSSascha Wildner static BOOLEAN 203d638c6eeSSascha Wildner CvIsFilename ( 204d638c6eeSSascha Wildner char *Filename) 205d638c6eeSSascha Wildner { 206d638c6eeSSascha Wildner UINT64 Length = strlen(Filename); 207d638c6eeSSascha Wildner char *FileExt = Filename + Length - 4; 208*1093ca81SSascha Wildner UINT64 i; 209d638c6eeSSascha Wildner 210d638c6eeSSascha Wildner 211d638c6eeSSascha Wildner if ((Length > 4) && AcpiUtStricmp (FileExt, ".dsl")) 212d638c6eeSSascha Wildner { 213*1093ca81SSascha Wildner return (FALSE); 214d638c6eeSSascha Wildner } 215d638c6eeSSascha Wildner 216d638c6eeSSascha Wildner for(i = 0; i<Length; ++i) 217d638c6eeSSascha Wildner { 218*1093ca81SSascha Wildner if (!isprint ((int) Filename[i])) 219d638c6eeSSascha Wildner { 220*1093ca81SSascha Wildner return (FALSE); 221d638c6eeSSascha Wildner } 222d638c6eeSSascha Wildner } 223*1093ca81SSascha Wildner 224*1093ca81SSascha Wildner return (TRUE); 225d638c6eeSSascha Wildner } 226d638c6eeSSascha Wildner 227d638c6eeSSascha Wildner 228d638c6eeSSascha Wildner /******************************************************************************* 229d638c6eeSSascha Wildner * 230d638c6eeSSascha Wildner * FUNCTION: CvInitFileTree 231d638c6eeSSascha Wildner * 232d638c6eeSSascha Wildner * PARAMETERS: Table - input table 233d638c6eeSSascha Wildner * AmlStart - Address of the starting point of the AML. 234d638c6eeSSascha Wildner * AmlLength - Length of the AML file. 235d638c6eeSSascha Wildner * 236*1093ca81SSascha Wildner * RETURN: None 237d638c6eeSSascha Wildner * 238d638c6eeSSascha Wildner * DESCRIPTION: Initialize the file dependency tree by scanning the AML. 239d638c6eeSSascha Wildner * This is referred as ASL_CV_INIT_FILETREE. 240d638c6eeSSascha Wildner * 241d638c6eeSSascha Wildner ******************************************************************************/ 242d638c6eeSSascha Wildner 243d638c6eeSSascha Wildner void 244d638c6eeSSascha Wildner CvInitFileTree ( 245d638c6eeSSascha Wildner ACPI_TABLE_HEADER *Table, 246d638c6eeSSascha Wildner UINT8 *AmlStart, 247d638c6eeSSascha Wildner UINT32 AmlLength) 248d638c6eeSSascha Wildner { 249d638c6eeSSascha Wildner UINT8 *TreeAml; 250d638c6eeSSascha Wildner UINT8 *FileEnd; 251d638c6eeSSascha Wildner char *Filename = NULL; 252d638c6eeSSascha Wildner char *PreviousFilename = NULL; 253d638c6eeSSascha Wildner char *ParentFilename = NULL; 254d638c6eeSSascha Wildner char *ChildFilename = NULL; 255d638c6eeSSascha Wildner 256d638c6eeSSascha Wildner 257d638c6eeSSascha Wildner if (!Gbl_CaptureComments) 258d638c6eeSSascha Wildner { 259d638c6eeSSascha Wildner return; 260d638c6eeSSascha Wildner } 261d638c6eeSSascha Wildner 262d638c6eeSSascha Wildner CvDbgPrint ("AmlLength: %x\n", AmlLength); 263d638c6eeSSascha Wildner CvDbgPrint ("AmlStart: %p\n", AmlStart); 264d638c6eeSSascha Wildner CvDbgPrint ("AmlEnd?: %p\n", AmlStart+AmlLength); 265d638c6eeSSascha Wildner 266d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 267*1093ca81SSascha Wildner 268d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart); 269d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length); 270d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Next = NULL; 271d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Parent = NULL; 272d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2); 273d638c6eeSSascha Wildner 274d638c6eeSSascha Wildner /* Set the root file to the current open file */ 275d638c6eeSSascha Wildner 276d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile; 277d638c6eeSSascha Wildner 278d638c6eeSSascha Wildner /* 279d638c6eeSSascha Wildner * Set this to true because we dont need to output 280d638c6eeSSascha Wildner * an include statement for the topmost file 281d638c6eeSSascha Wildner */ 282d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->IncludeWritten = TRUE; 283d638c6eeSSascha Wildner Filename = NULL; 284d638c6eeSSascha Wildner AcpiGbl_CurrentFilename = (char *)(AmlStart+2); 285d638c6eeSSascha Wildner AcpiGbl_RootFilename = (char *)(AmlStart+2); 286d638c6eeSSascha Wildner 287d638c6eeSSascha Wildner TreeAml = AmlStart; 288d638c6eeSSascha Wildner FileEnd = AmlStart + AmlLength; 289d638c6eeSSascha Wildner 290d638c6eeSSascha Wildner while (TreeAml <= FileEnd) 291d638c6eeSSascha Wildner { 292d638c6eeSSascha Wildner /* 293d638c6eeSSascha Wildner * Make sure that this filename contains all printable characters 294d638c6eeSSascha Wildner * and a .dsl extension at the end. If not, then it must be some 295d638c6eeSSascha Wildner * raw data that doesn't outline a filename. 296d638c6eeSSascha Wildner */ 297d638c6eeSSascha Wildner if ((*TreeAml == AML_COMMENT_OP) && 298d638c6eeSSascha Wildner (*(TreeAml +1) == FILENAME_COMMENT) && 299d638c6eeSSascha Wildner (CvIsFilename ((char *)(TreeAml +2)))) 300d638c6eeSSascha Wildner { 301d638c6eeSSascha Wildner CvDbgPrint ("A9 and a 08 file\n"); 302d638c6eeSSascha Wildner PreviousFilename = Filename; 303d638c6eeSSascha Wildner Filename = (char *) (TreeAml +2); 304*1093ca81SSascha Wildner 305d638c6eeSSascha Wildner CvAddToFileTree (Filename, PreviousFilename); 306d638c6eeSSascha Wildner ChildFilename = Filename; 307d638c6eeSSascha Wildner CvDbgPrint ("%s\n", Filename); 308d638c6eeSSascha Wildner } 309d638c6eeSSascha Wildner else if ((*TreeAml == AML_COMMENT_OP) && 310d638c6eeSSascha Wildner (*(TreeAml +1) == PARENTFILENAME_COMMENT) && 311d638c6eeSSascha Wildner (CvIsFilename ((char *)(TreeAml +2)))) 312d638c6eeSSascha Wildner { 313d638c6eeSSascha Wildner CvDbgPrint ("A9 and a 09 file\n"); 314d638c6eeSSascha Wildner ParentFilename = (char *)(TreeAml +2); 315d638c6eeSSascha Wildner CvSetFileParent (ChildFilename, ParentFilename); 316d638c6eeSSascha Wildner CvDbgPrint ("%s\n", ParentFilename); 317d638c6eeSSascha Wildner } 318*1093ca81SSascha Wildner 319d638c6eeSSascha Wildner ++TreeAml; 320d638c6eeSSascha Wildner } 321d638c6eeSSascha Wildner } 322d638c6eeSSascha Wildner 323d638c6eeSSascha Wildner 324d638c6eeSSascha Wildner /******************************************************************************* 325d638c6eeSSascha Wildner * 326d638c6eeSSascha Wildner * FUNCTION: CvClearOpComments 327d638c6eeSSascha Wildner * 328d638c6eeSSascha Wildner * PARAMETERS: Op -- clear all comments within this Op 329d638c6eeSSascha Wildner * 330*1093ca81SSascha Wildner * RETURN: None 331d638c6eeSSascha Wildner * 332d638c6eeSSascha Wildner * DESCRIPTION: Clear all converter-related fields of the given Op. 333d638c6eeSSascha Wildner * This is referred as ASL_CV_CLEAR_OP_COMMENTS. 334d638c6eeSSascha Wildner * 335d638c6eeSSascha Wildner ******************************************************************************/ 336d638c6eeSSascha Wildner 337d638c6eeSSascha Wildner void 338d638c6eeSSascha Wildner CvClearOpComments ( 339d638c6eeSSascha Wildner ACPI_PARSE_OBJECT *Op) 340d638c6eeSSascha Wildner { 341*1093ca81SSascha Wildner 342d638c6eeSSascha Wildner Op->Common.InlineComment = NULL; 343d638c6eeSSascha Wildner Op->Common.EndNodeComment = NULL; 344d638c6eeSSascha Wildner Op->Common.NameComment = NULL; 345d638c6eeSSascha Wildner Op->Common.CommentList = NULL; 346d638c6eeSSascha Wildner Op->Common.EndBlkComment = NULL; 347d638c6eeSSascha Wildner Op->Common.CloseBraceComment = NULL; 348d638c6eeSSascha Wildner Op->Common.CvFilename = NULL; 349d638c6eeSSascha Wildner Op->Common.CvParentFilename = NULL; 350d638c6eeSSascha Wildner } 351d638c6eeSSascha Wildner 352d638c6eeSSascha Wildner 353d638c6eeSSascha Wildner /******************************************************************************* 354d638c6eeSSascha Wildner * 355d638c6eeSSascha Wildner * FUNCTION: CvCommentExists 356d638c6eeSSascha Wildner * 357*1093ca81SSascha Wildner * PARAMETERS: Address - check if this address appears in the list 358d638c6eeSSascha Wildner * 359d638c6eeSSascha Wildner * RETURN: BOOLEAN - TRUE if the address exists. 360d638c6eeSSascha Wildner * 361*1093ca81SSascha Wildner * DESCRIPTION: Look at the pointer address and check if this appears in the 362*1093ca81SSascha Wildner * list of all addresses. If it exists in the list, return TRUE 363d638c6eeSSascha Wildner * if it exists. Otherwise add to the list and return FALSE. 364d638c6eeSSascha Wildner * 365d638c6eeSSascha Wildner ******************************************************************************/ 366d638c6eeSSascha Wildner 367d638c6eeSSascha Wildner static BOOLEAN 368d638c6eeSSascha Wildner CvCommentExists ( 369d638c6eeSSascha Wildner UINT8 *Address) 370d638c6eeSSascha Wildner { 371d638c6eeSSascha Wildner ACPI_COMMENT_ADDR_NODE *Current = AcpiGbl_CommentAddrListHead; 372d638c6eeSSascha Wildner UINT8 Option; 373d638c6eeSSascha Wildner 374d638c6eeSSascha Wildner 375d638c6eeSSascha Wildner if (!Address) 376d638c6eeSSascha Wildner { 377d638c6eeSSascha Wildner return (FALSE); 378d638c6eeSSascha Wildner } 379*1093ca81SSascha Wildner 380d638c6eeSSascha Wildner Option = *(Address + 1); 381d638c6eeSSascha Wildner 382d638c6eeSSascha Wildner /* 383*1093ca81SSascha Wildner * FILENAME_COMMENT and PARENTFILENAME_COMMENT are not treated as 384*1093ca81SSascha Wildner * comments. They serve as markers for where the file starts and ends. 385d638c6eeSSascha Wildner */ 386*1093ca81SSascha Wildner if ((Option == FILENAME_COMMENT) || 387*1093ca81SSascha Wildner (Option == PARENTFILENAME_COMMENT)) 388d638c6eeSSascha Wildner { 389d638c6eeSSascha Wildner return (FALSE); 390d638c6eeSSascha Wildner } 391d638c6eeSSascha Wildner 392d638c6eeSSascha Wildner if (!Current) 393d638c6eeSSascha Wildner { 394d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead = 395d638c6eeSSascha Wildner AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 396d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead->Addr = Address; 397d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead->Next = NULL; 398d638c6eeSSascha Wildner return (FALSE); 399d638c6eeSSascha Wildner } 400d638c6eeSSascha Wildner else 401d638c6eeSSascha Wildner { 402d638c6eeSSascha Wildner while (Current) 403d638c6eeSSascha Wildner { 404d638c6eeSSascha Wildner if (Current->Addr != Address) 405d638c6eeSSascha Wildner { 406d638c6eeSSascha Wildner Current = Current->Next; 407d638c6eeSSascha Wildner } 408d638c6eeSSascha Wildner else 409d638c6eeSSascha Wildner { 410d638c6eeSSascha Wildner return (TRUE); 411d638c6eeSSascha Wildner } 412d638c6eeSSascha Wildner } 413d638c6eeSSascha Wildner 414d638c6eeSSascha Wildner /* 415*1093ca81SSascha Wildner * If the execution gets to this point, it means that this 416*1093ca81SSascha Wildner * address does not exists in the list. Add this address to the 417d638c6eeSSascha Wildner * beginning of the list. 418d638c6eeSSascha Wildner */ 419d638c6eeSSascha Wildner Current = AcpiGbl_CommentAddrListHead; 420d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead = 421d638c6eeSSascha Wildner AcpiOsAcquireObject (AcpiGbl_RegCommentCache); 422*1093ca81SSascha Wildner 423d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead->Addr = Address; 424d638c6eeSSascha Wildner AcpiGbl_CommentAddrListHead->Next = Current; 425d638c6eeSSascha Wildner return (FALSE); 426d638c6eeSSascha Wildner } 427d638c6eeSSascha Wildner } 428d638c6eeSSascha Wildner 429d638c6eeSSascha Wildner 430d638c6eeSSascha Wildner /******************************************************************************* 431d638c6eeSSascha Wildner * 432d638c6eeSSascha Wildner * FUNCTION: CvFilenameExists 433d638c6eeSSascha Wildner * 434d638c6eeSSascha Wildner * PARAMETERS: Filename - filename to search 435d638c6eeSSascha Wildner * 436d638c6eeSSascha Wildner * RETURN: ACPI_FILE_NODE - a pointer to a file node 437d638c6eeSSascha Wildner * 438d638c6eeSSascha Wildner * DESCRIPTION: Look for the given filename in the file dependency tree. 439d638c6eeSSascha Wildner * Returns the file node if it exists, returns NULL if it does not. 440d638c6eeSSascha Wildner * 441d638c6eeSSascha Wildner ******************************************************************************/ 442d638c6eeSSascha Wildner 443d638c6eeSSascha Wildner ACPI_FILE_NODE* 444d638c6eeSSascha Wildner CvFilenameExists( 445d638c6eeSSascha Wildner char *Filename, 446d638c6eeSSascha Wildner ACPI_FILE_NODE *Head) 447d638c6eeSSascha Wildner { 448d638c6eeSSascha Wildner ACPI_FILE_NODE *Current = Head; 449d638c6eeSSascha Wildner 450d638c6eeSSascha Wildner 451*1093ca81SSascha Wildner if (!Filename) 452*1093ca81SSascha Wildner { 453*1093ca81SSascha Wildner return (NULL); 454*1093ca81SSascha Wildner } 455*1093ca81SSascha Wildner 456d638c6eeSSascha Wildner while (Current) 457d638c6eeSSascha Wildner { 458d638c6eeSSascha Wildner if (!AcpiUtStricmp (Current->Filename, Filename)) 459d638c6eeSSascha Wildner { 460d638c6eeSSascha Wildner return (Current); 461d638c6eeSSascha Wildner } 462*1093ca81SSascha Wildner 463d638c6eeSSascha Wildner Current = Current->Next; 464d638c6eeSSascha Wildner } 465d638c6eeSSascha Wildner return (NULL); 466d638c6eeSSascha Wildner } 467d638c6eeSSascha Wildner 468d638c6eeSSascha Wildner 469d638c6eeSSascha Wildner /******************************************************************************* 470d638c6eeSSascha Wildner * 471d638c6eeSSascha Wildner * FUNCTION: CvFileAddressLookup 472d638c6eeSSascha Wildner * 473d638c6eeSSascha Wildner * PARAMETERS: Address - address to look up 474d638c6eeSSascha Wildner * Head - file dependency tree 475d638c6eeSSascha Wildner * 476*1093ca81SSascha Wildner * RETURN: ACPI_FILE_NODE - pointer to a file node containing the address 477d638c6eeSSascha Wildner * 478d638c6eeSSascha Wildner * DESCRIPTION: Look for the given address in the file dependency tree. 479d638c6eeSSascha Wildner * Returns the first file node where the given address is within 480d638c6eeSSascha Wildner * the file node's starting and ending address. 481d638c6eeSSascha Wildner * 482d638c6eeSSascha Wildner ******************************************************************************/ 483d638c6eeSSascha Wildner 484d638c6eeSSascha Wildner static ACPI_FILE_NODE * 485d638c6eeSSascha Wildner CvFileAddressLookup( 486d638c6eeSSascha Wildner char *Address, 487d638c6eeSSascha Wildner ACPI_FILE_NODE *Head) 488d638c6eeSSascha Wildner { 489d638c6eeSSascha Wildner ACPI_FILE_NODE *Current = Head; 490d638c6eeSSascha Wildner 491d638c6eeSSascha Wildner 492d638c6eeSSascha Wildner while (Current) 493d638c6eeSSascha Wildner { 494d638c6eeSSascha Wildner if ((Address >= Current->FileStart) && 495d638c6eeSSascha Wildner (Address < Current->FileEnd || 496d638c6eeSSascha Wildner !Current->FileEnd)) 497d638c6eeSSascha Wildner { 498d638c6eeSSascha Wildner return (Current); 499d638c6eeSSascha Wildner } 500*1093ca81SSascha Wildner 501d638c6eeSSascha Wildner Current = Current->Next; 502d638c6eeSSascha Wildner } 503d638c6eeSSascha Wildner 504d638c6eeSSascha Wildner return (NULL); 505d638c6eeSSascha Wildner } 506d638c6eeSSascha Wildner 507d638c6eeSSascha Wildner 508d638c6eeSSascha Wildner /******************************************************************************* 509d638c6eeSSascha Wildner * 510d638c6eeSSascha Wildner * FUNCTION: CvLabelFileNode 511d638c6eeSSascha Wildner * 512d638c6eeSSascha Wildner * PARAMETERS: Op 513d638c6eeSSascha Wildner * 514d638c6eeSSascha Wildner * RETURN: None 515d638c6eeSSascha Wildner * 516d638c6eeSSascha Wildner * DESCRIPTION: Takes a given parse op, looks up its Op->Common.Aml field 517d638c6eeSSascha Wildner * within the file tree and fills in approperiate file information 518d638c6eeSSascha Wildner * from a matching node within the tree. 519d638c6eeSSascha Wildner * This is referred as ASL_CV_LABEL_FILENODE. 520d638c6eeSSascha Wildner * 521d638c6eeSSascha Wildner ******************************************************************************/ 522d638c6eeSSascha Wildner 523d638c6eeSSascha Wildner void 524d638c6eeSSascha Wildner CvLabelFileNode( 525d638c6eeSSascha Wildner ACPI_PARSE_OBJECT *Op) 526d638c6eeSSascha Wildner { 527d638c6eeSSascha Wildner ACPI_FILE_NODE *Node; 528d638c6eeSSascha Wildner 529d638c6eeSSascha Wildner 530d638c6eeSSascha Wildner if (!Op) 531d638c6eeSSascha Wildner { 532d638c6eeSSascha Wildner return; 533d638c6eeSSascha Wildner } 534d638c6eeSSascha Wildner 535*1093ca81SSascha Wildner Node = CvFileAddressLookup ((char *) 536*1093ca81SSascha Wildner Op->Common.Aml, AcpiGbl_FileTreeRoot); 537d638c6eeSSascha Wildner if (!Node) 538d638c6eeSSascha Wildner { 539d638c6eeSSascha Wildner return; 540d638c6eeSSascha Wildner } 541d638c6eeSSascha Wildner 542d638c6eeSSascha Wildner Op->Common.CvFilename = Node->Filename; 543d638c6eeSSascha Wildner if (Node->Parent) 544d638c6eeSSascha Wildner { 545d638c6eeSSascha Wildner Op->Common.CvParentFilename = Node->Parent->Filename; 546d638c6eeSSascha Wildner } 547d638c6eeSSascha Wildner else 548d638c6eeSSascha Wildner { 549d638c6eeSSascha Wildner Op->Common.CvParentFilename = Node->Filename; 550d638c6eeSSascha Wildner } 551d638c6eeSSascha Wildner } 552d638c6eeSSascha Wildner 553d638c6eeSSascha Wildner 554d638c6eeSSascha Wildner /******************************************************************************* 555d638c6eeSSascha Wildner * 556d638c6eeSSascha Wildner * FUNCTION: CvAddToFileTree 557d638c6eeSSascha Wildner * 558d638c6eeSSascha Wildner * PARAMETERS: Filename - Address containing the name of the current 559d638c6eeSSascha Wildner * filename 560d638c6eeSSascha Wildner * PreviousFilename - Address containing the name of the previous 561d638c6eeSSascha Wildner * filename 562d638c6eeSSascha Wildner * 563*1093ca81SSascha Wildner * RETURN: None 564d638c6eeSSascha Wildner * 565d638c6eeSSascha Wildner * DESCRIPTION: Add this filename to the AcpiGbl_FileTree if it does not exist. 566d638c6eeSSascha Wildner * 567d638c6eeSSascha Wildner ******************************************************************************/ 568d638c6eeSSascha Wildner 569d638c6eeSSascha Wildner static void 570d638c6eeSSascha Wildner CvAddToFileTree ( 571d638c6eeSSascha Wildner char *Filename, 572d638c6eeSSascha Wildner char *PreviousFilename) 573d638c6eeSSascha Wildner { 574d638c6eeSSascha Wildner ACPI_FILE_NODE *Node; 575d638c6eeSSascha Wildner 576d638c6eeSSascha Wildner 577d638c6eeSSascha Wildner if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 578d638c6eeSSascha Wildner PreviousFilename) 579d638c6eeSSascha Wildner { 580d638c6eeSSascha Wildner Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 581d638c6eeSSascha Wildner if (Node) 582d638c6eeSSascha Wildner { 583d638c6eeSSascha Wildner /* 584d638c6eeSSascha Wildner * Set the end point of the PreviousFilename to the address 585d638c6eeSSascha Wildner * of Filename. 586d638c6eeSSascha Wildner */ 587d638c6eeSSascha Wildner Node->FileEnd = Filename; 588d638c6eeSSascha Wildner } 589d638c6eeSSascha Wildner } 590d638c6eeSSascha Wildner else if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) && 591d638c6eeSSascha Wildner !PreviousFilename) 592d638c6eeSSascha Wildner { 593d638c6eeSSascha Wildner return; 594d638c6eeSSascha Wildner } 595d638c6eeSSascha Wildner 596d638c6eeSSascha Wildner Node = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot); 597d638c6eeSSascha Wildner if (Node && PreviousFilename) 598d638c6eeSSascha Wildner { 599d638c6eeSSascha Wildner /* 600*1093ca81SSascha Wildner * Update the end of the previous file and all of their parents' 601*1093ca81SSascha Wildner * ending addresses. This is done to ensure that parent file 602*1093ca81SSascha Wildner * ranges extend to the end of their childrens' files. 603d638c6eeSSascha Wildner */ 604d638c6eeSSascha Wildner Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot); 605d638c6eeSSascha Wildner if (Node && (Node->FileEnd < Filename)) 606d638c6eeSSascha Wildner { 607d638c6eeSSascha Wildner Node->FileEnd = Filename; 608d638c6eeSSascha Wildner Node = Node->Parent; 609d638c6eeSSascha Wildner while (Node) 610d638c6eeSSascha Wildner { 611d638c6eeSSascha Wildner if (Node->FileEnd < Filename) 612d638c6eeSSascha Wildner { 613d638c6eeSSascha Wildner Node->FileEnd = Filename; 614d638c6eeSSascha Wildner } 615*1093ca81SSascha Wildner 616d638c6eeSSascha Wildner Node = Node->Parent; 617d638c6eeSSascha Wildner } 618d638c6eeSSascha Wildner } 619d638c6eeSSascha Wildner } 620d638c6eeSSascha Wildner else 621d638c6eeSSascha Wildner { 622d638c6eeSSascha Wildner Node = AcpiGbl_FileTreeRoot; 623d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); 624*1093ca81SSascha Wildner 625d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Next = Node; 626d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Parent = NULL; 627d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->Filename = Filename; 628d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->FileStart = Filename; 629d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->IncludeWritten = FALSE; 630d638c6eeSSascha Wildner AcpiGbl_FileTreeRoot->File = fopen(Filename, "w+"); 631d638c6eeSSascha Wildner 632d638c6eeSSascha Wildner /* 633d638c6eeSSascha Wildner * If we can't open the file, we need to abort here before we 634d638c6eeSSascha Wildner * accidentally write to a NULL file. 635d638c6eeSSascha Wildner */ 636d638c6eeSSascha Wildner if (!AcpiGbl_FileTreeRoot->File) 637d638c6eeSSascha Wildner { 638d638c6eeSSascha Wildner /* delete the .xxx file */ 639d638c6eeSSascha Wildner 640d638c6eeSSascha Wildner FlDeleteFile (ASL_FILE_AML_OUTPUT); 641d638c6eeSSascha Wildner sprintf (MsgBuffer, "\"%s\" - %s", Filename, strerror (errno)); 642*1093ca81SSascha Wildner AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, 643*1093ca81SSascha Wildner NULL, MsgBuffer); 644d638c6eeSSascha Wildner AslAbort (); 645d638c6eeSSascha Wildner } 646d638c6eeSSascha Wildner } 647d638c6eeSSascha Wildner } 648d638c6eeSSascha Wildner 649d638c6eeSSascha Wildner 650d638c6eeSSascha Wildner /******************************************************************************* 651d638c6eeSSascha Wildner * 652d638c6eeSSascha Wildner * FUNCTION: CvSetFileParent 653d638c6eeSSascha Wildner * 654d638c6eeSSascha Wildner * PARAMETERS: ChildFile - contains the filename of the child file 655d638c6eeSSascha Wildner * ParentFile - contains the filename of the parent file. 656d638c6eeSSascha Wildner * 657*1093ca81SSascha Wildner * RETURN: None 658d638c6eeSSascha Wildner * 659*1093ca81SSascha Wildner * DESCRIPTION: Point the parent pointer of the Child to the node that 660d638c6eeSSascha Wildner * corresponds with the parent file node. 661d638c6eeSSascha Wildner * 662d638c6eeSSascha Wildner ******************************************************************************/ 663d638c6eeSSascha Wildner 664d638c6eeSSascha Wildner static void 665d638c6eeSSascha Wildner CvSetFileParent ( 666d638c6eeSSascha Wildner char *ChildFile, 667d638c6eeSSascha Wildner char *ParentFile) 668d638c6eeSSascha Wildner { 669d638c6eeSSascha Wildner ACPI_FILE_NODE *Child; 670d638c6eeSSascha Wildner ACPI_FILE_NODE *Parent; 671d638c6eeSSascha Wildner 672d638c6eeSSascha Wildner 673d638c6eeSSascha Wildner Child = CvFilenameExists (ChildFile, AcpiGbl_FileTreeRoot); 674d638c6eeSSascha Wildner Parent = CvFilenameExists (ParentFile, AcpiGbl_FileTreeRoot); 675*1093ca81SSascha Wildner 676d638c6eeSSascha Wildner if (Child && Parent) 677d638c6eeSSascha Wildner { 678d638c6eeSSascha Wildner Child->Parent = Parent; 679d638c6eeSSascha Wildner 680d638c6eeSSascha Wildner while (Child->Parent) 681d638c6eeSSascha Wildner { 682d638c6eeSSascha Wildner if (Child->Parent->FileEnd < Child->FileStart) 683d638c6eeSSascha Wildner { 684d638c6eeSSascha Wildner Child->Parent->FileEnd = Child->FileStart; 685d638c6eeSSascha Wildner } 686*1093ca81SSascha Wildner 687d638c6eeSSascha Wildner Child = Child->Parent; 688d638c6eeSSascha Wildner } 689d638c6eeSSascha Wildner } 690d638c6eeSSascha Wildner } 691d638c6eeSSascha Wildner 692d638c6eeSSascha Wildner 693d638c6eeSSascha Wildner /******************************************************************************* 694d638c6eeSSascha Wildner * 695d638c6eeSSascha Wildner * FUNCTION: CvCaptureCommentsOnly 696d638c6eeSSascha Wildner * 697d638c6eeSSascha Wildner * PARAMETERS: ParserState - A parser state object 698d638c6eeSSascha Wildner * 699*1093ca81SSascha Wildner * RETURN: None 700d638c6eeSSascha Wildner * 701*1093ca81SSascha Wildner * DESCRIPTION: Look at the aml that the parser state is pointing to, 702d638c6eeSSascha Wildner * capture any AML_COMMENT_OP and it's arguments and increment the 703d638c6eeSSascha Wildner * aml pointer past the comment. Comments are transferred to parse 704d638c6eeSSascha Wildner * nodes through CvTransferComments() as well as 705d638c6eeSSascha Wildner * AcpiPsBuildNamedOp(). 706d638c6eeSSascha Wildner * This is referred as ASL_CV_CAPTURE_COMMENTS_ONLY. 707d638c6eeSSascha Wildner * 708d638c6eeSSascha Wildner ******************************************************************************/ 709d638c6eeSSascha Wildner 710d638c6eeSSascha Wildner void 711d638c6eeSSascha Wildner CvCaptureCommentsOnly ( 712d638c6eeSSascha Wildner ACPI_PARSE_STATE *ParserState) 713d638c6eeSSascha Wildner { 714d638c6eeSSascha Wildner UINT8 *Aml = ParserState->Aml; 715d638c6eeSSascha Wildner UINT16 Opcode = (UINT16) ACPI_GET8 (Aml); 716d638c6eeSSascha Wildner UINT32 Length = 0; 717d638c6eeSSascha Wildner UINT8 CommentOption = (UINT16) ACPI_GET8 (Aml+1); 718d638c6eeSSascha Wildner BOOLEAN StdDefBlockFlag = FALSE; 719d638c6eeSSascha Wildner ACPI_COMMENT_NODE *CommentNode; 720d638c6eeSSascha Wildner ACPI_FILE_NODE *FileNode; 721d638c6eeSSascha Wildner 722d638c6eeSSascha Wildner 723d638c6eeSSascha Wildner if (!Gbl_CaptureComments || 724d638c6eeSSascha Wildner Opcode != AML_COMMENT_OP) 725d638c6eeSSascha Wildner { 726d638c6eeSSascha Wildner return; 727d638c6eeSSascha Wildner } 728d638c6eeSSascha Wildner 729d638c6eeSSascha Wildner while (Opcode == AML_COMMENT_OP) 730d638c6eeSSascha Wildner { 731d638c6eeSSascha Wildner CvDbgPrint ("comment aml address: %p\n", Aml); 732d638c6eeSSascha Wildner 733d638c6eeSSascha Wildner if (CvCommentExists(ParserState->Aml)) 734d638c6eeSSascha Wildner { 735d638c6eeSSascha Wildner CvDbgPrint ("Avoiding capturing an existing comment.\n"); 736d638c6eeSSascha Wildner } 737d638c6eeSSascha Wildner else 738d638c6eeSSascha Wildner { 739d638c6eeSSascha Wildner CommentOption = *(Aml +1); 740d638c6eeSSascha Wildner 741*1093ca81SSascha Wildner /* 742*1093ca81SSascha Wildner * Increment past the comment option and point the 743*1093ca81SSascha Wildner * appropriate char pointers 744*1093ca81SSascha Wildner */ 745d638c6eeSSascha Wildner Aml += 2; 746d638c6eeSSascha Wildner 747*1093ca81SSascha Wildner /* Found a comment. Now, set pointers to these comments. */ 748d638c6eeSSascha Wildner 749d638c6eeSSascha Wildner switch (CommentOption) 750d638c6eeSSascha Wildner { 751d638c6eeSSascha Wildner case STD_DEFBLK_COMMENT: 752d638c6eeSSascha Wildner 753d638c6eeSSascha Wildner StdDefBlockFlag = TRUE; 754d638c6eeSSascha Wildner 755*1093ca81SSascha Wildner /* 756*1093ca81SSascha Wildner * Add to a linked list of nodes. This list will be 757*1093ca81SSascha Wildner * taken by the parse node created next. 758*1093ca81SSascha Wildner */ 759*1093ca81SSascha Wildner CommentNode = AcpiOsAcquireObject ( 760*1093ca81SSascha Wildner AcpiGbl_RegCommentCache); 761d638c6eeSSascha Wildner CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 762d638c6eeSSascha Wildner CommentNode->Next = NULL; 763d638c6eeSSascha Wildner 764d638c6eeSSascha Wildner if (!AcpiGbl_DefBlkCommentListHead) 765d638c6eeSSascha Wildner { 766d638c6eeSSascha Wildner AcpiGbl_DefBlkCommentListHead = CommentNode; 767d638c6eeSSascha Wildner AcpiGbl_DefBlkCommentListTail = CommentNode; 768d638c6eeSSascha Wildner } 769d638c6eeSSascha Wildner else 770d638c6eeSSascha Wildner { 771d638c6eeSSascha Wildner AcpiGbl_DefBlkCommentListTail->Next = CommentNode; 772*1093ca81SSascha Wildner AcpiGbl_DefBlkCommentListTail = 773*1093ca81SSascha Wildner AcpiGbl_DefBlkCommentListTail->Next; 774d638c6eeSSascha Wildner } 775d638c6eeSSascha Wildner break; 776d638c6eeSSascha Wildner 777d638c6eeSSascha Wildner case STANDARD_COMMENT: 778d638c6eeSSascha Wildner 779d638c6eeSSascha Wildner CvDbgPrint ("found regular comment.\n"); 780d638c6eeSSascha Wildner 781*1093ca81SSascha Wildner /* 782*1093ca81SSascha Wildner * Add to a linked list of nodes. This list will be 783*1093ca81SSascha Wildner * taken by the parse node created next. 784*1093ca81SSascha Wildner */ 785*1093ca81SSascha Wildner CommentNode = AcpiOsAcquireObject ( 786*1093ca81SSascha Wildner AcpiGbl_RegCommentCache); 787d638c6eeSSascha Wildner CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 788d638c6eeSSascha Wildner CommentNode->Next = NULL; 789d638c6eeSSascha Wildner 790d638c6eeSSascha Wildner if (!AcpiGbl_RegCommentListHead) 791d638c6eeSSascha Wildner { 792d638c6eeSSascha Wildner AcpiGbl_RegCommentListHead = CommentNode; 793d638c6eeSSascha Wildner AcpiGbl_RegCommentListTail = CommentNode; 794d638c6eeSSascha Wildner } 795d638c6eeSSascha Wildner else 796d638c6eeSSascha Wildner { 797d638c6eeSSascha Wildner AcpiGbl_RegCommentListTail->Next = CommentNode; 798*1093ca81SSascha Wildner AcpiGbl_RegCommentListTail = 799*1093ca81SSascha Wildner AcpiGbl_RegCommentListTail->Next; 800d638c6eeSSascha Wildner } 801d638c6eeSSascha Wildner break; 802d638c6eeSSascha Wildner 803d638c6eeSSascha Wildner case ENDBLK_COMMENT: 804d638c6eeSSascha Wildner 805d638c6eeSSascha Wildner CvDbgPrint ("found endblk comment.\n"); 806d638c6eeSSascha Wildner 807*1093ca81SSascha Wildner /* Add to a linked list of nodes. This will be 808*1093ca81SSascha Wildner * taken by the next created parse node. 809*1093ca81SSascha Wildner */ 810*1093ca81SSascha Wildner CommentNode = AcpiOsAcquireObject ( 811*1093ca81SSascha Wildner AcpiGbl_RegCommentCache); 812d638c6eeSSascha Wildner CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 813d638c6eeSSascha Wildner CommentNode->Next = NULL; 814d638c6eeSSascha Wildner 815d638c6eeSSascha Wildner if (!AcpiGbl_EndBlkCommentListHead) 816d638c6eeSSascha Wildner { 817d638c6eeSSascha Wildner AcpiGbl_EndBlkCommentListHead = CommentNode; 818d638c6eeSSascha Wildner AcpiGbl_EndBlkCommentListTail = CommentNode; 819d638c6eeSSascha Wildner } 820d638c6eeSSascha Wildner else 821d638c6eeSSascha Wildner { 822d638c6eeSSascha Wildner AcpiGbl_EndBlkCommentListTail->Next = CommentNode; 823*1093ca81SSascha Wildner AcpiGbl_EndBlkCommentListTail = 824*1093ca81SSascha Wildner AcpiGbl_EndBlkCommentListTail->Next; 825d638c6eeSSascha Wildner } 826d638c6eeSSascha Wildner break; 827d638c6eeSSascha Wildner 828d638c6eeSSascha Wildner case INLINE_COMMENT: 829d638c6eeSSascha Wildner 830d638c6eeSSascha Wildner CvDbgPrint ("found inline comment.\n"); 831*1093ca81SSascha Wildner AcpiGbl_CurrentInlineComment = 832*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml); 833d638c6eeSSascha Wildner break; 834d638c6eeSSascha Wildner 835d638c6eeSSascha Wildner case ENDNODE_COMMENT: 836d638c6eeSSascha Wildner 837d638c6eeSSascha Wildner CvDbgPrint ("found EndNode comment.\n"); 838*1093ca81SSascha Wildner AcpiGbl_CurrentEndNodeComment = 839*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml); 840d638c6eeSSascha Wildner break; 841d638c6eeSSascha Wildner 842d638c6eeSSascha Wildner case CLOSE_BRACE_COMMENT: 843d638c6eeSSascha Wildner 844d638c6eeSSascha Wildner CvDbgPrint ("found close brace comment.\n"); 845*1093ca81SSascha Wildner AcpiGbl_CurrentCloseBraceComment = 846*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml); 847d638c6eeSSascha Wildner break; 848d638c6eeSSascha Wildner 849d638c6eeSSascha Wildner case END_DEFBLK_COMMENT: 850d638c6eeSSascha Wildner 851*1093ca81SSascha Wildner CvDbgPrint ("Found comment that belongs after" 852*1093ca81SSascha Wildner " the } for a definition block.\n"); 853*1093ca81SSascha Wildner AcpiGbl_CurrentScope->Common.CloseBraceComment = 854*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml); 855d638c6eeSSascha Wildner break; 856d638c6eeSSascha Wildner 857d638c6eeSSascha Wildner case FILENAME_COMMENT: 858d638c6eeSSascha Wildner 859*1093ca81SSascha Wildner CvDbgPrint ("Found a filename: %s\n", 860*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml)); 861*1093ca81SSascha Wildner FileNode = CvFilenameExists ( 862*1093ca81SSascha Wildner ACPI_CAST_PTR (char, Aml), AcpiGbl_FileTreeRoot); 863d638c6eeSSascha Wildner 864d638c6eeSSascha Wildner /* 865d638c6eeSSascha Wildner * If there is an INCLUDE_COMMENT followed by a 866d638c6eeSSascha Wildner * FILENAME_COMMENT, then the INCLUDE_COMMENT is a comment 867d638c6eeSSascha Wildner * that is emitted before the #include for the file. 868d638c6eeSSascha Wildner * We will save the IncludeComment within the FileNode 869d638c6eeSSascha Wildner * associated with this FILENAME_COMMENT. 870d638c6eeSSascha Wildner */ 871d638c6eeSSascha Wildner if (FileNode && AcpiGbl_IncCommentListHead) 872d638c6eeSSascha Wildner { 873d638c6eeSSascha Wildner FileNode->IncludeComment = AcpiGbl_IncCommentListHead; 874d638c6eeSSascha Wildner AcpiGbl_IncCommentListHead = NULL; 875d638c6eeSSascha Wildner AcpiGbl_IncCommentListTail = NULL; 876d638c6eeSSascha Wildner } 877d638c6eeSSascha Wildner break; 878d638c6eeSSascha Wildner 879d638c6eeSSascha Wildner case PARENTFILENAME_COMMENT: 880d638c6eeSSascha Wildner CvDbgPrint (" Found a parent filename.\n"); 881d638c6eeSSascha Wildner break; 882d638c6eeSSascha Wildner 883d638c6eeSSascha Wildner case INCLUDE_COMMENT: 884d638c6eeSSascha Wildner 885d638c6eeSSascha Wildner /* 886d638c6eeSSascha Wildner * Add to a linked list. This list will be taken by the 887d638c6eeSSascha Wildner * parse node created next. See the FILENAME_COMMENT case 888d638c6eeSSascha Wildner * for more details 889d638c6eeSSascha Wildner */ 890*1093ca81SSascha Wildner CommentNode = AcpiOsAcquireObject ( 891*1093ca81SSascha Wildner AcpiGbl_RegCommentCache); 892d638c6eeSSascha Wildner CommentNode->Comment = ACPI_CAST_PTR (char, Aml); 893d638c6eeSSascha Wildner CommentNode->Next = NULL; 894d638c6eeSSascha Wildner 895d638c6eeSSascha Wildner if (!AcpiGbl_IncCommentListHead) 896d638c6eeSSascha Wildner { 897d638c6eeSSascha Wildner AcpiGbl_IncCommentListHead = CommentNode; 898d638c6eeSSascha Wildner AcpiGbl_IncCommentListTail = CommentNode; 899d638c6eeSSascha Wildner } 900d638c6eeSSascha Wildner else 901d638c6eeSSascha Wildner { 902d638c6eeSSascha Wildner AcpiGbl_IncCommentListTail->Next = CommentNode; 903*1093ca81SSascha Wildner AcpiGbl_IncCommentListTail = 904*1093ca81SSascha Wildner AcpiGbl_IncCommentListTail->Next; 905d638c6eeSSascha Wildner } 906d638c6eeSSascha Wildner 907*1093ca81SSascha Wildner CvDbgPrint ("Found a include comment: %s\n", 908*1093ca81SSascha Wildner CommentNode->Comment); 909d638c6eeSSascha Wildner break; 910d638c6eeSSascha Wildner 911d638c6eeSSascha Wildner default: 912d638c6eeSSascha Wildner 913d638c6eeSSascha Wildner /* Not a valid comment option. Revert the AML */ 914d638c6eeSSascha Wildner 915d638c6eeSSascha Wildner Aml -= 2; 916d638c6eeSSascha Wildner goto DefBlock; 917d638c6eeSSascha Wildner 918*1093ca81SSascha Wildner } /* End switch statement */ 919d638c6eeSSascha Wildner 920*1093ca81SSascha Wildner } /* End else */ 921d638c6eeSSascha Wildner 922*1093ca81SSascha Wildner /* Determine the length and move forward that amount */ 923d638c6eeSSascha Wildner 924d638c6eeSSascha Wildner Length = 0; 925d638c6eeSSascha Wildner while (ParserState->Aml[Length]) 926d638c6eeSSascha Wildner { 927d638c6eeSSascha Wildner Length++; 928d638c6eeSSascha Wildner } 929d638c6eeSSascha Wildner 930d638c6eeSSascha Wildner ParserState->Aml += Length + 1; 931d638c6eeSSascha Wildner 932d638c6eeSSascha Wildner /* Peek at the next Opcode. */ 933d638c6eeSSascha Wildner 934d638c6eeSSascha Wildner Aml = ParserState->Aml; 935d638c6eeSSascha Wildner Opcode = (UINT16) ACPI_GET8 (Aml); 936d638c6eeSSascha Wildner } 937d638c6eeSSascha Wildner 938d638c6eeSSascha Wildner DefBlock: 939d638c6eeSSascha Wildner if (StdDefBlockFlag) 940d638c6eeSSascha Wildner { 941d638c6eeSSascha Wildner /* 942d638c6eeSSascha Wildner * Give all of its comments to the current scope, which is known as 943d638c6eeSSascha Wildner * the definition block, since STD_DEFBLK_COMMENT only appears after 944d638c6eeSSascha Wildner * definition block headers. 945d638c6eeSSascha Wildner */ 946d638c6eeSSascha Wildner AcpiGbl_CurrentScope->Common.CommentList 947d638c6eeSSascha Wildner = AcpiGbl_DefBlkCommentListHead; 948d638c6eeSSascha Wildner AcpiGbl_DefBlkCommentListHead = NULL; 949d638c6eeSSascha Wildner AcpiGbl_DefBlkCommentListTail = NULL; 950d638c6eeSSascha Wildner } 951d638c6eeSSascha Wildner } 952d638c6eeSSascha Wildner 953d638c6eeSSascha Wildner 954d638c6eeSSascha Wildner /******************************************************************************* 955d638c6eeSSascha Wildner * 956d638c6eeSSascha Wildner * FUNCTION: CvCaptureComments 957d638c6eeSSascha Wildner * 958d638c6eeSSascha Wildner * PARAMETERS: ParserState - A parser state object 959d638c6eeSSascha Wildner * 960*1093ca81SSascha Wildner * RETURN: None 961d638c6eeSSascha Wildner * 962d638c6eeSSascha Wildner * DESCRIPTION: Wrapper function for CvCaptureCommentsOnly 963d638c6eeSSascha Wildner * This is referred as ASL_CV_CAPTURE_COMMENTS. 964d638c6eeSSascha Wildner * 965d638c6eeSSascha Wildner ******************************************************************************/ 966d638c6eeSSascha Wildner 967d638c6eeSSascha Wildner void 968d638c6eeSSascha Wildner CvCaptureComments ( 969d638c6eeSSascha Wildner ACPI_WALK_STATE *WalkState) 970d638c6eeSSascha Wildner { 971d638c6eeSSascha Wildner UINT8 *Aml; 972d638c6eeSSascha Wildner UINT16 Opcode; 973d638c6eeSSascha Wildner const ACPI_OPCODE_INFO *OpInfo; 974d638c6eeSSascha Wildner 975d638c6eeSSascha Wildner 976d638c6eeSSascha Wildner if (!Gbl_CaptureComments) 977d638c6eeSSascha Wildner { 978d638c6eeSSascha Wildner return; 979d638c6eeSSascha Wildner } 980d638c6eeSSascha Wildner 981d638c6eeSSascha Wildner /* 982*1093ca81SSascha Wildner * Before parsing, check to see that comments that come directly 983*1093ca81SSascha Wildner * after deferred opcodes aren't being processed. 984d638c6eeSSascha Wildner */ 985d638c6eeSSascha Wildner Aml = WalkState->ParserState.Aml; 986d638c6eeSSascha Wildner Opcode = (UINT16) ACPI_GET8 (Aml); 987d638c6eeSSascha Wildner OpInfo = AcpiPsGetOpcodeInfo (Opcode); 988d638c6eeSSascha Wildner 989d638c6eeSSascha Wildner if (!(OpInfo->Flags & AML_DEFER) || 990d638c6eeSSascha Wildner ((OpInfo->Flags & AML_DEFER) && 991d638c6eeSSascha Wildner (WalkState->PassNumber != ACPI_IMODE_LOAD_PASS1))) 992d638c6eeSSascha Wildner { 993d638c6eeSSascha Wildner CvCaptureCommentsOnly (&WalkState->ParserState); 994d638c6eeSSascha Wildner WalkState->Aml = WalkState->ParserState.Aml; 995d638c6eeSSascha Wildner } 996d638c6eeSSascha Wildner 997d638c6eeSSascha Wildner } 998d638c6eeSSascha Wildner 999d638c6eeSSascha Wildner 1000d638c6eeSSascha Wildner /******************************************************************************* 1001d638c6eeSSascha Wildner * 1002d638c6eeSSascha Wildner * FUNCTION: CvTransferComments 1003d638c6eeSSascha Wildner * 1004d638c6eeSSascha Wildner * PARAMETERS: Op - Transfer comments to this Op 1005d638c6eeSSascha Wildner * 1006*1093ca81SSascha Wildner * RETURN: None 1007d638c6eeSSascha Wildner * 1008d638c6eeSSascha Wildner * DESCRIPTION: Transfer all of the commments stored in global containers to the 1009d638c6eeSSascha Wildner * given Op. This will be invoked shortly after the parser creates 1010d638c6eeSSascha Wildner * a ParseOp. 1011d638c6eeSSascha Wildner * This is referred as ASL_CV_TRANSFER_COMMENTS. 1012d638c6eeSSascha Wildner * 1013d638c6eeSSascha Wildner ******************************************************************************/ 1014d638c6eeSSascha Wildner 1015d638c6eeSSascha Wildner void 1016d638c6eeSSascha Wildner CvTransferComments ( 1017d638c6eeSSascha Wildner ACPI_PARSE_OBJECT *Op) 1018d638c6eeSSascha Wildner { 1019*1093ca81SSascha Wildner 1020d638c6eeSSascha Wildner Op->Common.InlineComment = AcpiGbl_CurrentInlineComment; 1021d638c6eeSSascha Wildner AcpiGbl_CurrentInlineComment = NULL; 1022d638c6eeSSascha Wildner 1023d638c6eeSSascha Wildner Op->Common.EndNodeComment = AcpiGbl_CurrentEndNodeComment; 1024d638c6eeSSascha Wildner AcpiGbl_CurrentEndNodeComment = NULL; 1025d638c6eeSSascha Wildner 1026d638c6eeSSascha Wildner Op->Common.CloseBraceComment = AcpiGbl_CurrentCloseBraceComment; 1027d638c6eeSSascha Wildner AcpiGbl_CurrentCloseBraceComment = NULL; 1028d638c6eeSSascha Wildner 1029d638c6eeSSascha Wildner Op->Common.CommentList = AcpiGbl_RegCommentListHead; 1030d638c6eeSSascha Wildner AcpiGbl_RegCommentListHead = NULL; 1031d638c6eeSSascha Wildner AcpiGbl_RegCommentListTail = NULL; 1032d638c6eeSSascha Wildner 1033d638c6eeSSascha Wildner Op->Common.EndBlkComment = AcpiGbl_EndBlkCommentListHead; 1034d638c6eeSSascha Wildner AcpiGbl_EndBlkCommentListHead = NULL; 1035d638c6eeSSascha Wildner AcpiGbl_EndBlkCommentListTail = NULL; 1036d638c6eeSSascha Wildner } 1037