1a88e22b7SJung-uk Kim /****************************************************************************** 2a88e22b7SJung-uk Kim * 3a88e22b7SJung-uk Kim * Module Name: dtio.c - File I/O support for data table compiler 4a88e22b7SJung-uk Kim * 5a88e22b7SJung-uk Kim *****************************************************************************/ 6a88e22b7SJung-uk Kim 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 1132ac4016SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp. 12a88e22b7SJung-uk Kim * All rights reserved. 13a88e22b7SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 121d244b227SJung-uk Kim * are met: 122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124d244b227SJung-uk Kim * without modification. 125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129d244b227SJung-uk Kim * binary redistribution. 130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132d244b227SJung-uk Kim * from this software without specific prior written permission. 133a88e22b7SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148d244b227SJung-uk Kim * Software Foundation. 149a88e22b7SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 151a88e22b7SJung-uk Kim 152a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 153313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 154a88e22b7SJung-uk Kim 155a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 156a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtio") 157a88e22b7SJung-uk Kim 158a88e22b7SJung-uk Kim 159a88e22b7SJung-uk Kim /* Local prototypes */ 160a88e22b7SJung-uk Kim 161a88e22b7SJung-uk Kim static char * 162a88e22b7SJung-uk Kim DtTrim ( 163a88e22b7SJung-uk Kim char *String); 164a88e22b7SJung-uk Kim 165a88e22b7SJung-uk Kim static void 166a88e22b7SJung-uk Kim DtLinkField ( 167a88e22b7SJung-uk Kim DT_FIELD *Field); 168a88e22b7SJung-uk Kim 169d244b227SJung-uk Kim static ACPI_STATUS 170a88e22b7SJung-uk Kim DtParseLine ( 171a88e22b7SJung-uk Kim char *LineBuffer, 172a88e22b7SJung-uk Kim UINT32 Line, 173a88e22b7SJung-uk Kim UINT32 Offset); 174a88e22b7SJung-uk Kim 175a88e22b7SJung-uk Kim static void 176a88e22b7SJung-uk Kim DtWriteBinary ( 177a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 178a88e22b7SJung-uk Kim void *Context, 179a88e22b7SJung-uk Kim void *ReturnValue); 180a88e22b7SJung-uk Kim 181d244b227SJung-uk Kim static void 182d244b227SJung-uk Kim DtDumpBuffer ( 183d244b227SJung-uk Kim UINT32 FileId, 184d244b227SJung-uk Kim UINT8 *Buffer, 1850b94ba42SJung-uk Kim UINT32 Offset, 186d244b227SJung-uk Kim UINT32 Length); 187a88e22b7SJung-uk Kim 188efcc2a30SJung-uk Kim static void 189efcc2a30SJung-uk Kim DtDumpSubtableInfo ( 190efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 191efcc2a30SJung-uk Kim void *Context, 192efcc2a30SJung-uk Kim void *ReturnValue); 193efcc2a30SJung-uk Kim 194efcc2a30SJung-uk Kim static void 195efcc2a30SJung-uk Kim DtDumpSubtableTree ( 196efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 197efcc2a30SJung-uk Kim void *Context, 198efcc2a30SJung-uk Kim void *ReturnValue); 199efcc2a30SJung-uk Kim 2000b94ba42SJung-uk Kim 201a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 202a88e22b7SJung-uk Kim 203a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 204a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 205a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 206a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 207a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 208a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 209d052a1ccSJung-uk Kim #define DT_MERGE_LINES 6 210eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE 7 211a88e22b7SJung-uk Kim 2126f1f1a63SJung-uk Kim static UINT32 AslGbl_NextLineOffset; 213a88e22b7SJung-uk Kim 214a88e22b7SJung-uk Kim 215a88e22b7SJung-uk Kim /****************************************************************************** 216a88e22b7SJung-uk Kim * 217a88e22b7SJung-uk Kim * FUNCTION: DtTrim 218a88e22b7SJung-uk Kim * 219a88e22b7SJung-uk Kim * PARAMETERS: String - Current source code line to trim 220a88e22b7SJung-uk Kim * 221a88e22b7SJung-uk Kim * RETURN: Trimmed line. Must be freed by caller. 222a88e22b7SJung-uk Kim * 223a88e22b7SJung-uk Kim * DESCRIPTION: Trim left and right spaces 224a88e22b7SJung-uk Kim * 225a88e22b7SJung-uk Kim *****************************************************************************/ 226a88e22b7SJung-uk Kim 227a88e22b7SJung-uk Kim static char * 228a88e22b7SJung-uk Kim DtTrim ( 229a88e22b7SJung-uk Kim char *String) 230a88e22b7SJung-uk Kim { 231a88e22b7SJung-uk Kim char *Start; 232a88e22b7SJung-uk Kim char *End; 233a88e22b7SJung-uk Kim char *ReturnString; 234a88e22b7SJung-uk Kim ACPI_SIZE Length; 235a88e22b7SJung-uk Kim 236a88e22b7SJung-uk Kim 237a88e22b7SJung-uk Kim /* Skip lines that start with a space */ 238a88e22b7SJung-uk Kim 239*4a38ee6dSJung-uk Kim if (*String == 0 || !strcmp (String, " ")) 240a88e22b7SJung-uk Kim { 24167d9aa44SJung-uk Kim ReturnString = UtLocalCacheCalloc (1); 242a88e22b7SJung-uk Kim return (ReturnString); 243a88e22b7SJung-uk Kim } 244a88e22b7SJung-uk Kim 245a88e22b7SJung-uk Kim /* Setup pointers to start and end of input string */ 246a88e22b7SJung-uk Kim 247a88e22b7SJung-uk Kim Start = String; 2485ef50723SJung-uk Kim End = String + strlen (String) - 1; 249a88e22b7SJung-uk Kim 250a88e22b7SJung-uk Kim /* Find first non-whitespace character */ 251a88e22b7SJung-uk Kim 252a88e22b7SJung-uk Kim while ((Start <= End) && ((*Start == ' ') || (*Start == '\t'))) 253a88e22b7SJung-uk Kim { 254a88e22b7SJung-uk Kim Start++; 255a88e22b7SJung-uk Kim } 256a88e22b7SJung-uk Kim 257a88e22b7SJung-uk Kim /* Find last non-space character */ 258a88e22b7SJung-uk Kim 259a88e22b7SJung-uk Kim while (End >= Start) 260a88e22b7SJung-uk Kim { 261*4a38ee6dSJung-uk Kim if (*End == '\n') 262a88e22b7SJung-uk Kim { 263a88e22b7SJung-uk Kim End--; 264a88e22b7SJung-uk Kim continue; 265a88e22b7SJung-uk Kim } 266a88e22b7SJung-uk Kim 267a88e22b7SJung-uk Kim if (*End != ' ') 268a88e22b7SJung-uk Kim { 269a88e22b7SJung-uk Kim break; 270a88e22b7SJung-uk Kim } 271a88e22b7SJung-uk Kim 272a88e22b7SJung-uk Kim End--; 273a88e22b7SJung-uk Kim } 274a88e22b7SJung-uk Kim 275a88e22b7SJung-uk Kim /* Remove any quotes around the string */ 276a88e22b7SJung-uk Kim 277a88e22b7SJung-uk Kim if (*Start == '\"') 278a88e22b7SJung-uk Kim { 279a88e22b7SJung-uk Kim Start++; 280a88e22b7SJung-uk Kim } 281a88e22b7SJung-uk Kim if (*End == '\"') 282a88e22b7SJung-uk Kim { 283a88e22b7SJung-uk Kim End--; 284a88e22b7SJung-uk Kim } 285a88e22b7SJung-uk Kim 286a88e22b7SJung-uk Kim /* Create the trimmed return string */ 287a88e22b7SJung-uk Kim 288a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start) + 1; 28967d9aa44SJung-uk Kim ReturnString = UtLocalCacheCalloc (Length + 1); 2905ef50723SJung-uk Kim if (strlen (Start)) 291a88e22b7SJung-uk Kim { 2925ef50723SJung-uk Kim strncpy (ReturnString, Start, Length); 293a88e22b7SJung-uk Kim } 294a88e22b7SJung-uk Kim 295a88e22b7SJung-uk Kim ReturnString[Length] = 0; 296a88e22b7SJung-uk Kim return (ReturnString); 297a88e22b7SJung-uk Kim } 298a88e22b7SJung-uk Kim 299a88e22b7SJung-uk Kim 300a88e22b7SJung-uk Kim /****************************************************************************** 301a88e22b7SJung-uk Kim * 302a88e22b7SJung-uk Kim * FUNCTION: DtLinkField 303a88e22b7SJung-uk Kim * 304a88e22b7SJung-uk Kim * PARAMETERS: Field - New field object to link 305a88e22b7SJung-uk Kim * 306a88e22b7SJung-uk Kim * RETURN: None 307a88e22b7SJung-uk Kim * 308a88e22b7SJung-uk Kim * DESCRIPTION: Link one field name and value to the list 309a88e22b7SJung-uk Kim * 310a88e22b7SJung-uk Kim *****************************************************************************/ 311a88e22b7SJung-uk Kim 312a88e22b7SJung-uk Kim static void 313a88e22b7SJung-uk Kim DtLinkField ( 314a88e22b7SJung-uk Kim DT_FIELD *Field) 315a88e22b7SJung-uk Kim { 316a88e22b7SJung-uk Kim DT_FIELD *Prev; 317a88e22b7SJung-uk Kim DT_FIELD *Next; 318a88e22b7SJung-uk Kim 319a88e22b7SJung-uk Kim 3206f1f1a63SJung-uk Kim Prev = Next = AslGbl_FieldList; 321a88e22b7SJung-uk Kim 322a88e22b7SJung-uk Kim while (Next) 323a88e22b7SJung-uk Kim { 324a88e22b7SJung-uk Kim Prev = Next; 325a88e22b7SJung-uk Kim Next = Next->Next; 326a88e22b7SJung-uk Kim } 327a88e22b7SJung-uk Kim 328a88e22b7SJung-uk Kim if (Prev) 329a88e22b7SJung-uk Kim { 330a88e22b7SJung-uk Kim Prev->Next = Field; 331a88e22b7SJung-uk Kim } 332a88e22b7SJung-uk Kim else 333a88e22b7SJung-uk Kim { 3346f1f1a63SJung-uk Kim AslGbl_FieldList = Field; 335a88e22b7SJung-uk Kim } 336a88e22b7SJung-uk Kim } 337a88e22b7SJung-uk Kim 338a88e22b7SJung-uk Kim 339a88e22b7SJung-uk Kim /****************************************************************************** 340a88e22b7SJung-uk Kim * 341a88e22b7SJung-uk Kim * FUNCTION: DtParseLine 342a88e22b7SJung-uk Kim * 343a88e22b7SJung-uk Kim * PARAMETERS: LineBuffer - Current source code line 344a88e22b7SJung-uk Kim * Line - Current line number in the source 345a88e22b7SJung-uk Kim * Offset - Current byte offset of the line 346a88e22b7SJung-uk Kim * 347d244b227SJung-uk Kim * RETURN: Status 348a88e22b7SJung-uk Kim * 349a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 350a88e22b7SJung-uk Kim * 351a88e22b7SJung-uk Kim *****************************************************************************/ 352a88e22b7SJung-uk Kim 353d244b227SJung-uk Kim static ACPI_STATUS 354a88e22b7SJung-uk Kim DtParseLine ( 355a88e22b7SJung-uk Kim char *LineBuffer, 356a88e22b7SJung-uk Kim UINT32 Line, 357a88e22b7SJung-uk Kim UINT32 Offset) 358a88e22b7SJung-uk Kim { 359a88e22b7SJung-uk Kim char *Start; 360a88e22b7SJung-uk Kim char *End; 361a88e22b7SJung-uk Kim char *TmpName; 362a88e22b7SJung-uk Kim char *TmpValue; 363a88e22b7SJung-uk Kim char *Name; 364a88e22b7SJung-uk Kim char *Value; 365a88e22b7SJung-uk Kim char *Colon; 366a88e22b7SJung-uk Kim UINT32 Length; 367a88e22b7SJung-uk Kim DT_FIELD *Field; 368a88e22b7SJung-uk Kim UINT32 Column; 369a88e22b7SJung-uk Kim UINT32 NameColumn; 370d052a1ccSJung-uk Kim BOOLEAN IsNullString = FALSE; 371a88e22b7SJung-uk Kim 372a88e22b7SJung-uk Kim 373a88e22b7SJung-uk Kim if (!LineBuffer) 374a88e22b7SJung-uk Kim { 375d244b227SJung-uk Kim return (AE_OK); 376d244b227SJung-uk Kim } 377d244b227SJung-uk Kim 378d244b227SJung-uk Kim /* All lines after "Raw Table Data" are ingored */ 379d244b227SJung-uk Kim 380d244b227SJung-uk Kim if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER)) 381d244b227SJung-uk Kim { 382d244b227SJung-uk Kim return (AE_NOT_FOUND); 383a88e22b7SJung-uk Kim } 384a88e22b7SJung-uk Kim 385a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 386d244b227SJung-uk Kim if (!Colon) 387a88e22b7SJung-uk Kim { 388d244b227SJung-uk Kim return (AE_OK); 389a88e22b7SJung-uk Kim } 390a88e22b7SJung-uk Kim 391a88e22b7SJung-uk Kim Start = LineBuffer; 392a88e22b7SJung-uk Kim End = Colon; 393a88e22b7SJung-uk Kim 394a88e22b7SJung-uk Kim while (Start < Colon) 395a88e22b7SJung-uk Kim { 396a88e22b7SJung-uk Kim if (*Start == '[') 397a88e22b7SJung-uk Kim { 3988d744e47SJung-uk Kim /* Found left bracket, go to the right bracket */ 3998d744e47SJung-uk Kim 400a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 401a88e22b7SJung-uk Kim { 402a88e22b7SJung-uk Kim Start++; 403a88e22b7SJung-uk Kim } 4048d744e47SJung-uk Kim } 4058d744e47SJung-uk Kim else if (*Start != ' ') 406a88e22b7SJung-uk Kim { 407a88e22b7SJung-uk Kim break; 408a88e22b7SJung-uk Kim } 409a88e22b7SJung-uk Kim 410a88e22b7SJung-uk Kim Start++; 411a88e22b7SJung-uk Kim } 412a88e22b7SJung-uk Kim 413a88e22b7SJung-uk Kim /* 414a88e22b7SJung-uk Kim * There are two column values. One for the field name, 415a88e22b7SJung-uk Kim * and one for the field value. 416a88e22b7SJung-uk Kim */ 417a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 418a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 419a88e22b7SJung-uk Kim 420a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 421a88e22b7SJung-uk Kim 422a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 4235ef50723SJung-uk Kim strncpy (TmpName, Start, Length); 424a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 425a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 426a88e22b7SJung-uk Kim 427a88e22b7SJung-uk Kim Start = End = (Colon + 1); 428a88e22b7SJung-uk Kim while (*End) 429a88e22b7SJung-uk Kim { 430a88e22b7SJung-uk Kim /* Found left quotation, go to the right quotation and break */ 431a88e22b7SJung-uk Kim 432a88e22b7SJung-uk Kim if (*End == '"') 433a88e22b7SJung-uk Kim { 434a88e22b7SJung-uk Kim End++; 435d052a1ccSJung-uk Kim 436d052a1ccSJung-uk Kim /* Check for an explicit null string */ 437d052a1ccSJung-uk Kim 438d052a1ccSJung-uk Kim if (*End == '"') 439d052a1ccSJung-uk Kim { 440d052a1ccSJung-uk Kim IsNullString = TRUE; 441d052a1ccSJung-uk Kim } 4420b94ba42SJung-uk Kim while (*End && (*End != '"')) 443a88e22b7SJung-uk Kim { 444a88e22b7SJung-uk Kim End++; 445a88e22b7SJung-uk Kim } 446a88e22b7SJung-uk Kim 447a88e22b7SJung-uk Kim End++; 448a88e22b7SJung-uk Kim break; 449a88e22b7SJung-uk Kim } 450a88e22b7SJung-uk Kim 4510b94ba42SJung-uk Kim /* 4520b94ba42SJung-uk Kim * Special "comment" fields at line end, ignore them. 4530b94ba42SJung-uk Kim * Note: normal slash-slash and slash-asterisk comments are 4540b94ba42SJung-uk Kim * stripped already by the DtGetNextLine parser. 4550b94ba42SJung-uk Kim * 4560b94ba42SJung-uk Kim * TBD: Perhaps DtGetNextLine should parse the following type 4570b94ba42SJung-uk Kim * of comments also. 4580b94ba42SJung-uk Kim */ 459d052a1ccSJung-uk Kim if (*End == '[') 460a88e22b7SJung-uk Kim { 461d052a1ccSJung-uk Kim End--; 462a88e22b7SJung-uk Kim break; 463a88e22b7SJung-uk Kim } 464f8146b88SJung-uk Kim 465a88e22b7SJung-uk Kim End++; 466a88e22b7SJung-uk Kim } 467a88e22b7SJung-uk Kim 468a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 469a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 470dcbce41eSJung-uk Kim 4715ef50723SJung-uk Kim strncpy (TmpValue, Start, Length); 472a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 473a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 474a88e22b7SJung-uk Kim 475d052a1ccSJung-uk Kim /* Create a new field object only if we have a valid value field */ 476d052a1ccSJung-uk Kim 477d052a1ccSJung-uk Kim if ((Value && *Value) || IsNullString) 478a88e22b7SJung-uk Kim { 479313a0c13SJung-uk Kim Field = UtFieldCacheCalloc (); 480a88e22b7SJung-uk Kim Field->Name = Name; 481a88e22b7SJung-uk Kim Field->Value = Value; 482a88e22b7SJung-uk Kim Field->Line = Line; 483a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 484a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 485a88e22b7SJung-uk Kim Field->Column = Column; 4867cf3e94aSJung-uk Kim Field->StringLength = Length; 487a88e22b7SJung-uk Kim 488a88e22b7SJung-uk Kim DtLinkField (Field); 489a88e22b7SJung-uk Kim } 490313a0c13SJung-uk Kim /* Else -- Ignore this field, it has no valid data */ 491d244b227SJung-uk Kim 492d244b227SJung-uk Kim return (AE_OK); 493a88e22b7SJung-uk Kim } 494a88e22b7SJung-uk Kim 495a88e22b7SJung-uk Kim 496a88e22b7SJung-uk Kim /****************************************************************************** 497a88e22b7SJung-uk Kim * 498a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 499a88e22b7SJung-uk Kim * 500a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 501a88e22b7SJung-uk Kim * 502d052a1ccSJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (ASL_EOF on EOF) 503a88e22b7SJung-uk Kim * 504a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 505a88e22b7SJung-uk Kim * Ignores empty lines. 506a88e22b7SJung-uk Kim * 507a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 508a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 509a88e22b7SJung-uk Kim * 5106f1f1a63SJung-uk Kim * Line is returned in AslGbl_CurrentLineBuffer. 5116f1f1a63SJung-uk Kim * Line number in original file is returned in AslGbl_CurrentLineNumber. 512a88e22b7SJung-uk Kim * 513a88e22b7SJung-uk Kim *****************************************************************************/ 514a88e22b7SJung-uk Kim 5150b94ba42SJung-uk Kim UINT32 516a88e22b7SJung-uk Kim DtGetNextLine ( 5175ef50723SJung-uk Kim FILE *Handle, 5185ef50723SJung-uk Kim UINT32 Flags) 519a88e22b7SJung-uk Kim { 520d052a1ccSJung-uk Kim BOOLEAN LineNotAllBlanks = FALSE; 521a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 522a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 523a88e22b7SJung-uk Kim UINT32 i; 524a9d8d09cSJung-uk Kim int c; 525*4a38ee6dSJung-uk Kim int c1; 526a88e22b7SJung-uk Kim 527a88e22b7SJung-uk Kim 5286f1f1a63SJung-uk Kim memset (AslGbl_CurrentLineBuffer, 0, AslGbl_LineBufferSize); 529042ff955SJung-uk Kim for (i = 0; ;) 530a88e22b7SJung-uk Kim { 531042ff955SJung-uk Kim /* 532042ff955SJung-uk Kim * If line is too long, expand the line buffers. Also increases 5336f1f1a63SJung-uk Kim * AslGbl_LineBufferSize. 534042ff955SJung-uk Kim */ 5356f1f1a63SJung-uk Kim if (i >= AslGbl_LineBufferSize) 536042ff955SJung-uk Kim { 537042ff955SJung-uk Kim UtExpandLineBuffers (); 538042ff955SJung-uk Kim } 539042ff955SJung-uk Kim 540a9d8d09cSJung-uk Kim c = getc (Handle); 541a88e22b7SJung-uk Kim if (c == EOF) 542a88e22b7SJung-uk Kim { 5430b94ba42SJung-uk Kim switch (State) 5440b94ba42SJung-uk Kim { 5450b94ba42SJung-uk Kim case DT_START_QUOTED_STRING: 5460b94ba42SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 5470b94ba42SJung-uk Kim 5480b94ba42SJung-uk Kim AcpiOsPrintf ("**** EOF within comment/string %u\n", State); 5490b94ba42SJung-uk Kim break; 5500b94ba42SJung-uk Kim 5510b94ba42SJung-uk Kim default: 552a9d8d09cSJung-uk Kim 5530b94ba42SJung-uk Kim break; 5540b94ba42SJung-uk Kim } 5550b94ba42SJung-uk Kim 556a7a3b383SJung-uk Kim /* Standalone EOF is OK */ 557a7a3b383SJung-uk Kim 558a7a3b383SJung-uk Kim if (i == 0) 559a7a3b383SJung-uk Kim { 560d052a1ccSJung-uk Kim return (ASL_EOF); 561a88e22b7SJung-uk Kim } 562a88e22b7SJung-uk Kim 563a7a3b383SJung-uk Kim /* 564a7a3b383SJung-uk Kim * Received an EOF in the middle of a line. Terminate the 565a7a3b383SJung-uk Kim * line with a newline. The next call to this function will 566a7a3b383SJung-uk Kim * return a standalone EOF. Thus, the upper parsing software 567a7a3b383SJung-uk Kim * never has to deal with an EOF within a valid line (or 568a7a3b383SJung-uk Kim * the last line does not get tossed on the floor.) 569a7a3b383SJung-uk Kim */ 570a7a3b383SJung-uk Kim c = '\n'; 571a7a3b383SJung-uk Kim State = DT_NORMAL_TEXT; 572a7a3b383SJung-uk Kim } 573*4a38ee6dSJung-uk Kim else if (c == '\r') 574*4a38ee6dSJung-uk Kim { 575*4a38ee6dSJung-uk Kim c1 = getc (Handle); 576*4a38ee6dSJung-uk Kim if (c1 == '\n') 577*4a38ee6dSJung-uk Kim { 578*4a38ee6dSJung-uk Kim /* 579*4a38ee6dSJung-uk Kim * Skip the carriage return as if it didn't exist. This is 580*4a38ee6dSJung-uk Kim * onlt meant for input files in DOS format in unix. fopen in 581*4a38ee6dSJung-uk Kim * unix may not support "text mode" and leaves CRLF intact. 582*4a38ee6dSJung-uk Kim */ 583*4a38ee6dSJung-uk Kim c = '\n'; 584*4a38ee6dSJung-uk Kim } 585*4a38ee6dSJung-uk Kim else 586*4a38ee6dSJung-uk Kim { 587*4a38ee6dSJung-uk Kim /* This was not a CRLF. Only a CR */ 588*4a38ee6dSJung-uk Kim 589*4a38ee6dSJung-uk Kim ungetc(c1, Handle); 590*4a38ee6dSJung-uk Kim 591*4a38ee6dSJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, 592*4a38ee6dSJung-uk Kim "Carriage return without linefeed detected"); 593*4a38ee6dSJung-uk Kim return (ASL_EOF); 594*4a38ee6dSJung-uk Kim } 595*4a38ee6dSJung-uk Kim } 596a7a3b383SJung-uk Kim 597a88e22b7SJung-uk Kim switch (State) 598a88e22b7SJung-uk Kim { 599a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 600a88e22b7SJung-uk Kim 601a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 602a88e22b7SJung-uk Kim 6036f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i] = (char) c; 604a88e22b7SJung-uk Kim switch (c) 605a88e22b7SJung-uk Kim { 606a88e22b7SJung-uk Kim case '/': 607a9d8d09cSJung-uk Kim 608a88e22b7SJung-uk Kim State = DT_START_COMMENT; 609a88e22b7SJung-uk Kim break; 610a88e22b7SJung-uk Kim 611a88e22b7SJung-uk Kim case '"': 612a9d8d09cSJung-uk Kim 613a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 614d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 615a88e22b7SJung-uk Kim i++; 616a88e22b7SJung-uk Kim break; 617a88e22b7SJung-uk Kim 618d052a1ccSJung-uk Kim case '\\': 619d052a1ccSJung-uk Kim /* 620d052a1ccSJung-uk Kim * The continuation char MUST be last char on this line. 621d052a1ccSJung-uk Kim * Otherwise, it will be assumed to be a valid ASL char. 622d052a1ccSJung-uk Kim */ 623d052a1ccSJung-uk Kim State = DT_MERGE_LINES; 624d052a1ccSJung-uk Kim break; 625d052a1ccSJung-uk Kim 626a88e22b7SJung-uk Kim case '\n': 627a9d8d09cSJung-uk Kim 6286f1f1a63SJung-uk Kim CurrentLineOffset = AslGbl_NextLineOffset; 6296f1f1a63SJung-uk Kim AslGbl_NextLineOffset = (UINT32) ftell (Handle); 6306f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber++; 631a88e22b7SJung-uk Kim 632d052a1ccSJung-uk Kim /* 633d052a1ccSJung-uk Kim * Exit if line is complete. Ignore empty lines (only \n) 634d052a1ccSJung-uk Kim * or lines that contain nothing but blanks. 635d052a1ccSJung-uk Kim */ 636d052a1ccSJung-uk Kim if ((i != 0) && LineNotAllBlanks) 637a88e22b7SJung-uk Kim { 6386f1f1a63SJung-uk Kim if ((i + 1) >= AslGbl_LineBufferSize) 639042ff955SJung-uk Kim { 640042ff955SJung-uk Kim UtExpandLineBuffers (); 641042ff955SJung-uk Kim } 642042ff955SJung-uk Kim 6436f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */ 644a88e22b7SJung-uk Kim return (CurrentLineOffset); 645a88e22b7SJung-uk Kim } 646d052a1ccSJung-uk Kim 647d052a1ccSJung-uk Kim /* Toss this line and start a new one */ 648d052a1ccSJung-uk Kim 649d052a1ccSJung-uk Kim i = 0; 650d052a1ccSJung-uk Kim LineNotAllBlanks = FALSE; 651a88e22b7SJung-uk Kim break; 652a88e22b7SJung-uk Kim 653a88e22b7SJung-uk Kim default: 654a9d8d09cSJung-uk Kim 655d052a1ccSJung-uk Kim if (c != ' ') 656d052a1ccSJung-uk Kim { 657d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 658d052a1ccSJung-uk Kim } 659d052a1ccSJung-uk Kim 660a88e22b7SJung-uk Kim i++; 661a88e22b7SJung-uk Kim break; 662a88e22b7SJung-uk Kim } 663a88e22b7SJung-uk Kim break; 664a88e22b7SJung-uk Kim 665a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 666a88e22b7SJung-uk Kim 667a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 668a88e22b7SJung-uk Kim 6696f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i] = (char) c; 670a88e22b7SJung-uk Kim i++; 671a88e22b7SJung-uk Kim 672eef1b955SJung-uk Kim switch (c) 673a88e22b7SJung-uk Kim { 674eef1b955SJung-uk Kim case '"': 675a9d8d09cSJung-uk Kim 676a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 677eef1b955SJung-uk Kim break; 678eef1b955SJung-uk Kim 679eef1b955SJung-uk Kim case '\\': 680a9d8d09cSJung-uk Kim 681eef1b955SJung-uk Kim State = DT_ESCAPE_SEQUENCE; 682eef1b955SJung-uk Kim break; 683eef1b955SJung-uk Kim 684eef1b955SJung-uk Kim case '\n': 685a9d8d09cSJung-uk Kim 6865ef50723SJung-uk Kim if (!(Flags & DT_ALLOW_MULTILINE_QUOTES)) 6875ef50723SJung-uk Kim { 688f8146b88SJung-uk Kim AcpiOsPrintf ( 689f8146b88SJung-uk Kim "ERROR at line %u: Unterminated quoted string\n", 6906f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber++); 691eef1b955SJung-uk Kim State = DT_NORMAL_TEXT; 6925ef50723SJung-uk Kim } 693eef1b955SJung-uk Kim break; 694eef1b955SJung-uk Kim 695eef1b955SJung-uk Kim default: /* Get next character */ 696a9d8d09cSJung-uk Kim 697eef1b955SJung-uk Kim break; 698a88e22b7SJung-uk Kim } 699a88e22b7SJung-uk Kim break; 700a88e22b7SJung-uk Kim 701eef1b955SJung-uk Kim case DT_ESCAPE_SEQUENCE: 702eef1b955SJung-uk Kim 703eef1b955SJung-uk Kim /* Just copy the escaped character. TBD: sufficient for table compiler? */ 704eef1b955SJung-uk Kim 7056f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i] = (char) c; 706eef1b955SJung-uk Kim i++; 707eef1b955SJung-uk Kim State = DT_START_QUOTED_STRING; 708eef1b955SJung-uk Kim break; 709eef1b955SJung-uk Kim 710a88e22b7SJung-uk Kim case DT_START_COMMENT: 711a88e22b7SJung-uk Kim 712a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 713a88e22b7SJung-uk Kim 714a88e22b7SJung-uk Kim switch (c) 715a88e22b7SJung-uk Kim { 716a88e22b7SJung-uk Kim case '*': 717a9d8d09cSJung-uk Kim 718a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 719a88e22b7SJung-uk Kim break; 720a88e22b7SJung-uk Kim 721a88e22b7SJung-uk Kim case '/': 722a9d8d09cSJung-uk Kim 723a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 724a88e22b7SJung-uk Kim break; 725a88e22b7SJung-uk Kim 726a88e22b7SJung-uk Kim default: /* Not a comment */ 727a9d8d09cSJung-uk Kim 7288ef1a331SJung-uk Kim i++; /* Save the preceding slash */ 7296f1f1a63SJung-uk Kim if (i >= AslGbl_LineBufferSize) 730042ff955SJung-uk Kim { 731042ff955SJung-uk Kim UtExpandLineBuffers (); 732042ff955SJung-uk Kim } 733042ff955SJung-uk Kim 7346f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i] = (char) c; 735a88e22b7SJung-uk Kim i++; 736a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 737a88e22b7SJung-uk Kim break; 738a88e22b7SJung-uk Kim } 739a88e22b7SJung-uk Kim break; 740a88e22b7SJung-uk Kim 741a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 742a88e22b7SJung-uk Kim 743a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 744a88e22b7SJung-uk Kim 745a88e22b7SJung-uk Kim switch (c) 746a88e22b7SJung-uk Kim { 747a88e22b7SJung-uk Kim case '\n': 748a9d8d09cSJung-uk Kim 7496f1f1a63SJung-uk Kim AslGbl_NextLineOffset = (UINT32) ftell (Handle); 7506f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber++; 751a88e22b7SJung-uk Kim break; 752a88e22b7SJung-uk Kim 753a88e22b7SJung-uk Kim case '*': 754a9d8d09cSJung-uk Kim 755a88e22b7SJung-uk Kim State = DT_END_COMMENT; 756a88e22b7SJung-uk Kim break; 757a88e22b7SJung-uk Kim 758a88e22b7SJung-uk Kim default: 759a9d8d09cSJung-uk Kim 760a88e22b7SJung-uk Kim break; 761a88e22b7SJung-uk Kim } 762a88e22b7SJung-uk Kim break; 763a88e22b7SJung-uk Kim 764a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 765a88e22b7SJung-uk Kim 766a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 767a88e22b7SJung-uk Kim 768a88e22b7SJung-uk Kim if (c == '\n') 769a88e22b7SJung-uk Kim { 770a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 771a88e22b7SJung-uk Kim 772a88e22b7SJung-uk Kim ungetc (c, Handle); 773a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 774a88e22b7SJung-uk Kim } 775a88e22b7SJung-uk Kim break; 776a88e22b7SJung-uk Kim 777a88e22b7SJung-uk Kim case DT_END_COMMENT: 778a88e22b7SJung-uk Kim 779a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 780a88e22b7SJung-uk Kim 781a88e22b7SJung-uk Kim switch (c) 782a88e22b7SJung-uk Kim { 783a88e22b7SJung-uk Kim case '/': 784a9d8d09cSJung-uk Kim 785a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 786a88e22b7SJung-uk Kim break; 787a88e22b7SJung-uk Kim 7880b94ba42SJung-uk Kim case '\n': 789a9d8d09cSJung-uk Kim 7906f1f1a63SJung-uk Kim CurrentLineOffset = AslGbl_NextLineOffset; 7916f1f1a63SJung-uk Kim AslGbl_NextLineOffset = (UINT32) ftell (Handle); 7926f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber++; 7930b94ba42SJung-uk Kim break; 7940b94ba42SJung-uk Kim 7950b94ba42SJung-uk Kim case '*': 796a9d8d09cSJung-uk Kim 7970b94ba42SJung-uk Kim /* Consume all adjacent asterisks */ 7980b94ba42SJung-uk Kim break; 7990b94ba42SJung-uk Kim 800a88e22b7SJung-uk Kim default: 801a9d8d09cSJung-uk Kim 802a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 803a88e22b7SJung-uk Kim break; 804a88e22b7SJung-uk Kim } 805a88e22b7SJung-uk Kim break; 806a88e22b7SJung-uk Kim 807d052a1ccSJung-uk Kim case DT_MERGE_LINES: 808d052a1ccSJung-uk Kim 809d052a1ccSJung-uk Kim if (c != '\n') 810d052a1ccSJung-uk Kim { 811d052a1ccSJung-uk Kim /* 812d052a1ccSJung-uk Kim * This is not a continuation backslash, it is a normal 813d052a1ccSJung-uk Kim * normal ASL backslash - for example: Scope(\_SB_) 814d052a1ccSJung-uk Kim */ 815d052a1ccSJung-uk Kim i++; /* Keep the backslash that is already in the buffer */ 816d052a1ccSJung-uk Kim 817d052a1ccSJung-uk Kim ungetc (c, Handle); 818d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 819d052a1ccSJung-uk Kim } 820d052a1ccSJung-uk Kim else 821d052a1ccSJung-uk Kim { 822d052a1ccSJung-uk Kim /* 823d052a1ccSJung-uk Kim * This is a continuation line -- a backlash followed 824d052a1ccSJung-uk Kim * immediately by a newline. Insert a space between the 825d052a1ccSJung-uk Kim * lines (overwrite the backslash) 826d052a1ccSJung-uk Kim */ 8276f1f1a63SJung-uk Kim AslGbl_CurrentLineBuffer[i] = ' '; 828d052a1ccSJung-uk Kim i++; 829d052a1ccSJung-uk Kim 830d052a1ccSJung-uk Kim /* Ignore newline, this will merge the lines */ 831d052a1ccSJung-uk Kim 8326f1f1a63SJung-uk Kim CurrentLineOffset = AslGbl_NextLineOffset; 8336f1f1a63SJung-uk Kim AslGbl_NextLineOffset = (UINT32) ftell (Handle); 8346f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber++; 835d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 836d052a1ccSJung-uk Kim } 837d052a1ccSJung-uk Kim break; 838d052a1ccSJung-uk Kim 839a88e22b7SJung-uk Kim default: 840a9d8d09cSJung-uk Kim 841a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 842d052a1ccSJung-uk Kim return (ASL_EOF); 843a88e22b7SJung-uk Kim } 844a88e22b7SJung-uk Kim } 845a88e22b7SJung-uk Kim } 846a88e22b7SJung-uk Kim 847a88e22b7SJung-uk Kim 848a88e22b7SJung-uk Kim /****************************************************************************** 849a88e22b7SJung-uk Kim * 850a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 851a88e22b7SJung-uk Kim * 852a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 853a88e22b7SJung-uk Kim * 854a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 855a88e22b7SJung-uk Kim * 856a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 8576f1f1a63SJung-uk Kim * to the global parse tree: AslGbl_FieldList 858a88e22b7SJung-uk Kim * 859a88e22b7SJung-uk Kim *****************************************************************************/ 860a88e22b7SJung-uk Kim 861a88e22b7SJung-uk Kim DT_FIELD * 862a88e22b7SJung-uk Kim DtScanFile ( 863a88e22b7SJung-uk Kim FILE *Handle) 864a88e22b7SJung-uk Kim { 865d244b227SJung-uk Kim ACPI_STATUS Status; 866a88e22b7SJung-uk Kim UINT32 Offset; 867a88e22b7SJung-uk Kim 868a88e22b7SJung-uk Kim 869a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 870a88e22b7SJung-uk Kim 871a88e22b7SJung-uk Kim 872a88e22b7SJung-uk Kim /* Get the file size */ 873a88e22b7SJung-uk Kim 8746f1f1a63SJung-uk Kim AslGbl_InputByteCount = CmGetFileSize (Handle); 8756f1f1a63SJung-uk Kim if (AslGbl_InputByteCount == ACPI_UINT32_MAX) 876313a0c13SJung-uk Kim { 877313a0c13SJung-uk Kim AslAbort (); 878313a0c13SJung-uk Kim } 879a88e22b7SJung-uk Kim 8806f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber = 0; 8816f1f1a63SJung-uk Kim AslGbl_CurrentLineOffset = 0; 8826f1f1a63SJung-uk Kim AslGbl_NextLineOffset = 0; 883a88e22b7SJung-uk Kim 884a88e22b7SJung-uk Kim /* Scan line-by-line */ 885a88e22b7SJung-uk Kim 8865ef50723SJung-uk Kim while ((Offset = DtGetNextLine (Handle, 0)) != ASL_EOF) 887a88e22b7SJung-uk Kim { 888a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 8896f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, Offset, AslGbl_CurrentLineBuffer)); 890a88e22b7SJung-uk Kim 8916f1f1a63SJung-uk Kim Status = DtParseLine (AslGbl_CurrentLineBuffer, 8926f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, Offset); 893d244b227SJung-uk Kim if (Status == AE_NOT_FOUND) 894d244b227SJung-uk Kim { 895d244b227SJung-uk Kim break; 896d244b227SJung-uk Kim } 897a88e22b7SJung-uk Kim } 898a88e22b7SJung-uk Kim 899d052a1ccSJung-uk Kim /* Dump the parse tree if debug enabled */ 900d052a1ccSJung-uk Kim 9016f1f1a63SJung-uk Kim DtDumpFieldList (AslGbl_FieldList); 9026f1f1a63SJung-uk Kim return (AslGbl_FieldList); 903a88e22b7SJung-uk Kim } 904a88e22b7SJung-uk Kim 905a88e22b7SJung-uk Kim 906a88e22b7SJung-uk Kim /* 907a88e22b7SJung-uk Kim * Output functions 908a88e22b7SJung-uk Kim */ 909a88e22b7SJung-uk Kim 910a88e22b7SJung-uk Kim /****************************************************************************** 911a88e22b7SJung-uk Kim * 912a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 913a88e22b7SJung-uk Kim * 914a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 915a88e22b7SJung-uk Kim * 916a88e22b7SJung-uk Kim * RETURN: Status 917a88e22b7SJung-uk Kim * 918a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 919a88e22b7SJung-uk Kim * 920a88e22b7SJung-uk Kim *****************************************************************************/ 921a88e22b7SJung-uk Kim 922a88e22b7SJung-uk Kim static void 923a88e22b7SJung-uk Kim DtWriteBinary ( 924a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 925a88e22b7SJung-uk Kim void *Context, 926a88e22b7SJung-uk Kim void *ReturnValue) 927a88e22b7SJung-uk Kim { 928a88e22b7SJung-uk Kim 929a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 930a88e22b7SJung-uk Kim } 931a88e22b7SJung-uk Kim 932a88e22b7SJung-uk Kim 933a88e22b7SJung-uk Kim /****************************************************************************** 934a88e22b7SJung-uk Kim * 935a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 936a88e22b7SJung-uk Kim * 937a88e22b7SJung-uk Kim * PARAMETERS: 938a88e22b7SJung-uk Kim * 939a88e22b7SJung-uk Kim * RETURN: Status 940a88e22b7SJung-uk Kim * 941a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 942a88e22b7SJung-uk Kim * 943a88e22b7SJung-uk Kim *****************************************************************************/ 944a88e22b7SJung-uk Kim 945a88e22b7SJung-uk Kim void 946a88e22b7SJung-uk Kim DtOutputBinary ( 947a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 948a88e22b7SJung-uk Kim { 949a88e22b7SJung-uk Kim 950a88e22b7SJung-uk Kim if (!RootTable) 951a88e22b7SJung-uk Kim { 952a88e22b7SJung-uk Kim return; 953a88e22b7SJung-uk Kim } 954a88e22b7SJung-uk Kim 955a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 956a88e22b7SJung-uk Kim 957a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 958313a0c13SJung-uk Kim 9596f1f1a63SJung-uk Kim AslGbl_TableLength = CmGetFileSize (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle); 9606f1f1a63SJung-uk Kim if (AslGbl_TableLength == ACPI_UINT32_MAX) 961313a0c13SJung-uk Kim { 962313a0c13SJung-uk Kim AslAbort (); 963313a0c13SJung-uk Kim } 964a88e22b7SJung-uk Kim } 965d244b227SJung-uk Kim 966d244b227SJung-uk Kim 967d244b227SJung-uk Kim /* 968d244b227SJung-uk Kim * Listing support 969d244b227SJung-uk Kim */ 970d244b227SJung-uk Kim 971d244b227SJung-uk Kim /****************************************************************************** 972d244b227SJung-uk Kim * 973d244b227SJung-uk Kim * FUNCTION: DtDumpBuffer 974d244b227SJung-uk Kim * 975d244b227SJung-uk Kim * PARAMETERS: FileID - Where to write buffer data 976d244b227SJung-uk Kim * Buffer - Buffer to dump 9770b94ba42SJung-uk Kim * Offset - Offset in current table 978d244b227SJung-uk Kim * Length - Buffer Length 979d244b227SJung-uk Kim * 980d244b227SJung-uk Kim * RETURN: None 981d244b227SJung-uk Kim * 982d244b227SJung-uk Kim * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately). 983d244b227SJung-uk Kim * 984d244b227SJung-uk Kim * TBD: merge dump buffer routines 985d244b227SJung-uk Kim * 986d244b227SJung-uk Kim *****************************************************************************/ 987d244b227SJung-uk Kim 988d244b227SJung-uk Kim static void 989d244b227SJung-uk Kim DtDumpBuffer ( 990d244b227SJung-uk Kim UINT32 FileId, 991d244b227SJung-uk Kim UINT8 *Buffer, 9920b94ba42SJung-uk Kim UINT32 Offset, 993d244b227SJung-uk Kim UINT32 Length) 994d244b227SJung-uk Kim { 995d244b227SJung-uk Kim UINT32 i; 996d244b227SJung-uk Kim UINT32 j; 997d244b227SJung-uk Kim UINT8 BufChar; 998d244b227SJung-uk Kim 999d244b227SJung-uk Kim 10000b94ba42SJung-uk Kim FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ", 10010b94ba42SJung-uk Kim Offset, Offset, Length); 10020b94ba42SJung-uk Kim 1003d244b227SJung-uk Kim i = 0; 1004d244b227SJung-uk Kim while (i < Length) 1005d244b227SJung-uk Kim { 10060b94ba42SJung-uk Kim if (i >= 16) 10070b94ba42SJung-uk Kim { 1008d052a1ccSJung-uk Kim FlPrintFile (FileId, "%24s", ""); 10090b94ba42SJung-uk Kim } 1010d244b227SJung-uk Kim 10110b94ba42SJung-uk Kim /* Print 16 hex chars */ 1012d244b227SJung-uk Kim 1013d244b227SJung-uk Kim for (j = 0; j < 16;) 1014d244b227SJung-uk Kim { 1015d244b227SJung-uk Kim if (i + j >= Length) 1016d244b227SJung-uk Kim { 1017d244b227SJung-uk Kim /* Dump fill spaces */ 1018d244b227SJung-uk Kim 1019d244b227SJung-uk Kim FlPrintFile (FileId, " "); 1020d244b227SJung-uk Kim j++; 1021d244b227SJung-uk Kim continue; 1022d244b227SJung-uk Kim } 1023d244b227SJung-uk Kim 1024d244b227SJung-uk Kim FlPrintFile (FileId, "%02X ", Buffer[i+j]); 1025d244b227SJung-uk Kim j++; 1026d244b227SJung-uk Kim } 1027d244b227SJung-uk Kim 1028d244b227SJung-uk Kim FlPrintFile (FileId, " "); 1029d244b227SJung-uk Kim for (j = 0; j < 16; j++) 1030d244b227SJung-uk Kim { 1031d244b227SJung-uk Kim if (i + j >= Length) 1032d244b227SJung-uk Kim { 1033d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 1034d244b227SJung-uk Kim return; 1035d244b227SJung-uk Kim } 1036d244b227SJung-uk Kim 1037d244b227SJung-uk Kim BufChar = Buffer[(ACPI_SIZE) i + j]; 10385ef50723SJung-uk Kim if (isprint (BufChar)) 1039d244b227SJung-uk Kim { 1040d244b227SJung-uk Kim FlPrintFile (FileId, "%c", BufChar); 1041d244b227SJung-uk Kim } 1042d244b227SJung-uk Kim else 1043d244b227SJung-uk Kim { 1044d244b227SJung-uk Kim FlPrintFile (FileId, "."); 1045d244b227SJung-uk Kim } 1046d244b227SJung-uk Kim } 1047d244b227SJung-uk Kim 1048d244b227SJung-uk Kim /* Done with that line. */ 1049d244b227SJung-uk Kim 1050d244b227SJung-uk Kim FlPrintFile (FileId, "\n"); 1051d244b227SJung-uk Kim i += 16; 1052d244b227SJung-uk Kim } 1053d244b227SJung-uk Kim 1054d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 1055d244b227SJung-uk Kim } 1056d244b227SJung-uk Kim 1057d244b227SJung-uk Kim 1058d244b227SJung-uk Kim /****************************************************************************** 1059d244b227SJung-uk Kim * 1060efcc2a30SJung-uk Kim * FUNCTION: DtDumpFieldList 1061efcc2a30SJung-uk Kim * 1062efcc2a30SJung-uk Kim * PARAMETERS: Field - Root field 1063efcc2a30SJung-uk Kim * 1064efcc2a30SJung-uk Kim * RETURN: None 1065efcc2a30SJung-uk Kim * 1066efcc2a30SJung-uk Kim * DESCRIPTION: Dump the entire field list 1067efcc2a30SJung-uk Kim * 1068efcc2a30SJung-uk Kim *****************************************************************************/ 1069efcc2a30SJung-uk Kim 1070efcc2a30SJung-uk Kim void 1071efcc2a30SJung-uk Kim DtDumpFieldList ( 1072efcc2a30SJung-uk Kim DT_FIELD *Field) 1073efcc2a30SJung-uk Kim { 1074efcc2a30SJung-uk Kim 10756f1f1a63SJung-uk Kim if (!AslGbl_DebugFlag || !Field) 1076efcc2a30SJung-uk Kim { 1077efcc2a30SJung-uk Kim return; 1078efcc2a30SJung-uk Kim } 1079efcc2a30SJung-uk Kim 1080efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "\nField List:\n" 1081efcc2a30SJung-uk Kim "LineNo ByteOff NameCol Column TableOff " 1082efcc2a30SJung-uk Kim "Flags %32s : %s\n\n", "Name", "Value"); 1083f8146b88SJung-uk Kim 1084efcc2a30SJung-uk Kim while (Field) 1085efcc2a30SJung-uk Kim { 1086efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 10877cf3e94aSJung-uk Kim "%.08X %.08X %.08X %.08X %.08X %2.2X %32s : %s\n", 1088efcc2a30SJung-uk Kim Field->Line, Field->ByteOffset, Field->NameColumn, 1089efcc2a30SJung-uk Kim Field->Column, Field->TableOffset, Field->Flags, 1090efcc2a30SJung-uk Kim Field->Name, Field->Value); 1091efcc2a30SJung-uk Kim 1092efcc2a30SJung-uk Kim Field = Field->Next; 1093efcc2a30SJung-uk Kim } 1094efcc2a30SJung-uk Kim 1095efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "\n\n"); 1096efcc2a30SJung-uk Kim } 1097efcc2a30SJung-uk Kim 1098efcc2a30SJung-uk Kim 1099efcc2a30SJung-uk Kim /****************************************************************************** 1100efcc2a30SJung-uk Kim * 1101efcc2a30SJung-uk Kim * FUNCTION: DtDumpSubtableInfo, DtDumpSubtableTree 1102efcc2a30SJung-uk Kim * 1103efcc2a30SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 1104efcc2a30SJung-uk Kim * 1105efcc2a30SJung-uk Kim * RETURN: None 1106efcc2a30SJung-uk Kim * 1107efcc2a30SJung-uk Kim * DESCRIPTION: Info - dump a subtable tree entry with extra information. 1108efcc2a30SJung-uk Kim * Tree - dump a subtable tree formatted by depth indentation. 1109efcc2a30SJung-uk Kim * 1110efcc2a30SJung-uk Kim *****************************************************************************/ 1111efcc2a30SJung-uk Kim 1112efcc2a30SJung-uk Kim static void 1113efcc2a30SJung-uk Kim DtDumpSubtableInfo ( 1114efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 1115efcc2a30SJung-uk Kim void *Context, 1116efcc2a30SJung-uk Kim void *ReturnValue) 1117efcc2a30SJung-uk Kim { 1118efcc2a30SJung-uk Kim 1119efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1120a371a5fdSJung-uk Kim "[%.04X] %24s %.08X %.08X %.08X %.08X %.08X %p %p %p\n", 1121a371a5fdSJung-uk Kim Subtable->Depth, Subtable->Name, Subtable->Length, Subtable->TotalLength, 1122efcc2a30SJung-uk Kim Subtable->SizeOfLengthField, Subtable->Flags, Subtable, 1123efcc2a30SJung-uk Kim Subtable->Parent, Subtable->Child, Subtable->Peer); 1124efcc2a30SJung-uk Kim } 1125efcc2a30SJung-uk Kim 1126efcc2a30SJung-uk Kim static void 1127efcc2a30SJung-uk Kim DtDumpSubtableTree ( 1128efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 1129efcc2a30SJung-uk Kim void *Context, 1130efcc2a30SJung-uk Kim void *ReturnValue) 1131efcc2a30SJung-uk Kim { 1132efcc2a30SJung-uk Kim 1133efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1134a371a5fdSJung-uk Kim "[%.04X] %24s %*s%08X (%.02X) - (%.02X)\n", 1135a371a5fdSJung-uk Kim Subtable->Depth, Subtable->Name, (4 * Subtable->Depth), " ", 1136efcc2a30SJung-uk Kim Subtable, Subtable->Length, Subtable->TotalLength); 1137efcc2a30SJung-uk Kim } 1138efcc2a30SJung-uk Kim 1139efcc2a30SJung-uk Kim 1140efcc2a30SJung-uk Kim /****************************************************************************** 1141efcc2a30SJung-uk Kim * 1142efcc2a30SJung-uk Kim * FUNCTION: DtDumpSubtableList 1143efcc2a30SJung-uk Kim * 1144efcc2a30SJung-uk Kim * PARAMETERS: None 1145efcc2a30SJung-uk Kim * 1146efcc2a30SJung-uk Kim * RETURN: None 1147efcc2a30SJung-uk Kim * 1148efcc2a30SJung-uk Kim * DESCRIPTION: Dump the raw list of subtables with information, and also 1149efcc2a30SJung-uk Kim * dump the subtable list in formatted tree format. Assists with 1150efcc2a30SJung-uk Kim * the development of new table code. 1151efcc2a30SJung-uk Kim * 1152efcc2a30SJung-uk Kim *****************************************************************************/ 1153efcc2a30SJung-uk Kim 1154efcc2a30SJung-uk Kim void 1155efcc2a30SJung-uk Kim DtDumpSubtableList ( 1156efcc2a30SJung-uk Kim void) 1157efcc2a30SJung-uk Kim { 1158efcc2a30SJung-uk Kim 11596f1f1a63SJung-uk Kim if (!AslGbl_DebugFlag || !AslGbl_RootTable) 1160efcc2a30SJung-uk Kim { 1161efcc2a30SJung-uk Kim return; 1162efcc2a30SJung-uk Kim } 1163efcc2a30SJung-uk Kim 1164efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1165efcc2a30SJung-uk Kim "Subtable Info:\n" 1166a371a5fdSJung-uk Kim "Depth Name Length TotalLen LenSize Flags " 1167efcc2a30SJung-uk Kim "This Parent Child Peer\n\n"); 11686f1f1a63SJung-uk Kim DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableInfo, NULL, NULL); 1169efcc2a30SJung-uk Kim 1170efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1171a371a5fdSJung-uk Kim "\nSubtable Tree: (Depth, Name, Subtable, Length, TotalLength)\n\n"); 11726f1f1a63SJung-uk Kim DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableTree, NULL, NULL); 1173313a0c13SJung-uk Kim 1174313a0c13SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "\n"); 1175efcc2a30SJung-uk Kim } 1176efcc2a30SJung-uk Kim 1177efcc2a30SJung-uk Kim 1178efcc2a30SJung-uk Kim /****************************************************************************** 1179efcc2a30SJung-uk Kim * 1180d244b227SJung-uk Kim * FUNCTION: DtWriteFieldToListing 1181d244b227SJung-uk Kim * 1182d244b227SJung-uk Kim * PARAMETERS: Buffer - Contains the compiled data 1183d244b227SJung-uk Kim * Field - Field node for the input line 1184d244b227SJung-uk Kim * Length - Length of the output data 1185d244b227SJung-uk Kim * 1186d244b227SJung-uk Kim * RETURN: None 1187d244b227SJung-uk Kim * 1188d244b227SJung-uk Kim * DESCRIPTION: Write one field to the listing file (if listing is enabled). 1189d244b227SJung-uk Kim * 1190d244b227SJung-uk Kim *****************************************************************************/ 1191d244b227SJung-uk Kim 1192d244b227SJung-uk Kim void 1193d244b227SJung-uk Kim DtWriteFieldToListing ( 1194d244b227SJung-uk Kim UINT8 *Buffer, 1195d244b227SJung-uk Kim DT_FIELD *Field, 1196d244b227SJung-uk Kim UINT32 Length) 1197d244b227SJung-uk Kim { 1198d244b227SJung-uk Kim UINT8 FileByte; 1199d244b227SJung-uk Kim 1200d244b227SJung-uk Kim 12016f1f1a63SJung-uk Kim if (!AslGbl_ListingFlag || !Field) 1202d244b227SJung-uk Kim { 1203d244b227SJung-uk Kim return; 1204d244b227SJung-uk Kim } 1205d244b227SJung-uk Kim 1206d244b227SJung-uk Kim /* Dump the original source line */ 1207d244b227SJung-uk Kim 1208d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input: "); 1209d244b227SJung-uk Kim FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset); 1210d244b227SJung-uk Kim 1211d244b227SJung-uk Kim while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK) 1212d244b227SJung-uk Kim { 1213d244b227SJung-uk Kim FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1); 1214d244b227SJung-uk Kim if (FileByte == '\n') 1215d244b227SJung-uk Kim { 1216d244b227SJung-uk Kim break; 1217d244b227SJung-uk Kim } 1218d244b227SJung-uk Kim } 1219d244b227SJung-uk Kim 1220d244b227SJung-uk Kim /* Dump the line as parsed and represented internally */ 1221d244b227SJung-uk Kim 1222d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s", 1223d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 1224d244b227SJung-uk Kim 1225d052a1ccSJung-uk Kim if (strlen (Field->Value) > 64) 1226d052a1ccSJung-uk Kim { 1227d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n", 1228d052a1ccSJung-uk Kim strlen (Field->Value)); 1229d052a1ccSJung-uk Kim } 1230f8146b88SJung-uk Kim 1231d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n"); 1232d052a1ccSJung-uk Kim 1233d244b227SJung-uk Kim /* Dump the hex data that will be output for this field */ 1234d244b227SJung-uk Kim 12350b94ba42SJung-uk Kim DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length); 1236d244b227SJung-uk Kim } 1237d244b227SJung-uk Kim 1238d244b227SJung-uk Kim 1239d244b227SJung-uk Kim /****************************************************************************** 1240d244b227SJung-uk Kim * 1241d244b227SJung-uk Kim * FUNCTION: DtWriteTableToListing 1242d244b227SJung-uk Kim * 1243d244b227SJung-uk Kim * PARAMETERS: None 1244d244b227SJung-uk Kim * 1245d244b227SJung-uk Kim * RETURN: None 1246d244b227SJung-uk Kim * 1247d244b227SJung-uk Kim * DESCRIPTION: Write the entire compiled table to the listing file 1248d244b227SJung-uk Kim * in hex format 1249d244b227SJung-uk Kim * 1250d244b227SJung-uk Kim *****************************************************************************/ 1251d244b227SJung-uk Kim 1252d244b227SJung-uk Kim void 1253d244b227SJung-uk Kim DtWriteTableToListing ( 1254d244b227SJung-uk Kim void) 1255d244b227SJung-uk Kim { 1256d244b227SJung-uk Kim UINT8 *Buffer; 1257d244b227SJung-uk Kim 1258d244b227SJung-uk Kim 12596f1f1a63SJung-uk Kim if (!AslGbl_ListingFlag) 1260d244b227SJung-uk Kim { 1261d244b227SJung-uk Kim return; 1262d244b227SJung-uk Kim } 1263d244b227SJung-uk Kim 1264d244b227SJung-uk Kim /* Read the entire table from the output file */ 1265d244b227SJung-uk Kim 12666f1f1a63SJung-uk Kim Buffer = UtLocalCalloc (AslGbl_TableLength); 1267d244b227SJung-uk Kim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 12686f1f1a63SJung-uk Kim FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, AslGbl_TableLength); 1269d244b227SJung-uk Kim 1270d244b227SJung-uk Kim /* Dump the raw table data */ 1271d244b227SJung-uk Kim 12726f1f1a63SJung-uk Kim AcpiOsRedirectOutput (AslGbl_Files[ASL_FILE_LISTING_OUTPUT].Handle); 1273d244b227SJung-uk Kim 1274d244b227SJung-uk Kim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 12756f1f1a63SJung-uk Kim ACPI_RAW_TABLE_DATA_HEADER, AslGbl_TableLength, AslGbl_TableLength); 12766f1f1a63SJung-uk Kim AcpiUtDumpBuffer (Buffer, AslGbl_TableLength, DB_BYTE_DISPLAY, 0); 1277d244b227SJung-uk Kim 1278d244b227SJung-uk Kim AcpiOsRedirectOutput (stdout); 12798d744e47SJung-uk Kim ACPI_FREE (Buffer); 1280d244b227SJung-uk Kim } 1281