xref: /freebsd-src/sys/contrib/dev/acpica/compiler/cvparser.c (revision 804fe2660352e090f4481f2c1d646b508859e79a)
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