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 7d244b227SJung-uk Kim /* 8ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a88e22b7SJung-uk Kim 44a88e22b7SJung-uk Kim #define __DTIO_C__ 45a88e22b7SJung-uk Kim 46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 47a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 48a88e22b7SJung-uk Kim 49a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 50a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtio") 51a88e22b7SJung-uk Kim 52a88e22b7SJung-uk Kim 53a88e22b7SJung-uk Kim /* Local prototypes */ 54a88e22b7SJung-uk Kim 55a88e22b7SJung-uk Kim static char * 56a88e22b7SJung-uk Kim DtTrim ( 57a88e22b7SJung-uk Kim char *String); 58a88e22b7SJung-uk Kim 59a88e22b7SJung-uk Kim static void 60a88e22b7SJung-uk Kim DtLinkField ( 61a88e22b7SJung-uk Kim DT_FIELD *Field); 62a88e22b7SJung-uk Kim 63d244b227SJung-uk Kim static ACPI_STATUS 64a88e22b7SJung-uk Kim DtParseLine ( 65a88e22b7SJung-uk Kim char *LineBuffer, 66a88e22b7SJung-uk Kim UINT32 Line, 67a88e22b7SJung-uk Kim UINT32 Offset); 68a88e22b7SJung-uk Kim 69a88e22b7SJung-uk Kim static void 70a88e22b7SJung-uk Kim DtWriteBinary ( 71a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 72a88e22b7SJung-uk Kim void *Context, 73a88e22b7SJung-uk Kim void *ReturnValue); 74a88e22b7SJung-uk Kim 75d244b227SJung-uk Kim static void 76d244b227SJung-uk Kim DtDumpBuffer ( 77d244b227SJung-uk Kim UINT32 FileId, 78d244b227SJung-uk Kim UINT8 *Buffer, 790b94ba42SJung-uk Kim UINT32 Offset, 80d244b227SJung-uk Kim UINT32 Length); 81a88e22b7SJung-uk Kim 820b94ba42SJung-uk Kim 83a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 84a88e22b7SJung-uk Kim 85a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 86a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 87a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 88a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 89a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 90a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 91d052a1ccSJung-uk Kim #define DT_MERGE_LINES 6 92eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE 7 93a88e22b7SJung-uk Kim 9442fecd12SJung-uk Kim static UINT32 Gbl_NextLineOffset; 95a88e22b7SJung-uk Kim 96a88e22b7SJung-uk Kim 97a88e22b7SJung-uk Kim /****************************************************************************** 98a88e22b7SJung-uk Kim * 99a88e22b7SJung-uk Kim * FUNCTION: DtTrim 100a88e22b7SJung-uk Kim * 101a88e22b7SJung-uk Kim * PARAMETERS: String - Current source code line to trim 102a88e22b7SJung-uk Kim * 103a88e22b7SJung-uk Kim * RETURN: Trimmed line. Must be freed by caller. 104a88e22b7SJung-uk Kim * 105a88e22b7SJung-uk Kim * DESCRIPTION: Trim left and right spaces 106a88e22b7SJung-uk Kim * 107a88e22b7SJung-uk Kim *****************************************************************************/ 108a88e22b7SJung-uk Kim 109a88e22b7SJung-uk Kim static char * 110a88e22b7SJung-uk Kim DtTrim ( 111a88e22b7SJung-uk Kim char *String) 112a88e22b7SJung-uk Kim { 113a88e22b7SJung-uk Kim char *Start; 114a88e22b7SJung-uk Kim char *End; 115a88e22b7SJung-uk Kim char *ReturnString; 116a88e22b7SJung-uk Kim ACPI_SIZE Length; 117a88e22b7SJung-uk Kim 118a88e22b7SJung-uk Kim 119a88e22b7SJung-uk Kim /* Skip lines that start with a space */ 120a88e22b7SJung-uk Kim 121a88e22b7SJung-uk Kim if (!ACPI_STRCMP (String, " ")) 122a88e22b7SJung-uk Kim { 123a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (1); 124a88e22b7SJung-uk Kim return (ReturnString); 125a88e22b7SJung-uk Kim } 126a88e22b7SJung-uk Kim 127a88e22b7SJung-uk Kim /* Setup pointers to start and end of input string */ 128a88e22b7SJung-uk Kim 129a88e22b7SJung-uk Kim Start = String; 130a88e22b7SJung-uk Kim End = String + ACPI_STRLEN (String) - 1; 131a88e22b7SJung-uk Kim 132a88e22b7SJung-uk Kim /* Find first non-whitespace character */ 133a88e22b7SJung-uk Kim 134a88e22b7SJung-uk Kim while ((Start <= End) && ((*Start == ' ') || (*Start == '\t'))) 135a88e22b7SJung-uk Kim { 136a88e22b7SJung-uk Kim Start++; 137a88e22b7SJung-uk Kim } 138a88e22b7SJung-uk Kim 139a88e22b7SJung-uk Kim /* Find last non-space character */ 140a88e22b7SJung-uk Kim 141a88e22b7SJung-uk Kim while (End >= Start) 142a88e22b7SJung-uk Kim { 143a88e22b7SJung-uk Kim if (*End == '\r' || *End == '\n') 144a88e22b7SJung-uk Kim { 145a88e22b7SJung-uk Kim End--; 146a88e22b7SJung-uk Kim continue; 147a88e22b7SJung-uk Kim } 148a88e22b7SJung-uk Kim 149a88e22b7SJung-uk Kim if (*End != ' ') 150a88e22b7SJung-uk Kim { 151a88e22b7SJung-uk Kim break; 152a88e22b7SJung-uk Kim } 153a88e22b7SJung-uk Kim 154a88e22b7SJung-uk Kim End--; 155a88e22b7SJung-uk Kim } 156a88e22b7SJung-uk Kim 157a88e22b7SJung-uk Kim /* Remove any quotes around the string */ 158a88e22b7SJung-uk Kim 159a88e22b7SJung-uk Kim if (*Start == '\"') 160a88e22b7SJung-uk Kim { 161a88e22b7SJung-uk Kim Start++; 162a88e22b7SJung-uk Kim } 163a88e22b7SJung-uk Kim if (*End == '\"') 164a88e22b7SJung-uk Kim { 165a88e22b7SJung-uk Kim End--; 166a88e22b7SJung-uk Kim } 167a88e22b7SJung-uk Kim 168a88e22b7SJung-uk Kim /* Create the trimmed return string */ 169a88e22b7SJung-uk Kim 170a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start) + 1; 171a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (Length + 1); 172a88e22b7SJung-uk Kim if (ACPI_STRLEN (Start)) 173a88e22b7SJung-uk Kim { 174a88e22b7SJung-uk Kim ACPI_STRNCPY (ReturnString, Start, Length); 175a88e22b7SJung-uk Kim } 176a88e22b7SJung-uk Kim 177a88e22b7SJung-uk Kim ReturnString[Length] = 0; 178a88e22b7SJung-uk Kim return (ReturnString); 179a88e22b7SJung-uk Kim } 180a88e22b7SJung-uk Kim 181a88e22b7SJung-uk Kim 182a88e22b7SJung-uk Kim /****************************************************************************** 183a88e22b7SJung-uk Kim * 184a88e22b7SJung-uk Kim * FUNCTION: DtLinkField 185a88e22b7SJung-uk Kim * 186a88e22b7SJung-uk Kim * PARAMETERS: Field - New field object to link 187a88e22b7SJung-uk Kim * 188a88e22b7SJung-uk Kim * RETURN: None 189a88e22b7SJung-uk Kim * 190a88e22b7SJung-uk Kim * DESCRIPTION: Link one field name and value to the list 191a88e22b7SJung-uk Kim * 192a88e22b7SJung-uk Kim *****************************************************************************/ 193a88e22b7SJung-uk Kim 194a88e22b7SJung-uk Kim static void 195a88e22b7SJung-uk Kim DtLinkField ( 196a88e22b7SJung-uk Kim DT_FIELD *Field) 197a88e22b7SJung-uk Kim { 198a88e22b7SJung-uk Kim DT_FIELD *Prev; 199a88e22b7SJung-uk Kim DT_FIELD *Next; 200a88e22b7SJung-uk Kim 201a88e22b7SJung-uk Kim 202a88e22b7SJung-uk Kim Prev = Next = Gbl_FieldList; 203a88e22b7SJung-uk Kim 204a88e22b7SJung-uk Kim while (Next) 205a88e22b7SJung-uk Kim { 206a88e22b7SJung-uk Kim Prev = Next; 207a88e22b7SJung-uk Kim Next = Next->Next; 208a88e22b7SJung-uk Kim } 209a88e22b7SJung-uk Kim 210a88e22b7SJung-uk Kim if (Prev) 211a88e22b7SJung-uk Kim { 212a88e22b7SJung-uk Kim Prev->Next = Field; 213a88e22b7SJung-uk Kim } 214a88e22b7SJung-uk Kim else 215a88e22b7SJung-uk Kim { 216a88e22b7SJung-uk Kim Gbl_FieldList = Field; 217a88e22b7SJung-uk Kim } 218a88e22b7SJung-uk Kim } 219a88e22b7SJung-uk Kim 220a88e22b7SJung-uk Kim 221a88e22b7SJung-uk Kim /****************************************************************************** 222a88e22b7SJung-uk Kim * 223a88e22b7SJung-uk Kim * FUNCTION: DtParseLine 224a88e22b7SJung-uk Kim * 225a88e22b7SJung-uk Kim * PARAMETERS: LineBuffer - Current source code line 226a88e22b7SJung-uk Kim * Line - Current line number in the source 227a88e22b7SJung-uk Kim * Offset - Current byte offset of the line 228a88e22b7SJung-uk Kim * 229d244b227SJung-uk Kim * RETURN: Status 230a88e22b7SJung-uk Kim * 231a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 232a88e22b7SJung-uk Kim * 233a88e22b7SJung-uk Kim *****************************************************************************/ 234a88e22b7SJung-uk Kim 235d244b227SJung-uk Kim static ACPI_STATUS 236a88e22b7SJung-uk Kim DtParseLine ( 237a88e22b7SJung-uk Kim char *LineBuffer, 238a88e22b7SJung-uk Kim UINT32 Line, 239a88e22b7SJung-uk Kim UINT32 Offset) 240a88e22b7SJung-uk Kim { 241a88e22b7SJung-uk Kim char *Start; 242a88e22b7SJung-uk Kim char *End; 243a88e22b7SJung-uk Kim char *TmpName; 244a88e22b7SJung-uk Kim char *TmpValue; 245a88e22b7SJung-uk Kim char *Name; 246a88e22b7SJung-uk Kim char *Value; 247a88e22b7SJung-uk Kim char *Colon; 248a88e22b7SJung-uk Kim UINT32 Length; 249a88e22b7SJung-uk Kim DT_FIELD *Field; 250a88e22b7SJung-uk Kim UINT32 Column; 251a88e22b7SJung-uk Kim UINT32 NameColumn; 252d052a1ccSJung-uk Kim BOOLEAN IsNullString = FALSE; 253a88e22b7SJung-uk Kim 254a88e22b7SJung-uk Kim 255a88e22b7SJung-uk Kim if (!LineBuffer) 256a88e22b7SJung-uk Kim { 257d244b227SJung-uk Kim return (AE_OK); 258d244b227SJung-uk Kim } 259d244b227SJung-uk Kim 260d244b227SJung-uk Kim /* All lines after "Raw Table Data" are ingored */ 261d244b227SJung-uk Kim 262d244b227SJung-uk Kim if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER)) 263d244b227SJung-uk Kim { 264d244b227SJung-uk Kim return (AE_NOT_FOUND); 265a88e22b7SJung-uk Kim } 266a88e22b7SJung-uk Kim 267a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 268d244b227SJung-uk Kim if (!Colon) 269a88e22b7SJung-uk Kim { 270d244b227SJung-uk Kim return (AE_OK); 271a88e22b7SJung-uk Kim } 272a88e22b7SJung-uk Kim 273a88e22b7SJung-uk Kim Start = LineBuffer; 274a88e22b7SJung-uk Kim End = Colon; 275a88e22b7SJung-uk Kim 276a88e22b7SJung-uk Kim while (Start < Colon) 277a88e22b7SJung-uk Kim { 278a88e22b7SJung-uk Kim if (*Start == ' ') 279a88e22b7SJung-uk Kim { 280a88e22b7SJung-uk Kim Start++; 281a88e22b7SJung-uk Kim continue; 282a88e22b7SJung-uk Kim } 283a88e22b7SJung-uk Kim 284a88e22b7SJung-uk Kim /* Found left bracket, go to the right bracket */ 285a88e22b7SJung-uk Kim 286a88e22b7SJung-uk Kim if (*Start == '[') 287a88e22b7SJung-uk Kim { 288a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 289a88e22b7SJung-uk Kim { 290a88e22b7SJung-uk Kim Start++; 291a88e22b7SJung-uk Kim } 292a88e22b7SJung-uk Kim 293a88e22b7SJung-uk Kim if (Start == Colon) 294a88e22b7SJung-uk Kim { 295a88e22b7SJung-uk Kim break; 296a88e22b7SJung-uk Kim } 297a88e22b7SJung-uk Kim 298a88e22b7SJung-uk Kim Start++; 299a88e22b7SJung-uk Kim continue; 300a88e22b7SJung-uk Kim } 301a88e22b7SJung-uk Kim 302a88e22b7SJung-uk Kim break; 303a88e22b7SJung-uk Kim } 304a88e22b7SJung-uk Kim 305a88e22b7SJung-uk Kim /* 306a88e22b7SJung-uk Kim * There are two column values. One for the field name, 307a88e22b7SJung-uk Kim * and one for the field value. 308a88e22b7SJung-uk Kim */ 309a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 310a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 311a88e22b7SJung-uk Kim 312a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 313a88e22b7SJung-uk Kim 314a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 315a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpName, Start, Length); 316a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 317a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 318a88e22b7SJung-uk Kim 319a88e22b7SJung-uk Kim Start = End = (Colon + 1); 320a88e22b7SJung-uk Kim while (*End) 321a88e22b7SJung-uk Kim { 322a88e22b7SJung-uk Kim /* Found left quotation, go to the right quotation and break */ 323a88e22b7SJung-uk Kim 324a88e22b7SJung-uk Kim if (*End == '"') 325a88e22b7SJung-uk Kim { 326a88e22b7SJung-uk Kim End++; 327d052a1ccSJung-uk Kim 328d052a1ccSJung-uk Kim /* Check for an explicit null string */ 329d052a1ccSJung-uk Kim 330d052a1ccSJung-uk Kim if (*End == '"') 331d052a1ccSJung-uk Kim { 332d052a1ccSJung-uk Kim IsNullString = TRUE; 333d052a1ccSJung-uk Kim } 3340b94ba42SJung-uk Kim while (*End && (*End != '"')) 335a88e22b7SJung-uk Kim { 336a88e22b7SJung-uk Kim End++; 337a88e22b7SJung-uk Kim } 338a88e22b7SJung-uk Kim 339a88e22b7SJung-uk Kim End++; 340a88e22b7SJung-uk Kim break; 341a88e22b7SJung-uk Kim } 342a88e22b7SJung-uk Kim 3430b94ba42SJung-uk Kim /* 3440b94ba42SJung-uk Kim * Special "comment" fields at line end, ignore them. 3450b94ba42SJung-uk Kim * Note: normal slash-slash and slash-asterisk comments are 3460b94ba42SJung-uk Kim * stripped already by the DtGetNextLine parser. 3470b94ba42SJung-uk Kim * 3480b94ba42SJung-uk Kim * TBD: Perhaps DtGetNextLine should parse the following type 3490b94ba42SJung-uk Kim * of comments also. 3500b94ba42SJung-uk Kim */ 351d052a1ccSJung-uk Kim if (*End == '[') 352a88e22b7SJung-uk Kim { 353d052a1ccSJung-uk Kim End--; 354a88e22b7SJung-uk Kim break; 355a88e22b7SJung-uk Kim } 356a88e22b7SJung-uk Kim End++; 357a88e22b7SJung-uk Kim } 358a88e22b7SJung-uk Kim 359a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 360a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 361dcbce41eSJung-uk Kim 362a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpValue, Start, Length); 363a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 364a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 365a88e22b7SJung-uk Kim 366d052a1ccSJung-uk Kim /* Create a new field object only if we have a valid value field */ 367d052a1ccSJung-uk Kim 368d052a1ccSJung-uk Kim if ((Value && *Value) || IsNullString) 369a88e22b7SJung-uk Kim { 370a88e22b7SJung-uk Kim Field = UtLocalCalloc (sizeof (DT_FIELD)); 371a88e22b7SJung-uk Kim Field->Name = Name; 372a88e22b7SJung-uk Kim Field->Value = Value; 373a88e22b7SJung-uk Kim Field->Line = Line; 374a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 375a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 376a88e22b7SJung-uk Kim Field->Column = Column; 377a88e22b7SJung-uk Kim 378a88e22b7SJung-uk Kim DtLinkField (Field); 379a88e22b7SJung-uk Kim } 380d052a1ccSJung-uk Kim else /* Ignore this field, it has no valid data */ 381dcbce41eSJung-uk Kim { 382dcbce41eSJung-uk Kim ACPI_FREE (Name); 383dcbce41eSJung-uk Kim ACPI_FREE (Value); 384dcbce41eSJung-uk Kim } 385d244b227SJung-uk Kim 386d244b227SJung-uk Kim return (AE_OK); 387a88e22b7SJung-uk Kim } 388a88e22b7SJung-uk Kim 389a88e22b7SJung-uk Kim 390a88e22b7SJung-uk Kim /****************************************************************************** 391a88e22b7SJung-uk Kim * 392a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 393a88e22b7SJung-uk Kim * 394a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 395a88e22b7SJung-uk Kim * 396d052a1ccSJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (ASL_EOF on EOF) 397a88e22b7SJung-uk Kim * 398a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 399a88e22b7SJung-uk Kim * Ignores empty lines. 400a88e22b7SJung-uk Kim * 401a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 402a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 403a88e22b7SJung-uk Kim * 404a88e22b7SJung-uk Kim * Line is returned in Gbl_CurrentLineBuffer. 405a88e22b7SJung-uk Kim * Line number in original file is returned in Gbl_CurrentLineNumber. 406a88e22b7SJung-uk Kim * 407a88e22b7SJung-uk Kim *****************************************************************************/ 408a88e22b7SJung-uk Kim 4090b94ba42SJung-uk Kim UINT32 410a88e22b7SJung-uk Kim DtGetNextLine ( 411a88e22b7SJung-uk Kim FILE *Handle) 412a88e22b7SJung-uk Kim { 413d052a1ccSJung-uk Kim BOOLEAN LineNotAllBlanks = FALSE; 414a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 415a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 416a88e22b7SJung-uk Kim UINT32 i; 417a88e22b7SJung-uk Kim char c; 418a88e22b7SJung-uk Kim 419a88e22b7SJung-uk Kim 420*042ff955SJung-uk Kim for (i = 0; ;) 421a88e22b7SJung-uk Kim { 422*042ff955SJung-uk Kim /* 423*042ff955SJung-uk Kim * If line is too long, expand the line buffers. Also increases 424*042ff955SJung-uk Kim * Gbl_LineBufferSize. 425*042ff955SJung-uk Kim */ 426*042ff955SJung-uk Kim if (i >= Gbl_LineBufferSize) 427*042ff955SJung-uk Kim { 428*042ff955SJung-uk Kim UtExpandLineBuffers (); 429*042ff955SJung-uk Kim } 430*042ff955SJung-uk Kim 431a88e22b7SJung-uk Kim c = (char) getc (Handle); 432a88e22b7SJung-uk Kim if (c == EOF) 433a88e22b7SJung-uk Kim { 4340b94ba42SJung-uk Kim switch (State) 4350b94ba42SJung-uk Kim { 4360b94ba42SJung-uk Kim case DT_START_QUOTED_STRING: 4370b94ba42SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 4380b94ba42SJung-uk Kim 4390b94ba42SJung-uk Kim AcpiOsPrintf ("**** EOF within comment/string %u\n", State); 4400b94ba42SJung-uk Kim break; 4410b94ba42SJung-uk Kim 4420b94ba42SJung-uk Kim default: 4430b94ba42SJung-uk Kim break; 4440b94ba42SJung-uk Kim } 4450b94ba42SJung-uk Kim 446a7a3b383SJung-uk Kim /* Standalone EOF is OK */ 447a7a3b383SJung-uk Kim 448a7a3b383SJung-uk Kim if (i == 0) 449a7a3b383SJung-uk Kim { 450d052a1ccSJung-uk Kim return (ASL_EOF); 451a88e22b7SJung-uk Kim } 452a88e22b7SJung-uk Kim 453a7a3b383SJung-uk Kim /* 454a7a3b383SJung-uk Kim * Received an EOF in the middle of a line. Terminate the 455a7a3b383SJung-uk Kim * line with a newline. The next call to this function will 456a7a3b383SJung-uk Kim * return a standalone EOF. Thus, the upper parsing software 457a7a3b383SJung-uk Kim * never has to deal with an EOF within a valid line (or 458a7a3b383SJung-uk Kim * the last line does not get tossed on the floor.) 459a7a3b383SJung-uk Kim */ 460a7a3b383SJung-uk Kim c = '\n'; 461a7a3b383SJung-uk Kim State = DT_NORMAL_TEXT; 462a7a3b383SJung-uk Kim } 463a7a3b383SJung-uk Kim 464a88e22b7SJung-uk Kim switch (State) 465a88e22b7SJung-uk Kim { 466a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 467a88e22b7SJung-uk Kim 468a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 469a88e22b7SJung-uk Kim 470a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 471a88e22b7SJung-uk Kim switch (c) 472a88e22b7SJung-uk Kim { 473a88e22b7SJung-uk Kim case '/': 474a88e22b7SJung-uk Kim State = DT_START_COMMENT; 475a88e22b7SJung-uk Kim break; 476a88e22b7SJung-uk Kim 477a88e22b7SJung-uk Kim case '"': 478a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 479d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 480a88e22b7SJung-uk Kim i++; 481a88e22b7SJung-uk Kim break; 482a88e22b7SJung-uk Kim 483d052a1ccSJung-uk Kim case '\\': 484d052a1ccSJung-uk Kim /* 485d052a1ccSJung-uk Kim * The continuation char MUST be last char on this line. 486d052a1ccSJung-uk Kim * Otherwise, it will be assumed to be a valid ASL char. 487d052a1ccSJung-uk Kim */ 488d052a1ccSJung-uk Kim State = DT_MERGE_LINES; 489d052a1ccSJung-uk Kim break; 490d052a1ccSJung-uk Kim 491a88e22b7SJung-uk Kim case '\n': 492a88e22b7SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 493a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 494a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 495a88e22b7SJung-uk Kim 496d052a1ccSJung-uk Kim /* 497d052a1ccSJung-uk Kim * Exit if line is complete. Ignore empty lines (only \n) 498d052a1ccSJung-uk Kim * or lines that contain nothing but blanks. 499d052a1ccSJung-uk Kim */ 500d052a1ccSJung-uk Kim if ((i != 0) && LineNotAllBlanks) 501a88e22b7SJung-uk Kim { 502*042ff955SJung-uk Kim if ((i + 1) >= Gbl_LineBufferSize) 503*042ff955SJung-uk Kim { 504*042ff955SJung-uk Kim UtExpandLineBuffers (); 505*042ff955SJung-uk Kim } 506*042ff955SJung-uk Kim 507d052a1ccSJung-uk Kim Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */ 508a88e22b7SJung-uk Kim return (CurrentLineOffset); 509a88e22b7SJung-uk Kim } 510d052a1ccSJung-uk Kim 511d052a1ccSJung-uk Kim /* Toss this line and start a new one */ 512d052a1ccSJung-uk Kim 513d052a1ccSJung-uk Kim i = 0; 514d052a1ccSJung-uk Kim LineNotAllBlanks = FALSE; 515a88e22b7SJung-uk Kim break; 516a88e22b7SJung-uk Kim 517a88e22b7SJung-uk Kim default: 518d052a1ccSJung-uk Kim if (c != ' ') 519d052a1ccSJung-uk Kim { 520d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 521d052a1ccSJung-uk Kim } 522d052a1ccSJung-uk Kim 523a88e22b7SJung-uk Kim i++; 524a88e22b7SJung-uk Kim break; 525a88e22b7SJung-uk Kim } 526a88e22b7SJung-uk Kim break; 527a88e22b7SJung-uk Kim 528a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 529a88e22b7SJung-uk Kim 530a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 531a88e22b7SJung-uk Kim 532a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 533a88e22b7SJung-uk Kim i++; 534a88e22b7SJung-uk Kim 535eef1b955SJung-uk Kim switch (c) 536a88e22b7SJung-uk Kim { 537eef1b955SJung-uk Kim case '"': 538a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 539eef1b955SJung-uk Kim break; 540eef1b955SJung-uk Kim 541eef1b955SJung-uk Kim case '\\': 542eef1b955SJung-uk Kim State = DT_ESCAPE_SEQUENCE; 543eef1b955SJung-uk Kim break; 544eef1b955SJung-uk Kim 545eef1b955SJung-uk Kim case '\n': 546eef1b955SJung-uk Kim AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n", 547eef1b955SJung-uk Kim Gbl_CurrentLineNumber++); 548eef1b955SJung-uk Kim State = DT_NORMAL_TEXT; 549eef1b955SJung-uk Kim break; 550eef1b955SJung-uk Kim 551eef1b955SJung-uk Kim default: /* Get next character */ 552eef1b955SJung-uk Kim break; 553a88e22b7SJung-uk Kim } 554a88e22b7SJung-uk Kim break; 555a88e22b7SJung-uk Kim 556eef1b955SJung-uk Kim case DT_ESCAPE_SEQUENCE: 557eef1b955SJung-uk Kim 558eef1b955SJung-uk Kim /* Just copy the escaped character. TBD: sufficient for table compiler? */ 559eef1b955SJung-uk Kim 560eef1b955SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 561eef1b955SJung-uk Kim i++; 562eef1b955SJung-uk Kim State = DT_START_QUOTED_STRING; 563eef1b955SJung-uk Kim break; 564eef1b955SJung-uk Kim 565a88e22b7SJung-uk Kim case DT_START_COMMENT: 566a88e22b7SJung-uk Kim 567a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 568a88e22b7SJung-uk Kim 569a88e22b7SJung-uk Kim switch (c) 570a88e22b7SJung-uk Kim { 571a88e22b7SJung-uk Kim case '*': 572a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 573a88e22b7SJung-uk Kim break; 574a88e22b7SJung-uk Kim 575a88e22b7SJung-uk Kim case '/': 576a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 577a88e22b7SJung-uk Kim break; 578a88e22b7SJung-uk Kim 579a88e22b7SJung-uk Kim default: /* Not a comment */ 580a88e22b7SJung-uk Kim i++; /* Save the preceeding slash */ 581*042ff955SJung-uk Kim if (i >= Gbl_LineBufferSize) 582*042ff955SJung-uk Kim { 583*042ff955SJung-uk Kim UtExpandLineBuffers (); 584*042ff955SJung-uk Kim } 585*042ff955SJung-uk Kim 586a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 587a88e22b7SJung-uk Kim i++; 588a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 589a88e22b7SJung-uk Kim break; 590a88e22b7SJung-uk Kim } 591a88e22b7SJung-uk Kim break; 592a88e22b7SJung-uk Kim 593a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 594a88e22b7SJung-uk Kim 595a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 596a88e22b7SJung-uk Kim 597a88e22b7SJung-uk Kim switch (c) 598a88e22b7SJung-uk Kim { 599a88e22b7SJung-uk Kim case '\n': 600a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 601a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 602a88e22b7SJung-uk Kim break; 603a88e22b7SJung-uk Kim 604a88e22b7SJung-uk Kim case '*': 605a88e22b7SJung-uk Kim State = DT_END_COMMENT; 606a88e22b7SJung-uk Kim break; 607a88e22b7SJung-uk Kim 608a88e22b7SJung-uk Kim default: 609a88e22b7SJung-uk Kim break; 610a88e22b7SJung-uk Kim } 611a88e22b7SJung-uk Kim break; 612a88e22b7SJung-uk Kim 613a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 614a88e22b7SJung-uk Kim 615a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 616a88e22b7SJung-uk Kim 617a88e22b7SJung-uk Kim if (c == '\n') 618a88e22b7SJung-uk Kim { 619a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 620a88e22b7SJung-uk Kim 621a88e22b7SJung-uk Kim ungetc (c, Handle); 622a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 623a88e22b7SJung-uk Kim } 624a88e22b7SJung-uk Kim break; 625a88e22b7SJung-uk Kim 626a88e22b7SJung-uk Kim case DT_END_COMMENT: 627a88e22b7SJung-uk Kim 628a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 629a88e22b7SJung-uk Kim 630a88e22b7SJung-uk Kim switch (c) 631a88e22b7SJung-uk Kim { 632a88e22b7SJung-uk Kim case '/': 633a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 634a88e22b7SJung-uk Kim break; 635a88e22b7SJung-uk Kim 6360b94ba42SJung-uk Kim case '\n': 6370b94ba42SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 6380b94ba42SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 6390b94ba42SJung-uk Kim Gbl_CurrentLineNumber++; 6400b94ba42SJung-uk Kim break; 6410b94ba42SJung-uk Kim 6420b94ba42SJung-uk Kim case '*': 6430b94ba42SJung-uk Kim /* Consume all adjacent asterisks */ 6440b94ba42SJung-uk Kim break; 6450b94ba42SJung-uk Kim 646a88e22b7SJung-uk Kim default: 647a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 648a88e22b7SJung-uk Kim break; 649a88e22b7SJung-uk Kim } 650a88e22b7SJung-uk Kim break; 651a88e22b7SJung-uk Kim 652d052a1ccSJung-uk Kim case DT_MERGE_LINES: 653d052a1ccSJung-uk Kim 654d052a1ccSJung-uk Kim if (c != '\n') 655d052a1ccSJung-uk Kim { 656d052a1ccSJung-uk Kim /* 657d052a1ccSJung-uk Kim * This is not a continuation backslash, it is a normal 658d052a1ccSJung-uk Kim * normal ASL backslash - for example: Scope(\_SB_) 659d052a1ccSJung-uk Kim */ 660d052a1ccSJung-uk Kim i++; /* Keep the backslash that is already in the buffer */ 661d052a1ccSJung-uk Kim 662d052a1ccSJung-uk Kim ungetc (c, Handle); 663d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 664d052a1ccSJung-uk Kim } 665d052a1ccSJung-uk Kim else 666d052a1ccSJung-uk Kim { 667d052a1ccSJung-uk Kim /* 668d052a1ccSJung-uk Kim * This is a continuation line -- a backlash followed 669d052a1ccSJung-uk Kim * immediately by a newline. Insert a space between the 670d052a1ccSJung-uk Kim * lines (overwrite the backslash) 671d052a1ccSJung-uk Kim */ 672d052a1ccSJung-uk Kim Gbl_CurrentLineBuffer[i] = ' '; 673d052a1ccSJung-uk Kim i++; 674d052a1ccSJung-uk Kim 675d052a1ccSJung-uk Kim /* Ignore newline, this will merge the lines */ 676d052a1ccSJung-uk Kim 677d052a1ccSJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 678d052a1ccSJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 679d052a1ccSJung-uk Kim Gbl_CurrentLineNumber++; 680d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 681d052a1ccSJung-uk Kim } 682d052a1ccSJung-uk Kim break; 683d052a1ccSJung-uk Kim 684a88e22b7SJung-uk Kim default: 685a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 686d052a1ccSJung-uk Kim return (ASL_EOF); 687a88e22b7SJung-uk Kim } 688a88e22b7SJung-uk Kim } 689a88e22b7SJung-uk Kim } 690a88e22b7SJung-uk Kim 691a88e22b7SJung-uk Kim 692a88e22b7SJung-uk Kim /****************************************************************************** 693a88e22b7SJung-uk Kim * 694a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 695a88e22b7SJung-uk Kim * 696a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 697a88e22b7SJung-uk Kim * 698a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 699a88e22b7SJung-uk Kim * 700a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 701a88e22b7SJung-uk Kim * to the global parse tree: Gbl_FieldList 702a88e22b7SJung-uk Kim * 703a88e22b7SJung-uk Kim *****************************************************************************/ 704a88e22b7SJung-uk Kim 705a88e22b7SJung-uk Kim DT_FIELD * 706a88e22b7SJung-uk Kim DtScanFile ( 707a88e22b7SJung-uk Kim FILE *Handle) 708a88e22b7SJung-uk Kim { 709d244b227SJung-uk Kim ACPI_STATUS Status; 710a88e22b7SJung-uk Kim UINT32 Offset; 711d052a1ccSJung-uk Kim DT_FIELD *Next; 712a88e22b7SJung-uk Kim 713a88e22b7SJung-uk Kim 714a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 715a88e22b7SJung-uk Kim 716a88e22b7SJung-uk Kim 717a88e22b7SJung-uk Kim /* Get the file size */ 718a88e22b7SJung-uk Kim 719a88e22b7SJung-uk Kim Gbl_InputByteCount = DtGetFileSize (Handle); 720a88e22b7SJung-uk Kim 721a88e22b7SJung-uk Kim Gbl_CurrentLineNumber = 0; 722a88e22b7SJung-uk Kim Gbl_CurrentLineOffset = 0; 723a88e22b7SJung-uk Kim Gbl_NextLineOffset = 0; 724a88e22b7SJung-uk Kim 725a88e22b7SJung-uk Kim /* Scan line-by-line */ 726a88e22b7SJung-uk Kim 727d052a1ccSJung-uk Kim while ((Offset = DtGetNextLine (Handle)) != ASL_EOF) 728a88e22b7SJung-uk Kim { 729a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 730a88e22b7SJung-uk Kim Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer)); 731a88e22b7SJung-uk Kim 732d244b227SJung-uk Kim Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset); 733d244b227SJung-uk Kim if (Status == AE_NOT_FOUND) 734d244b227SJung-uk Kim { 735d244b227SJung-uk Kim break; 736d244b227SJung-uk Kim } 737a88e22b7SJung-uk Kim } 738a88e22b7SJung-uk Kim 739d052a1ccSJung-uk Kim /* Dump the parse tree if debug enabled */ 740d052a1ccSJung-uk Kim 741d052a1ccSJung-uk Kim if (Gbl_DebugFlag) 742d052a1ccSJung-uk Kim { 743d052a1ccSJung-uk Kim Next = Gbl_FieldList; 744d052a1ccSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Tree: %32s %32s %8s %8s %8s %8s %8s %8s\n\n", 745d052a1ccSJung-uk Kim "Name", "Value", "Line", "ByteOff", "NameCol", "Column", "TableOff", "Flags"); 746d052a1ccSJung-uk Kim 747d052a1ccSJung-uk Kim while (Next) 748d052a1ccSJung-uk Kim { 749d052a1ccSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Field: %32.32s %32.32s %.8X %.8X %.8X %.8X %.8X %.8X\n", 750d052a1ccSJung-uk Kim Next->Name, 751d052a1ccSJung-uk Kim Next->Value, 752d052a1ccSJung-uk Kim Next->Line, 753d052a1ccSJung-uk Kim Next->ByteOffset, 754d052a1ccSJung-uk Kim Next->NameColumn, 755d052a1ccSJung-uk Kim Next->Column, 756d052a1ccSJung-uk Kim Next->TableOffset, 757d052a1ccSJung-uk Kim Next->Flags); 758d052a1ccSJung-uk Kim 759d052a1ccSJung-uk Kim Next = Next->Next; 760d052a1ccSJung-uk Kim } 761d052a1ccSJung-uk Kim } 762d052a1ccSJung-uk Kim 763a88e22b7SJung-uk Kim return (Gbl_FieldList); 764a88e22b7SJung-uk Kim } 765a88e22b7SJung-uk Kim 766a88e22b7SJung-uk Kim 767a88e22b7SJung-uk Kim /* 768a88e22b7SJung-uk Kim * Output functions 769a88e22b7SJung-uk Kim */ 770a88e22b7SJung-uk Kim 771a88e22b7SJung-uk Kim /****************************************************************************** 772a88e22b7SJung-uk Kim * 773a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 774a88e22b7SJung-uk Kim * 775a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 776a88e22b7SJung-uk Kim * 777a88e22b7SJung-uk Kim * RETURN: Status 778a88e22b7SJung-uk Kim * 779a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 780a88e22b7SJung-uk Kim * 781a88e22b7SJung-uk Kim *****************************************************************************/ 782a88e22b7SJung-uk Kim 783a88e22b7SJung-uk Kim static void 784a88e22b7SJung-uk Kim DtWriteBinary ( 785a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 786a88e22b7SJung-uk Kim void *Context, 787a88e22b7SJung-uk Kim void *ReturnValue) 788a88e22b7SJung-uk Kim { 789a88e22b7SJung-uk Kim 790a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 791a88e22b7SJung-uk Kim } 792a88e22b7SJung-uk Kim 793a88e22b7SJung-uk Kim 794a88e22b7SJung-uk Kim /****************************************************************************** 795a88e22b7SJung-uk Kim * 796a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 797a88e22b7SJung-uk Kim * 798a88e22b7SJung-uk Kim * PARAMETERS: 799a88e22b7SJung-uk Kim * 800a88e22b7SJung-uk Kim * RETURN: Status 801a88e22b7SJung-uk Kim * 802a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 803a88e22b7SJung-uk Kim * 804a88e22b7SJung-uk Kim *****************************************************************************/ 805a88e22b7SJung-uk Kim 806a88e22b7SJung-uk Kim void 807a88e22b7SJung-uk Kim DtOutputBinary ( 808a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 809a88e22b7SJung-uk Kim { 810a88e22b7SJung-uk Kim 811a88e22b7SJung-uk Kim if (!RootTable) 812a88e22b7SJung-uk Kim { 813a88e22b7SJung-uk Kim return; 814a88e22b7SJung-uk Kim } 815a88e22b7SJung-uk Kim 816a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 817a88e22b7SJung-uk Kim 818a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 819a88e22b7SJung-uk Kim Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 820a88e22b7SJung-uk Kim } 821d244b227SJung-uk Kim 822d244b227SJung-uk Kim 823d244b227SJung-uk Kim /* 824d244b227SJung-uk Kim * Listing support 825d244b227SJung-uk Kim */ 826d244b227SJung-uk Kim 827d244b227SJung-uk Kim /****************************************************************************** 828d244b227SJung-uk Kim * 829d244b227SJung-uk Kim * FUNCTION: DtDumpBuffer 830d244b227SJung-uk Kim * 831d244b227SJung-uk Kim * PARAMETERS: FileID - Where to write buffer data 832d244b227SJung-uk Kim * Buffer - Buffer to dump 8330b94ba42SJung-uk Kim * Offset - Offset in current table 834d244b227SJung-uk Kim * Length - Buffer Length 835d244b227SJung-uk Kim * 836d244b227SJung-uk Kim * RETURN: None 837d244b227SJung-uk Kim * 838d244b227SJung-uk Kim * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately). 839d244b227SJung-uk Kim * 840d244b227SJung-uk Kim * TBD: merge dump buffer routines 841d244b227SJung-uk Kim * 842d244b227SJung-uk Kim *****************************************************************************/ 843d244b227SJung-uk Kim 844d244b227SJung-uk Kim static void 845d244b227SJung-uk Kim DtDumpBuffer ( 846d244b227SJung-uk Kim UINT32 FileId, 847d244b227SJung-uk Kim UINT8 *Buffer, 8480b94ba42SJung-uk Kim UINT32 Offset, 849d244b227SJung-uk Kim UINT32 Length) 850d244b227SJung-uk Kim { 851d244b227SJung-uk Kim UINT32 i; 852d244b227SJung-uk Kim UINT32 j; 853d244b227SJung-uk Kim UINT8 BufChar; 854d244b227SJung-uk Kim 855d244b227SJung-uk Kim 8560b94ba42SJung-uk Kim FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ", 8570b94ba42SJung-uk Kim Offset, Offset, Length); 8580b94ba42SJung-uk Kim 859d244b227SJung-uk Kim i = 0; 860d244b227SJung-uk Kim while (i < Length) 861d244b227SJung-uk Kim { 8620b94ba42SJung-uk Kim if (i >= 16) 8630b94ba42SJung-uk Kim { 864d052a1ccSJung-uk Kim FlPrintFile (FileId, "%24s", ""); 8650b94ba42SJung-uk Kim } 866d244b227SJung-uk Kim 8670b94ba42SJung-uk Kim /* Print 16 hex chars */ 868d244b227SJung-uk Kim 869d244b227SJung-uk Kim for (j = 0; j < 16;) 870d244b227SJung-uk Kim { 871d244b227SJung-uk Kim if (i + j >= Length) 872d244b227SJung-uk Kim { 873d244b227SJung-uk Kim /* Dump fill spaces */ 874d244b227SJung-uk Kim 875d244b227SJung-uk Kim FlPrintFile (FileId, " "); 876d244b227SJung-uk Kim j++; 877d244b227SJung-uk Kim continue; 878d244b227SJung-uk Kim } 879d244b227SJung-uk Kim 880d244b227SJung-uk Kim FlPrintFile (FileId, "%02X ", Buffer[i+j]); 881d244b227SJung-uk Kim j++; 882d244b227SJung-uk Kim } 883d244b227SJung-uk Kim 884d244b227SJung-uk Kim FlPrintFile (FileId, " "); 885d244b227SJung-uk Kim for (j = 0; j < 16; j++) 886d244b227SJung-uk Kim { 887d244b227SJung-uk Kim if (i + j >= Length) 888d244b227SJung-uk Kim { 889d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 890d244b227SJung-uk Kim return; 891d244b227SJung-uk Kim } 892d244b227SJung-uk Kim 893d244b227SJung-uk Kim BufChar = Buffer[(ACPI_SIZE) i + j]; 894d244b227SJung-uk Kim if (ACPI_IS_PRINT (BufChar)) 895d244b227SJung-uk Kim { 896d244b227SJung-uk Kim FlPrintFile (FileId, "%c", BufChar); 897d244b227SJung-uk Kim } 898d244b227SJung-uk Kim else 899d244b227SJung-uk Kim { 900d244b227SJung-uk Kim FlPrintFile (FileId, "."); 901d244b227SJung-uk Kim } 902d244b227SJung-uk Kim } 903d244b227SJung-uk Kim 904d244b227SJung-uk Kim /* Done with that line. */ 905d244b227SJung-uk Kim 906d244b227SJung-uk Kim FlPrintFile (FileId, "\n"); 907d244b227SJung-uk Kim i += 16; 908d244b227SJung-uk Kim } 909d244b227SJung-uk Kim 910d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 911d244b227SJung-uk Kim } 912d244b227SJung-uk Kim 913d244b227SJung-uk Kim 914d244b227SJung-uk Kim /****************************************************************************** 915d244b227SJung-uk Kim * 916d244b227SJung-uk Kim * FUNCTION: DtWriteFieldToListing 917d244b227SJung-uk Kim * 918d244b227SJung-uk Kim * PARAMETERS: Buffer - Contains the compiled data 919d244b227SJung-uk Kim * Field - Field node for the input line 920d244b227SJung-uk Kim * Length - Length of the output data 921d244b227SJung-uk Kim * 922d244b227SJung-uk Kim * RETURN: None 923d244b227SJung-uk Kim * 924d244b227SJung-uk Kim * DESCRIPTION: Write one field to the listing file (if listing is enabled). 925d244b227SJung-uk Kim * 926d244b227SJung-uk Kim *****************************************************************************/ 927d244b227SJung-uk Kim 928d244b227SJung-uk Kim void 929d244b227SJung-uk Kim DtWriteFieldToListing ( 930d244b227SJung-uk Kim UINT8 *Buffer, 931d244b227SJung-uk Kim DT_FIELD *Field, 932d244b227SJung-uk Kim UINT32 Length) 933d244b227SJung-uk Kim { 934d244b227SJung-uk Kim UINT8 FileByte; 935d244b227SJung-uk Kim 936d244b227SJung-uk Kim 937d244b227SJung-uk Kim if (!Gbl_ListingFlag || !Field) 938d244b227SJung-uk Kim { 939d244b227SJung-uk Kim return; 940d244b227SJung-uk Kim } 941d244b227SJung-uk Kim 942d244b227SJung-uk Kim /* Dump the original source line */ 943d244b227SJung-uk Kim 944d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input: "); 945d244b227SJung-uk Kim FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset); 946d244b227SJung-uk Kim 947d244b227SJung-uk Kim while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK) 948d244b227SJung-uk Kim { 949d244b227SJung-uk Kim FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1); 950d244b227SJung-uk Kim if (FileByte == '\n') 951d244b227SJung-uk Kim { 952d244b227SJung-uk Kim break; 953d244b227SJung-uk Kim } 954d244b227SJung-uk Kim } 955d244b227SJung-uk Kim 956d244b227SJung-uk Kim /* Dump the line as parsed and represented internally */ 957d244b227SJung-uk Kim 958d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s", 959d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 960d244b227SJung-uk Kim 961d052a1ccSJung-uk Kim if (strlen (Field->Value) > 64) 962d052a1ccSJung-uk Kim { 963d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n", 964d052a1ccSJung-uk Kim strlen (Field->Value)); 965d052a1ccSJung-uk Kim } 966d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n"); 967d052a1ccSJung-uk Kim 968d244b227SJung-uk Kim /* Dump the hex data that will be output for this field */ 969d244b227SJung-uk Kim 9700b94ba42SJung-uk Kim DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length); 971d244b227SJung-uk Kim } 972d244b227SJung-uk Kim 973d244b227SJung-uk Kim 974d244b227SJung-uk Kim /****************************************************************************** 975d244b227SJung-uk Kim * 976d244b227SJung-uk Kim * FUNCTION: DtWriteTableToListing 977d244b227SJung-uk Kim * 978d244b227SJung-uk Kim * PARAMETERS: None 979d244b227SJung-uk Kim * 980d244b227SJung-uk Kim * RETURN: None 981d244b227SJung-uk Kim * 982d244b227SJung-uk Kim * DESCRIPTION: Write the entire compiled table to the listing file 983d244b227SJung-uk Kim * in hex format 984d244b227SJung-uk Kim * 985d244b227SJung-uk Kim *****************************************************************************/ 986d244b227SJung-uk Kim 987d244b227SJung-uk Kim void 988d244b227SJung-uk Kim DtWriteTableToListing ( 989d244b227SJung-uk Kim void) 990d244b227SJung-uk Kim { 991d244b227SJung-uk Kim UINT8 *Buffer; 992d244b227SJung-uk Kim 993d244b227SJung-uk Kim 994d244b227SJung-uk Kim if (!Gbl_ListingFlag) 995d244b227SJung-uk Kim { 996d244b227SJung-uk Kim return; 997d244b227SJung-uk Kim } 998d244b227SJung-uk Kim 999d244b227SJung-uk Kim /* Read the entire table from the output file */ 1000d244b227SJung-uk Kim 1001d244b227SJung-uk Kim Buffer = UtLocalCalloc (Gbl_TableLength); 1002d244b227SJung-uk Kim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 1003d244b227SJung-uk Kim FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength); 1004d244b227SJung-uk Kim 1005d244b227SJung-uk Kim /* Dump the raw table data */ 1006d244b227SJung-uk Kim 1007d244b227SJung-uk Kim AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle); 1008d244b227SJung-uk Kim 1009d244b227SJung-uk Kim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 1010d244b227SJung-uk Kim ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength); 1011d244b227SJung-uk Kim AcpiUtDumpBuffer2 (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY); 1012d244b227SJung-uk Kim 1013d244b227SJung-uk Kim AcpiOsRedirectOutput (stdout); 1014d244b227SJung-uk Kim } 1015