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 /* 8*efcc2a30SJung-uk Kim * Copyright (C) 2000 - 2013, 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 82*efcc2a30SJung-uk Kim static void 83*efcc2a30SJung-uk Kim DtDumpSubtableInfo ( 84*efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 85*efcc2a30SJung-uk Kim void *Context, 86*efcc2a30SJung-uk Kim void *ReturnValue); 87*efcc2a30SJung-uk Kim 88*efcc2a30SJung-uk Kim static void 89*efcc2a30SJung-uk Kim DtDumpSubtableTree ( 90*efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 91*efcc2a30SJung-uk Kim void *Context, 92*efcc2a30SJung-uk Kim void *ReturnValue); 93*efcc2a30SJung-uk Kim 940b94ba42SJung-uk Kim 95a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 96a88e22b7SJung-uk Kim 97a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 98a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 99a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 100a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 101a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 102a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 103d052a1ccSJung-uk Kim #define DT_MERGE_LINES 6 104eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE 7 105a88e22b7SJung-uk Kim 10642fecd12SJung-uk Kim static UINT32 Gbl_NextLineOffset; 107a88e22b7SJung-uk Kim 108a88e22b7SJung-uk Kim 109a88e22b7SJung-uk Kim /****************************************************************************** 110a88e22b7SJung-uk Kim * 111a88e22b7SJung-uk Kim * FUNCTION: DtTrim 112a88e22b7SJung-uk Kim * 113a88e22b7SJung-uk Kim * PARAMETERS: String - Current source code line to trim 114a88e22b7SJung-uk Kim * 115a88e22b7SJung-uk Kim * RETURN: Trimmed line. Must be freed by caller. 116a88e22b7SJung-uk Kim * 117a88e22b7SJung-uk Kim * DESCRIPTION: Trim left and right spaces 118a88e22b7SJung-uk Kim * 119a88e22b7SJung-uk Kim *****************************************************************************/ 120a88e22b7SJung-uk Kim 121a88e22b7SJung-uk Kim static char * 122a88e22b7SJung-uk Kim DtTrim ( 123a88e22b7SJung-uk Kim char *String) 124a88e22b7SJung-uk Kim { 125a88e22b7SJung-uk Kim char *Start; 126a88e22b7SJung-uk Kim char *End; 127a88e22b7SJung-uk Kim char *ReturnString; 128a88e22b7SJung-uk Kim ACPI_SIZE Length; 129a88e22b7SJung-uk Kim 130a88e22b7SJung-uk Kim 131a88e22b7SJung-uk Kim /* Skip lines that start with a space */ 132a88e22b7SJung-uk Kim 133a88e22b7SJung-uk Kim if (!ACPI_STRCMP (String, " ")) 134a88e22b7SJung-uk Kim { 135a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (1); 136a88e22b7SJung-uk Kim return (ReturnString); 137a88e22b7SJung-uk Kim } 138a88e22b7SJung-uk Kim 139a88e22b7SJung-uk Kim /* Setup pointers to start and end of input string */ 140a88e22b7SJung-uk Kim 141a88e22b7SJung-uk Kim Start = String; 142a88e22b7SJung-uk Kim End = String + ACPI_STRLEN (String) - 1; 143a88e22b7SJung-uk Kim 144a88e22b7SJung-uk Kim /* Find first non-whitespace character */ 145a88e22b7SJung-uk Kim 146a88e22b7SJung-uk Kim while ((Start <= End) && ((*Start == ' ') || (*Start == '\t'))) 147a88e22b7SJung-uk Kim { 148a88e22b7SJung-uk Kim Start++; 149a88e22b7SJung-uk Kim } 150a88e22b7SJung-uk Kim 151a88e22b7SJung-uk Kim /* Find last non-space character */ 152a88e22b7SJung-uk Kim 153a88e22b7SJung-uk Kim while (End >= Start) 154a88e22b7SJung-uk Kim { 155a88e22b7SJung-uk Kim if (*End == '\r' || *End == '\n') 156a88e22b7SJung-uk Kim { 157a88e22b7SJung-uk Kim End--; 158a88e22b7SJung-uk Kim continue; 159a88e22b7SJung-uk Kim } 160a88e22b7SJung-uk Kim 161a88e22b7SJung-uk Kim if (*End != ' ') 162a88e22b7SJung-uk Kim { 163a88e22b7SJung-uk Kim break; 164a88e22b7SJung-uk Kim } 165a88e22b7SJung-uk Kim 166a88e22b7SJung-uk Kim End--; 167a88e22b7SJung-uk Kim } 168a88e22b7SJung-uk Kim 169a88e22b7SJung-uk Kim /* Remove any quotes around the string */ 170a88e22b7SJung-uk Kim 171a88e22b7SJung-uk Kim if (*Start == '\"') 172a88e22b7SJung-uk Kim { 173a88e22b7SJung-uk Kim Start++; 174a88e22b7SJung-uk Kim } 175a88e22b7SJung-uk Kim if (*End == '\"') 176a88e22b7SJung-uk Kim { 177a88e22b7SJung-uk Kim End--; 178a88e22b7SJung-uk Kim } 179a88e22b7SJung-uk Kim 180a88e22b7SJung-uk Kim /* Create the trimmed return string */ 181a88e22b7SJung-uk Kim 182a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start) + 1; 183a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (Length + 1); 184a88e22b7SJung-uk Kim if (ACPI_STRLEN (Start)) 185a88e22b7SJung-uk Kim { 186a88e22b7SJung-uk Kim ACPI_STRNCPY (ReturnString, Start, Length); 187a88e22b7SJung-uk Kim } 188a88e22b7SJung-uk Kim 189a88e22b7SJung-uk Kim ReturnString[Length] = 0; 190a88e22b7SJung-uk Kim return (ReturnString); 191a88e22b7SJung-uk Kim } 192a88e22b7SJung-uk Kim 193a88e22b7SJung-uk Kim 194a88e22b7SJung-uk Kim /****************************************************************************** 195a88e22b7SJung-uk Kim * 196a88e22b7SJung-uk Kim * FUNCTION: DtLinkField 197a88e22b7SJung-uk Kim * 198a88e22b7SJung-uk Kim * PARAMETERS: Field - New field object to link 199a88e22b7SJung-uk Kim * 200a88e22b7SJung-uk Kim * RETURN: None 201a88e22b7SJung-uk Kim * 202a88e22b7SJung-uk Kim * DESCRIPTION: Link one field name and value to the list 203a88e22b7SJung-uk Kim * 204a88e22b7SJung-uk Kim *****************************************************************************/ 205a88e22b7SJung-uk Kim 206a88e22b7SJung-uk Kim static void 207a88e22b7SJung-uk Kim DtLinkField ( 208a88e22b7SJung-uk Kim DT_FIELD *Field) 209a88e22b7SJung-uk Kim { 210a88e22b7SJung-uk Kim DT_FIELD *Prev; 211a88e22b7SJung-uk Kim DT_FIELD *Next; 212a88e22b7SJung-uk Kim 213a88e22b7SJung-uk Kim 214a88e22b7SJung-uk Kim Prev = Next = Gbl_FieldList; 215a88e22b7SJung-uk Kim 216a88e22b7SJung-uk Kim while (Next) 217a88e22b7SJung-uk Kim { 218a88e22b7SJung-uk Kim Prev = Next; 219a88e22b7SJung-uk Kim Next = Next->Next; 220a88e22b7SJung-uk Kim } 221a88e22b7SJung-uk Kim 222a88e22b7SJung-uk Kim if (Prev) 223a88e22b7SJung-uk Kim { 224a88e22b7SJung-uk Kim Prev->Next = Field; 225a88e22b7SJung-uk Kim } 226a88e22b7SJung-uk Kim else 227a88e22b7SJung-uk Kim { 228a88e22b7SJung-uk Kim Gbl_FieldList = Field; 229a88e22b7SJung-uk Kim } 230a88e22b7SJung-uk Kim } 231a88e22b7SJung-uk Kim 232a88e22b7SJung-uk Kim 233a88e22b7SJung-uk Kim /****************************************************************************** 234a88e22b7SJung-uk Kim * 235a88e22b7SJung-uk Kim * FUNCTION: DtParseLine 236a88e22b7SJung-uk Kim * 237a88e22b7SJung-uk Kim * PARAMETERS: LineBuffer - Current source code line 238a88e22b7SJung-uk Kim * Line - Current line number in the source 239a88e22b7SJung-uk Kim * Offset - Current byte offset of the line 240a88e22b7SJung-uk Kim * 241d244b227SJung-uk Kim * RETURN: Status 242a88e22b7SJung-uk Kim * 243a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 244a88e22b7SJung-uk Kim * 245a88e22b7SJung-uk Kim *****************************************************************************/ 246a88e22b7SJung-uk Kim 247d244b227SJung-uk Kim static ACPI_STATUS 248a88e22b7SJung-uk Kim DtParseLine ( 249a88e22b7SJung-uk Kim char *LineBuffer, 250a88e22b7SJung-uk Kim UINT32 Line, 251a88e22b7SJung-uk Kim UINT32 Offset) 252a88e22b7SJung-uk Kim { 253a88e22b7SJung-uk Kim char *Start; 254a88e22b7SJung-uk Kim char *End; 255a88e22b7SJung-uk Kim char *TmpName; 256a88e22b7SJung-uk Kim char *TmpValue; 257a88e22b7SJung-uk Kim char *Name; 258a88e22b7SJung-uk Kim char *Value; 259a88e22b7SJung-uk Kim char *Colon; 260a88e22b7SJung-uk Kim UINT32 Length; 261a88e22b7SJung-uk Kim DT_FIELD *Field; 262a88e22b7SJung-uk Kim UINT32 Column; 263a88e22b7SJung-uk Kim UINT32 NameColumn; 264d052a1ccSJung-uk Kim BOOLEAN IsNullString = FALSE; 265a88e22b7SJung-uk Kim 266a88e22b7SJung-uk Kim 267a88e22b7SJung-uk Kim if (!LineBuffer) 268a88e22b7SJung-uk Kim { 269d244b227SJung-uk Kim return (AE_OK); 270d244b227SJung-uk Kim } 271d244b227SJung-uk Kim 272d244b227SJung-uk Kim /* All lines after "Raw Table Data" are ingored */ 273d244b227SJung-uk Kim 274d244b227SJung-uk Kim if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER)) 275d244b227SJung-uk Kim { 276d244b227SJung-uk Kim return (AE_NOT_FOUND); 277a88e22b7SJung-uk Kim } 278a88e22b7SJung-uk Kim 279a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 280d244b227SJung-uk Kim if (!Colon) 281a88e22b7SJung-uk Kim { 282d244b227SJung-uk Kim return (AE_OK); 283a88e22b7SJung-uk Kim } 284a88e22b7SJung-uk Kim 285a88e22b7SJung-uk Kim Start = LineBuffer; 286a88e22b7SJung-uk Kim End = Colon; 287a88e22b7SJung-uk Kim 288a88e22b7SJung-uk Kim while (Start < Colon) 289a88e22b7SJung-uk Kim { 290a88e22b7SJung-uk Kim if (*Start == ' ') 291a88e22b7SJung-uk Kim { 292a88e22b7SJung-uk Kim Start++; 293a88e22b7SJung-uk Kim continue; 294a88e22b7SJung-uk Kim } 295a88e22b7SJung-uk Kim 296a88e22b7SJung-uk Kim /* Found left bracket, go to the right bracket */ 297a88e22b7SJung-uk Kim 298a88e22b7SJung-uk Kim if (*Start == '[') 299a88e22b7SJung-uk Kim { 300a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 301a88e22b7SJung-uk Kim { 302a88e22b7SJung-uk Kim Start++; 303a88e22b7SJung-uk Kim } 304a88e22b7SJung-uk Kim 305a88e22b7SJung-uk Kim if (Start == Colon) 306a88e22b7SJung-uk Kim { 307a88e22b7SJung-uk Kim break; 308a88e22b7SJung-uk Kim } 309a88e22b7SJung-uk Kim 310a88e22b7SJung-uk Kim Start++; 311a88e22b7SJung-uk Kim continue; 312a88e22b7SJung-uk Kim } 313a88e22b7SJung-uk Kim 314a88e22b7SJung-uk Kim break; 315a88e22b7SJung-uk Kim } 316a88e22b7SJung-uk Kim 317a88e22b7SJung-uk Kim /* 318a88e22b7SJung-uk Kim * There are two column values. One for the field name, 319a88e22b7SJung-uk Kim * and one for the field value. 320a88e22b7SJung-uk Kim */ 321a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 322a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 323a88e22b7SJung-uk Kim 324a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 325a88e22b7SJung-uk Kim 326a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 327a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpName, Start, Length); 328a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 329a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 330a88e22b7SJung-uk Kim 331a88e22b7SJung-uk Kim Start = End = (Colon + 1); 332a88e22b7SJung-uk Kim while (*End) 333a88e22b7SJung-uk Kim { 334a88e22b7SJung-uk Kim /* Found left quotation, go to the right quotation and break */ 335a88e22b7SJung-uk Kim 336a88e22b7SJung-uk Kim if (*End == '"') 337a88e22b7SJung-uk Kim { 338a88e22b7SJung-uk Kim End++; 339d052a1ccSJung-uk Kim 340d052a1ccSJung-uk Kim /* Check for an explicit null string */ 341d052a1ccSJung-uk Kim 342d052a1ccSJung-uk Kim if (*End == '"') 343d052a1ccSJung-uk Kim { 344d052a1ccSJung-uk Kim IsNullString = TRUE; 345d052a1ccSJung-uk Kim } 3460b94ba42SJung-uk Kim while (*End && (*End != '"')) 347a88e22b7SJung-uk Kim { 348a88e22b7SJung-uk Kim End++; 349a88e22b7SJung-uk Kim } 350a88e22b7SJung-uk Kim 351a88e22b7SJung-uk Kim End++; 352a88e22b7SJung-uk Kim break; 353a88e22b7SJung-uk Kim } 354a88e22b7SJung-uk Kim 3550b94ba42SJung-uk Kim /* 3560b94ba42SJung-uk Kim * Special "comment" fields at line end, ignore them. 3570b94ba42SJung-uk Kim * Note: normal slash-slash and slash-asterisk comments are 3580b94ba42SJung-uk Kim * stripped already by the DtGetNextLine parser. 3590b94ba42SJung-uk Kim * 3600b94ba42SJung-uk Kim * TBD: Perhaps DtGetNextLine should parse the following type 3610b94ba42SJung-uk Kim * of comments also. 3620b94ba42SJung-uk Kim */ 363d052a1ccSJung-uk Kim if (*End == '[') 364a88e22b7SJung-uk Kim { 365d052a1ccSJung-uk Kim End--; 366a88e22b7SJung-uk Kim break; 367a88e22b7SJung-uk Kim } 368a88e22b7SJung-uk Kim End++; 369a88e22b7SJung-uk Kim } 370a88e22b7SJung-uk Kim 371a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 372a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 373dcbce41eSJung-uk Kim 374a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpValue, Start, Length); 375a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 376a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 377a88e22b7SJung-uk Kim 378d052a1ccSJung-uk Kim /* Create a new field object only if we have a valid value field */ 379d052a1ccSJung-uk Kim 380d052a1ccSJung-uk Kim if ((Value && *Value) || IsNullString) 381a88e22b7SJung-uk Kim { 382a88e22b7SJung-uk Kim Field = UtLocalCalloc (sizeof (DT_FIELD)); 383a88e22b7SJung-uk Kim Field->Name = Name; 384a88e22b7SJung-uk Kim Field->Value = Value; 385a88e22b7SJung-uk Kim Field->Line = Line; 386a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 387a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 388a88e22b7SJung-uk Kim Field->Column = Column; 389a88e22b7SJung-uk Kim 390a88e22b7SJung-uk Kim DtLinkField (Field); 391a88e22b7SJung-uk Kim } 392d052a1ccSJung-uk Kim else /* Ignore this field, it has no valid data */ 393dcbce41eSJung-uk Kim { 394dcbce41eSJung-uk Kim ACPI_FREE (Name); 395dcbce41eSJung-uk Kim ACPI_FREE (Value); 396dcbce41eSJung-uk Kim } 397d244b227SJung-uk Kim 398d244b227SJung-uk Kim return (AE_OK); 399a88e22b7SJung-uk Kim } 400a88e22b7SJung-uk Kim 401a88e22b7SJung-uk Kim 402a88e22b7SJung-uk Kim /****************************************************************************** 403a88e22b7SJung-uk Kim * 404a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 405a88e22b7SJung-uk Kim * 406a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 407a88e22b7SJung-uk Kim * 408d052a1ccSJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (ASL_EOF on EOF) 409a88e22b7SJung-uk Kim * 410a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 411a88e22b7SJung-uk Kim * Ignores empty lines. 412a88e22b7SJung-uk Kim * 413a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 414a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 415a88e22b7SJung-uk Kim * 416a88e22b7SJung-uk Kim * Line is returned in Gbl_CurrentLineBuffer. 417a88e22b7SJung-uk Kim * Line number in original file is returned in Gbl_CurrentLineNumber. 418a88e22b7SJung-uk Kim * 419a88e22b7SJung-uk Kim *****************************************************************************/ 420a88e22b7SJung-uk Kim 4210b94ba42SJung-uk Kim UINT32 422a88e22b7SJung-uk Kim DtGetNextLine ( 423a88e22b7SJung-uk Kim FILE *Handle) 424a88e22b7SJung-uk Kim { 425d052a1ccSJung-uk Kim BOOLEAN LineNotAllBlanks = FALSE; 426a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 427a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 428a88e22b7SJung-uk Kim UINT32 i; 429a88e22b7SJung-uk Kim char c; 430a88e22b7SJung-uk Kim 431a88e22b7SJung-uk Kim 432042ff955SJung-uk Kim for (i = 0; ;) 433a88e22b7SJung-uk Kim { 434042ff955SJung-uk Kim /* 435042ff955SJung-uk Kim * If line is too long, expand the line buffers. Also increases 436042ff955SJung-uk Kim * Gbl_LineBufferSize. 437042ff955SJung-uk Kim */ 438042ff955SJung-uk Kim if (i >= Gbl_LineBufferSize) 439042ff955SJung-uk Kim { 440042ff955SJung-uk Kim UtExpandLineBuffers (); 441042ff955SJung-uk Kim } 442042ff955SJung-uk Kim 443a88e22b7SJung-uk Kim c = (char) getc (Handle); 444a88e22b7SJung-uk Kim if (c == EOF) 445a88e22b7SJung-uk Kim { 4460b94ba42SJung-uk Kim switch (State) 4470b94ba42SJung-uk Kim { 4480b94ba42SJung-uk Kim case DT_START_QUOTED_STRING: 4490b94ba42SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 4500b94ba42SJung-uk Kim 4510b94ba42SJung-uk Kim AcpiOsPrintf ("**** EOF within comment/string %u\n", State); 4520b94ba42SJung-uk Kim break; 4530b94ba42SJung-uk Kim 4540b94ba42SJung-uk Kim default: 4550b94ba42SJung-uk Kim break; 4560b94ba42SJung-uk Kim } 4570b94ba42SJung-uk Kim 458a7a3b383SJung-uk Kim /* Standalone EOF is OK */ 459a7a3b383SJung-uk Kim 460a7a3b383SJung-uk Kim if (i == 0) 461a7a3b383SJung-uk Kim { 462d052a1ccSJung-uk Kim return (ASL_EOF); 463a88e22b7SJung-uk Kim } 464a88e22b7SJung-uk Kim 465a7a3b383SJung-uk Kim /* 466a7a3b383SJung-uk Kim * Received an EOF in the middle of a line. Terminate the 467a7a3b383SJung-uk Kim * line with a newline. The next call to this function will 468a7a3b383SJung-uk Kim * return a standalone EOF. Thus, the upper parsing software 469a7a3b383SJung-uk Kim * never has to deal with an EOF within a valid line (or 470a7a3b383SJung-uk Kim * the last line does not get tossed on the floor.) 471a7a3b383SJung-uk Kim */ 472a7a3b383SJung-uk Kim c = '\n'; 473a7a3b383SJung-uk Kim State = DT_NORMAL_TEXT; 474a7a3b383SJung-uk Kim } 475a7a3b383SJung-uk Kim 476a88e22b7SJung-uk Kim switch (State) 477a88e22b7SJung-uk Kim { 478a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 479a88e22b7SJung-uk Kim 480a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 481a88e22b7SJung-uk Kim 482a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 483a88e22b7SJung-uk Kim switch (c) 484a88e22b7SJung-uk Kim { 485a88e22b7SJung-uk Kim case '/': 486a88e22b7SJung-uk Kim State = DT_START_COMMENT; 487a88e22b7SJung-uk Kim break; 488a88e22b7SJung-uk Kim 489a88e22b7SJung-uk Kim case '"': 490a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 491d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 492a88e22b7SJung-uk Kim i++; 493a88e22b7SJung-uk Kim break; 494a88e22b7SJung-uk Kim 495d052a1ccSJung-uk Kim case '\\': 496d052a1ccSJung-uk Kim /* 497d052a1ccSJung-uk Kim * The continuation char MUST be last char on this line. 498d052a1ccSJung-uk Kim * Otherwise, it will be assumed to be a valid ASL char. 499d052a1ccSJung-uk Kim */ 500d052a1ccSJung-uk Kim State = DT_MERGE_LINES; 501d052a1ccSJung-uk Kim break; 502d052a1ccSJung-uk Kim 503a88e22b7SJung-uk Kim case '\n': 504a88e22b7SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 505a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 506a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 507a88e22b7SJung-uk Kim 508d052a1ccSJung-uk Kim /* 509d052a1ccSJung-uk Kim * Exit if line is complete. Ignore empty lines (only \n) 510d052a1ccSJung-uk Kim * or lines that contain nothing but blanks. 511d052a1ccSJung-uk Kim */ 512d052a1ccSJung-uk Kim if ((i != 0) && LineNotAllBlanks) 513a88e22b7SJung-uk Kim { 514042ff955SJung-uk Kim if ((i + 1) >= Gbl_LineBufferSize) 515042ff955SJung-uk Kim { 516042ff955SJung-uk Kim UtExpandLineBuffers (); 517042ff955SJung-uk Kim } 518042ff955SJung-uk Kim 519d052a1ccSJung-uk Kim Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */ 520a88e22b7SJung-uk Kim return (CurrentLineOffset); 521a88e22b7SJung-uk Kim } 522d052a1ccSJung-uk Kim 523d052a1ccSJung-uk Kim /* Toss this line and start a new one */ 524d052a1ccSJung-uk Kim 525d052a1ccSJung-uk Kim i = 0; 526d052a1ccSJung-uk Kim LineNotAllBlanks = FALSE; 527a88e22b7SJung-uk Kim break; 528a88e22b7SJung-uk Kim 529a88e22b7SJung-uk Kim default: 530d052a1ccSJung-uk Kim if (c != ' ') 531d052a1ccSJung-uk Kim { 532d052a1ccSJung-uk Kim LineNotAllBlanks = TRUE; 533d052a1ccSJung-uk Kim } 534d052a1ccSJung-uk Kim 535a88e22b7SJung-uk Kim i++; 536a88e22b7SJung-uk Kim break; 537a88e22b7SJung-uk Kim } 538a88e22b7SJung-uk Kim break; 539a88e22b7SJung-uk Kim 540a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 541a88e22b7SJung-uk Kim 542a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 543a88e22b7SJung-uk Kim 544a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 545a88e22b7SJung-uk Kim i++; 546a88e22b7SJung-uk Kim 547eef1b955SJung-uk Kim switch (c) 548a88e22b7SJung-uk Kim { 549eef1b955SJung-uk Kim case '"': 550a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 551eef1b955SJung-uk Kim break; 552eef1b955SJung-uk Kim 553eef1b955SJung-uk Kim case '\\': 554eef1b955SJung-uk Kim State = DT_ESCAPE_SEQUENCE; 555eef1b955SJung-uk Kim break; 556eef1b955SJung-uk Kim 557eef1b955SJung-uk Kim case '\n': 558eef1b955SJung-uk Kim AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n", 559eef1b955SJung-uk Kim Gbl_CurrentLineNumber++); 560eef1b955SJung-uk Kim State = DT_NORMAL_TEXT; 561eef1b955SJung-uk Kim break; 562eef1b955SJung-uk Kim 563eef1b955SJung-uk Kim default: /* Get next character */ 564eef1b955SJung-uk Kim break; 565a88e22b7SJung-uk Kim } 566a88e22b7SJung-uk Kim break; 567a88e22b7SJung-uk Kim 568eef1b955SJung-uk Kim case DT_ESCAPE_SEQUENCE: 569eef1b955SJung-uk Kim 570eef1b955SJung-uk Kim /* Just copy the escaped character. TBD: sufficient for table compiler? */ 571eef1b955SJung-uk Kim 572eef1b955SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 573eef1b955SJung-uk Kim i++; 574eef1b955SJung-uk Kim State = DT_START_QUOTED_STRING; 575eef1b955SJung-uk Kim break; 576eef1b955SJung-uk Kim 577a88e22b7SJung-uk Kim case DT_START_COMMENT: 578a88e22b7SJung-uk Kim 579a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 580a88e22b7SJung-uk Kim 581a88e22b7SJung-uk Kim switch (c) 582a88e22b7SJung-uk Kim { 583a88e22b7SJung-uk Kim case '*': 584a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 585a88e22b7SJung-uk Kim break; 586a88e22b7SJung-uk Kim 587a88e22b7SJung-uk Kim case '/': 588a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 589a88e22b7SJung-uk Kim break; 590a88e22b7SJung-uk Kim 591a88e22b7SJung-uk Kim default: /* Not a comment */ 5928ef1a331SJung-uk Kim i++; /* Save the preceding slash */ 593042ff955SJung-uk Kim if (i >= Gbl_LineBufferSize) 594042ff955SJung-uk Kim { 595042ff955SJung-uk Kim UtExpandLineBuffers (); 596042ff955SJung-uk Kim } 597042ff955SJung-uk Kim 598a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 599a88e22b7SJung-uk Kim i++; 600a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 601a88e22b7SJung-uk Kim break; 602a88e22b7SJung-uk Kim } 603a88e22b7SJung-uk Kim break; 604a88e22b7SJung-uk Kim 605a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 606a88e22b7SJung-uk Kim 607a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 608a88e22b7SJung-uk Kim 609a88e22b7SJung-uk Kim switch (c) 610a88e22b7SJung-uk Kim { 611a88e22b7SJung-uk Kim case '\n': 612a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 613a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 614a88e22b7SJung-uk Kim break; 615a88e22b7SJung-uk Kim 616a88e22b7SJung-uk Kim case '*': 617a88e22b7SJung-uk Kim State = DT_END_COMMENT; 618a88e22b7SJung-uk Kim break; 619a88e22b7SJung-uk Kim 620a88e22b7SJung-uk Kim default: 621a88e22b7SJung-uk Kim break; 622a88e22b7SJung-uk Kim } 623a88e22b7SJung-uk Kim break; 624a88e22b7SJung-uk Kim 625a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 626a88e22b7SJung-uk Kim 627a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 628a88e22b7SJung-uk Kim 629a88e22b7SJung-uk Kim if (c == '\n') 630a88e22b7SJung-uk Kim { 631a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 632a88e22b7SJung-uk Kim 633a88e22b7SJung-uk Kim ungetc (c, Handle); 634a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 635a88e22b7SJung-uk Kim } 636a88e22b7SJung-uk Kim break; 637a88e22b7SJung-uk Kim 638a88e22b7SJung-uk Kim case DT_END_COMMENT: 639a88e22b7SJung-uk Kim 640a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 641a88e22b7SJung-uk Kim 642a88e22b7SJung-uk Kim switch (c) 643a88e22b7SJung-uk Kim { 644a88e22b7SJung-uk Kim case '/': 645a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 646a88e22b7SJung-uk Kim break; 647a88e22b7SJung-uk Kim 6480b94ba42SJung-uk Kim case '\n': 6490b94ba42SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 6500b94ba42SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 6510b94ba42SJung-uk Kim Gbl_CurrentLineNumber++; 6520b94ba42SJung-uk Kim break; 6530b94ba42SJung-uk Kim 6540b94ba42SJung-uk Kim case '*': 6550b94ba42SJung-uk Kim /* Consume all adjacent asterisks */ 6560b94ba42SJung-uk Kim break; 6570b94ba42SJung-uk Kim 658a88e22b7SJung-uk Kim default: 659a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 660a88e22b7SJung-uk Kim break; 661a88e22b7SJung-uk Kim } 662a88e22b7SJung-uk Kim break; 663a88e22b7SJung-uk Kim 664d052a1ccSJung-uk Kim case DT_MERGE_LINES: 665d052a1ccSJung-uk Kim 666d052a1ccSJung-uk Kim if (c != '\n') 667d052a1ccSJung-uk Kim { 668d052a1ccSJung-uk Kim /* 669d052a1ccSJung-uk Kim * This is not a continuation backslash, it is a normal 670d052a1ccSJung-uk Kim * normal ASL backslash - for example: Scope(\_SB_) 671d052a1ccSJung-uk Kim */ 672d052a1ccSJung-uk Kim i++; /* Keep the backslash that is already in the buffer */ 673d052a1ccSJung-uk Kim 674d052a1ccSJung-uk Kim ungetc (c, Handle); 675d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 676d052a1ccSJung-uk Kim } 677d052a1ccSJung-uk Kim else 678d052a1ccSJung-uk Kim { 679d052a1ccSJung-uk Kim /* 680d052a1ccSJung-uk Kim * This is a continuation line -- a backlash followed 681d052a1ccSJung-uk Kim * immediately by a newline. Insert a space between the 682d052a1ccSJung-uk Kim * lines (overwrite the backslash) 683d052a1ccSJung-uk Kim */ 684d052a1ccSJung-uk Kim Gbl_CurrentLineBuffer[i] = ' '; 685d052a1ccSJung-uk Kim i++; 686d052a1ccSJung-uk Kim 687d052a1ccSJung-uk Kim /* Ignore newline, this will merge the lines */ 688d052a1ccSJung-uk Kim 689d052a1ccSJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 690d052a1ccSJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 691d052a1ccSJung-uk Kim Gbl_CurrentLineNumber++; 692d052a1ccSJung-uk Kim State = DT_NORMAL_TEXT; 693d052a1ccSJung-uk Kim } 694d052a1ccSJung-uk Kim break; 695d052a1ccSJung-uk Kim 696a88e22b7SJung-uk Kim default: 697a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 698d052a1ccSJung-uk Kim return (ASL_EOF); 699a88e22b7SJung-uk Kim } 700a88e22b7SJung-uk Kim } 701a88e22b7SJung-uk Kim } 702a88e22b7SJung-uk Kim 703a88e22b7SJung-uk Kim 704a88e22b7SJung-uk Kim /****************************************************************************** 705a88e22b7SJung-uk Kim * 706a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 707a88e22b7SJung-uk Kim * 708a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 709a88e22b7SJung-uk Kim * 710a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 711a88e22b7SJung-uk Kim * 712a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 713a88e22b7SJung-uk Kim * to the global parse tree: Gbl_FieldList 714a88e22b7SJung-uk Kim * 715a88e22b7SJung-uk Kim *****************************************************************************/ 716a88e22b7SJung-uk Kim 717a88e22b7SJung-uk Kim DT_FIELD * 718a88e22b7SJung-uk Kim DtScanFile ( 719a88e22b7SJung-uk Kim FILE *Handle) 720a88e22b7SJung-uk Kim { 721d244b227SJung-uk Kim ACPI_STATUS Status; 722a88e22b7SJung-uk Kim UINT32 Offset; 723a88e22b7SJung-uk Kim 724a88e22b7SJung-uk Kim 725a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 726a88e22b7SJung-uk Kim 727a88e22b7SJung-uk Kim 728a88e22b7SJung-uk Kim /* Get the file size */ 729a88e22b7SJung-uk Kim 730a88e22b7SJung-uk Kim Gbl_InputByteCount = DtGetFileSize (Handle); 731a88e22b7SJung-uk Kim 732a88e22b7SJung-uk Kim Gbl_CurrentLineNumber = 0; 733a88e22b7SJung-uk Kim Gbl_CurrentLineOffset = 0; 734a88e22b7SJung-uk Kim Gbl_NextLineOffset = 0; 735a88e22b7SJung-uk Kim 736a88e22b7SJung-uk Kim /* Scan line-by-line */ 737a88e22b7SJung-uk Kim 738d052a1ccSJung-uk Kim while ((Offset = DtGetNextLine (Handle)) != ASL_EOF) 739a88e22b7SJung-uk Kim { 740a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 741a88e22b7SJung-uk Kim Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer)); 742a88e22b7SJung-uk Kim 743d244b227SJung-uk Kim Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset); 744d244b227SJung-uk Kim if (Status == AE_NOT_FOUND) 745d244b227SJung-uk Kim { 746d244b227SJung-uk Kim break; 747d244b227SJung-uk Kim } 748a88e22b7SJung-uk Kim } 749a88e22b7SJung-uk Kim 750d052a1ccSJung-uk Kim /* Dump the parse tree if debug enabled */ 751d052a1ccSJung-uk Kim 752*efcc2a30SJung-uk Kim DtDumpFieldList (Gbl_FieldList); 753a88e22b7SJung-uk Kim return (Gbl_FieldList); 754a88e22b7SJung-uk Kim } 755a88e22b7SJung-uk Kim 756a88e22b7SJung-uk Kim 757a88e22b7SJung-uk Kim /* 758a88e22b7SJung-uk Kim * Output functions 759a88e22b7SJung-uk Kim */ 760a88e22b7SJung-uk Kim 761a88e22b7SJung-uk Kim /****************************************************************************** 762a88e22b7SJung-uk Kim * 763a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 764a88e22b7SJung-uk Kim * 765a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 766a88e22b7SJung-uk Kim * 767a88e22b7SJung-uk Kim * RETURN: Status 768a88e22b7SJung-uk Kim * 769a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 770a88e22b7SJung-uk Kim * 771a88e22b7SJung-uk Kim *****************************************************************************/ 772a88e22b7SJung-uk Kim 773a88e22b7SJung-uk Kim static void 774a88e22b7SJung-uk Kim DtWriteBinary ( 775a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 776a88e22b7SJung-uk Kim void *Context, 777a88e22b7SJung-uk Kim void *ReturnValue) 778a88e22b7SJung-uk Kim { 779a88e22b7SJung-uk Kim 780a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 781a88e22b7SJung-uk Kim } 782a88e22b7SJung-uk Kim 783a88e22b7SJung-uk Kim 784a88e22b7SJung-uk Kim /****************************************************************************** 785a88e22b7SJung-uk Kim * 786a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 787a88e22b7SJung-uk Kim * 788a88e22b7SJung-uk Kim * PARAMETERS: 789a88e22b7SJung-uk Kim * 790a88e22b7SJung-uk Kim * RETURN: Status 791a88e22b7SJung-uk Kim * 792a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 793a88e22b7SJung-uk Kim * 794a88e22b7SJung-uk Kim *****************************************************************************/ 795a88e22b7SJung-uk Kim 796a88e22b7SJung-uk Kim void 797a88e22b7SJung-uk Kim DtOutputBinary ( 798a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 799a88e22b7SJung-uk Kim { 800a88e22b7SJung-uk Kim 801a88e22b7SJung-uk Kim if (!RootTable) 802a88e22b7SJung-uk Kim { 803a88e22b7SJung-uk Kim return; 804a88e22b7SJung-uk Kim } 805a88e22b7SJung-uk Kim 806a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 807a88e22b7SJung-uk Kim 808a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 809a88e22b7SJung-uk Kim Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 810a88e22b7SJung-uk Kim } 811d244b227SJung-uk Kim 812d244b227SJung-uk Kim 813d244b227SJung-uk Kim /* 814d244b227SJung-uk Kim * Listing support 815d244b227SJung-uk Kim */ 816d244b227SJung-uk Kim 817d244b227SJung-uk Kim /****************************************************************************** 818d244b227SJung-uk Kim * 819d244b227SJung-uk Kim * FUNCTION: DtDumpBuffer 820d244b227SJung-uk Kim * 821d244b227SJung-uk Kim * PARAMETERS: FileID - Where to write buffer data 822d244b227SJung-uk Kim * Buffer - Buffer to dump 8230b94ba42SJung-uk Kim * Offset - Offset in current table 824d244b227SJung-uk Kim * Length - Buffer Length 825d244b227SJung-uk Kim * 826d244b227SJung-uk Kim * RETURN: None 827d244b227SJung-uk Kim * 828d244b227SJung-uk Kim * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately). 829d244b227SJung-uk Kim * 830d244b227SJung-uk Kim * TBD: merge dump buffer routines 831d244b227SJung-uk Kim * 832d244b227SJung-uk Kim *****************************************************************************/ 833d244b227SJung-uk Kim 834d244b227SJung-uk Kim static void 835d244b227SJung-uk Kim DtDumpBuffer ( 836d244b227SJung-uk Kim UINT32 FileId, 837d244b227SJung-uk Kim UINT8 *Buffer, 8380b94ba42SJung-uk Kim UINT32 Offset, 839d244b227SJung-uk Kim UINT32 Length) 840d244b227SJung-uk Kim { 841d244b227SJung-uk Kim UINT32 i; 842d244b227SJung-uk Kim UINT32 j; 843d244b227SJung-uk Kim UINT8 BufChar; 844d244b227SJung-uk Kim 845d244b227SJung-uk Kim 8460b94ba42SJung-uk Kim FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ", 8470b94ba42SJung-uk Kim Offset, Offset, Length); 8480b94ba42SJung-uk Kim 849d244b227SJung-uk Kim i = 0; 850d244b227SJung-uk Kim while (i < Length) 851d244b227SJung-uk Kim { 8520b94ba42SJung-uk Kim if (i >= 16) 8530b94ba42SJung-uk Kim { 854d052a1ccSJung-uk Kim FlPrintFile (FileId, "%24s", ""); 8550b94ba42SJung-uk Kim } 856d244b227SJung-uk Kim 8570b94ba42SJung-uk Kim /* Print 16 hex chars */ 858d244b227SJung-uk Kim 859d244b227SJung-uk Kim for (j = 0; j < 16;) 860d244b227SJung-uk Kim { 861d244b227SJung-uk Kim if (i + j >= Length) 862d244b227SJung-uk Kim { 863d244b227SJung-uk Kim /* Dump fill spaces */ 864d244b227SJung-uk Kim 865d244b227SJung-uk Kim FlPrintFile (FileId, " "); 866d244b227SJung-uk Kim j++; 867d244b227SJung-uk Kim continue; 868d244b227SJung-uk Kim } 869d244b227SJung-uk Kim 870d244b227SJung-uk Kim FlPrintFile (FileId, "%02X ", Buffer[i+j]); 871d244b227SJung-uk Kim j++; 872d244b227SJung-uk Kim } 873d244b227SJung-uk Kim 874d244b227SJung-uk Kim FlPrintFile (FileId, " "); 875d244b227SJung-uk Kim for (j = 0; j < 16; j++) 876d244b227SJung-uk Kim { 877d244b227SJung-uk Kim if (i + j >= Length) 878d244b227SJung-uk Kim { 879d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 880d244b227SJung-uk Kim return; 881d244b227SJung-uk Kim } 882d244b227SJung-uk Kim 883d244b227SJung-uk Kim BufChar = Buffer[(ACPI_SIZE) i + j]; 884d244b227SJung-uk Kim if (ACPI_IS_PRINT (BufChar)) 885d244b227SJung-uk Kim { 886d244b227SJung-uk Kim FlPrintFile (FileId, "%c", BufChar); 887d244b227SJung-uk Kim } 888d244b227SJung-uk Kim else 889d244b227SJung-uk Kim { 890d244b227SJung-uk Kim FlPrintFile (FileId, "."); 891d244b227SJung-uk Kim } 892d244b227SJung-uk Kim } 893d244b227SJung-uk Kim 894d244b227SJung-uk Kim /* Done with that line. */ 895d244b227SJung-uk Kim 896d244b227SJung-uk Kim FlPrintFile (FileId, "\n"); 897d244b227SJung-uk Kim i += 16; 898d244b227SJung-uk Kim } 899d244b227SJung-uk Kim 900d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 901d244b227SJung-uk Kim } 902d244b227SJung-uk Kim 903d244b227SJung-uk Kim 904d244b227SJung-uk Kim /****************************************************************************** 905d244b227SJung-uk Kim * 906*efcc2a30SJung-uk Kim * FUNCTION: DtDumpFieldList 907*efcc2a30SJung-uk Kim * 908*efcc2a30SJung-uk Kim * PARAMETERS: Field - Root field 909*efcc2a30SJung-uk Kim * 910*efcc2a30SJung-uk Kim * RETURN: None 911*efcc2a30SJung-uk Kim * 912*efcc2a30SJung-uk Kim * DESCRIPTION: Dump the entire field list 913*efcc2a30SJung-uk Kim * 914*efcc2a30SJung-uk Kim *****************************************************************************/ 915*efcc2a30SJung-uk Kim 916*efcc2a30SJung-uk Kim void 917*efcc2a30SJung-uk Kim DtDumpFieldList ( 918*efcc2a30SJung-uk Kim DT_FIELD *Field) 919*efcc2a30SJung-uk Kim { 920*efcc2a30SJung-uk Kim 921*efcc2a30SJung-uk Kim if (!Gbl_DebugFlag || !Field) 922*efcc2a30SJung-uk Kim { 923*efcc2a30SJung-uk Kim return; 924*efcc2a30SJung-uk Kim } 925*efcc2a30SJung-uk Kim 926*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "\nField List:\n" 927*efcc2a30SJung-uk Kim "LineNo ByteOff NameCol Column TableOff " 928*efcc2a30SJung-uk Kim "Flags %32s : %s\n\n", "Name", "Value"); 929*efcc2a30SJung-uk Kim while (Field) 930*efcc2a30SJung-uk Kim { 931*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 932*efcc2a30SJung-uk Kim "%.08X %.08X %.08X %.08X %.08X %.08X %32s : %s\n", 933*efcc2a30SJung-uk Kim Field->Line, Field->ByteOffset, Field->NameColumn, 934*efcc2a30SJung-uk Kim Field->Column, Field->TableOffset, Field->Flags, 935*efcc2a30SJung-uk Kim Field->Name, Field->Value); 936*efcc2a30SJung-uk Kim 937*efcc2a30SJung-uk Kim Field = Field->Next; 938*efcc2a30SJung-uk Kim } 939*efcc2a30SJung-uk Kim 940*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "\n\n"); 941*efcc2a30SJung-uk Kim } 942*efcc2a30SJung-uk Kim 943*efcc2a30SJung-uk Kim 944*efcc2a30SJung-uk Kim /****************************************************************************** 945*efcc2a30SJung-uk Kim * 946*efcc2a30SJung-uk Kim * FUNCTION: DtDumpSubtableInfo, DtDumpSubtableTree 947*efcc2a30SJung-uk Kim * 948*efcc2a30SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 949*efcc2a30SJung-uk Kim * 950*efcc2a30SJung-uk Kim * RETURN: None 951*efcc2a30SJung-uk Kim * 952*efcc2a30SJung-uk Kim * DESCRIPTION: Info - dump a subtable tree entry with extra information. 953*efcc2a30SJung-uk Kim * Tree - dump a subtable tree formatted by depth indentation. 954*efcc2a30SJung-uk Kim * 955*efcc2a30SJung-uk Kim *****************************************************************************/ 956*efcc2a30SJung-uk Kim 957*efcc2a30SJung-uk Kim static void 958*efcc2a30SJung-uk Kim DtDumpSubtableInfo ( 959*efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 960*efcc2a30SJung-uk Kim void *Context, 961*efcc2a30SJung-uk Kim void *ReturnValue) 962*efcc2a30SJung-uk Kim { 963*efcc2a30SJung-uk Kim 964*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 965*efcc2a30SJung-uk Kim "[%.04X] %.08X %.08X %.08X %.08X %.08X %p %p %p\n", 966*efcc2a30SJung-uk Kim Subtable->Depth, Subtable->Length, Subtable->TotalLength, 967*efcc2a30SJung-uk Kim Subtable->SizeOfLengthField, Subtable->Flags, Subtable, 968*efcc2a30SJung-uk Kim Subtable->Parent, Subtable->Child, Subtable->Peer); 969*efcc2a30SJung-uk Kim } 970*efcc2a30SJung-uk Kim 971*efcc2a30SJung-uk Kim static void 972*efcc2a30SJung-uk Kim DtDumpSubtableTree ( 973*efcc2a30SJung-uk Kim DT_SUBTABLE *Subtable, 974*efcc2a30SJung-uk Kim void *Context, 975*efcc2a30SJung-uk Kim void *ReturnValue) 976*efcc2a30SJung-uk Kim { 977*efcc2a30SJung-uk Kim 978*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 979*efcc2a30SJung-uk Kim "[%.04X] %*s%08X (%.02X) - (%.02X)\n", 980*efcc2a30SJung-uk Kim Subtable->Depth, (4 * Subtable->Depth), " ", 981*efcc2a30SJung-uk Kim Subtable, Subtable->Length, Subtable->TotalLength); 982*efcc2a30SJung-uk Kim } 983*efcc2a30SJung-uk Kim 984*efcc2a30SJung-uk Kim 985*efcc2a30SJung-uk Kim /****************************************************************************** 986*efcc2a30SJung-uk Kim * 987*efcc2a30SJung-uk Kim * FUNCTION: DtDumpSubtableList 988*efcc2a30SJung-uk Kim * 989*efcc2a30SJung-uk Kim * PARAMETERS: None 990*efcc2a30SJung-uk Kim * 991*efcc2a30SJung-uk Kim * RETURN: None 992*efcc2a30SJung-uk Kim * 993*efcc2a30SJung-uk Kim * DESCRIPTION: Dump the raw list of subtables with information, and also 994*efcc2a30SJung-uk Kim * dump the subtable list in formatted tree format. Assists with 995*efcc2a30SJung-uk Kim * the development of new table code. 996*efcc2a30SJung-uk Kim * 997*efcc2a30SJung-uk Kim *****************************************************************************/ 998*efcc2a30SJung-uk Kim 999*efcc2a30SJung-uk Kim void 1000*efcc2a30SJung-uk Kim DtDumpSubtableList ( 1001*efcc2a30SJung-uk Kim void) 1002*efcc2a30SJung-uk Kim { 1003*efcc2a30SJung-uk Kim 1004*efcc2a30SJung-uk Kim if (!Gbl_DebugFlag || !Gbl_RootTable) 1005*efcc2a30SJung-uk Kim { 1006*efcc2a30SJung-uk Kim return; 1007*efcc2a30SJung-uk Kim } 1008*efcc2a30SJung-uk Kim 1009*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1010*efcc2a30SJung-uk Kim "Subtable Info:\n" 1011*efcc2a30SJung-uk Kim "Depth Length TotalLen LenSize Flags " 1012*efcc2a30SJung-uk Kim "This Parent Child Peer\n\n"); 1013*efcc2a30SJung-uk Kim DtWalkTableTree (Gbl_RootTable, DtDumpSubtableInfo, NULL, NULL); 1014*efcc2a30SJung-uk Kim 1015*efcc2a30SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 1016*efcc2a30SJung-uk Kim "\nSubtable Tree: (Depth, Subtable, Length, TotalLength)\n\n"); 1017*efcc2a30SJung-uk Kim DtWalkTableTree (Gbl_RootTable, DtDumpSubtableTree, NULL, NULL); 1018*efcc2a30SJung-uk Kim } 1019*efcc2a30SJung-uk Kim 1020*efcc2a30SJung-uk Kim 1021*efcc2a30SJung-uk Kim /****************************************************************************** 1022*efcc2a30SJung-uk Kim * 1023d244b227SJung-uk Kim * FUNCTION: DtWriteFieldToListing 1024d244b227SJung-uk Kim * 1025d244b227SJung-uk Kim * PARAMETERS: Buffer - Contains the compiled data 1026d244b227SJung-uk Kim * Field - Field node for the input line 1027d244b227SJung-uk Kim * Length - Length of the output data 1028d244b227SJung-uk Kim * 1029d244b227SJung-uk Kim * RETURN: None 1030d244b227SJung-uk Kim * 1031d244b227SJung-uk Kim * DESCRIPTION: Write one field to the listing file (if listing is enabled). 1032d244b227SJung-uk Kim * 1033d244b227SJung-uk Kim *****************************************************************************/ 1034d244b227SJung-uk Kim 1035d244b227SJung-uk Kim void 1036d244b227SJung-uk Kim DtWriteFieldToListing ( 1037d244b227SJung-uk Kim UINT8 *Buffer, 1038d244b227SJung-uk Kim DT_FIELD *Field, 1039d244b227SJung-uk Kim UINT32 Length) 1040d244b227SJung-uk Kim { 1041d244b227SJung-uk Kim UINT8 FileByte; 1042d244b227SJung-uk Kim 1043d244b227SJung-uk Kim 1044d244b227SJung-uk Kim if (!Gbl_ListingFlag || !Field) 1045d244b227SJung-uk Kim { 1046d244b227SJung-uk Kim return; 1047d244b227SJung-uk Kim } 1048d244b227SJung-uk Kim 1049d244b227SJung-uk Kim /* Dump the original source line */ 1050d244b227SJung-uk Kim 1051d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input: "); 1052d244b227SJung-uk Kim FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset); 1053d244b227SJung-uk Kim 1054d244b227SJung-uk Kim while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK) 1055d244b227SJung-uk Kim { 1056d244b227SJung-uk Kim FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1); 1057d244b227SJung-uk Kim if (FileByte == '\n') 1058d244b227SJung-uk Kim { 1059d244b227SJung-uk Kim break; 1060d244b227SJung-uk Kim } 1061d244b227SJung-uk Kim } 1062d244b227SJung-uk Kim 1063d244b227SJung-uk Kim /* Dump the line as parsed and represented internally */ 1064d244b227SJung-uk Kim 1065d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s", 1066d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 1067d244b227SJung-uk Kim 1068d052a1ccSJung-uk Kim if (strlen (Field->Value) > 64) 1069d052a1ccSJung-uk Kim { 1070d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n", 1071d052a1ccSJung-uk Kim strlen (Field->Value)); 1072d052a1ccSJung-uk Kim } 1073d052a1ccSJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n"); 1074d052a1ccSJung-uk Kim 1075d244b227SJung-uk Kim /* Dump the hex data that will be output for this field */ 1076d244b227SJung-uk Kim 10770b94ba42SJung-uk Kim DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length); 1078d244b227SJung-uk Kim } 1079d244b227SJung-uk Kim 1080d244b227SJung-uk Kim 1081d244b227SJung-uk Kim /****************************************************************************** 1082d244b227SJung-uk Kim * 1083d244b227SJung-uk Kim * FUNCTION: DtWriteTableToListing 1084d244b227SJung-uk Kim * 1085d244b227SJung-uk Kim * PARAMETERS: None 1086d244b227SJung-uk Kim * 1087d244b227SJung-uk Kim * RETURN: None 1088d244b227SJung-uk Kim * 1089d244b227SJung-uk Kim * DESCRIPTION: Write the entire compiled table to the listing file 1090d244b227SJung-uk Kim * in hex format 1091d244b227SJung-uk Kim * 1092d244b227SJung-uk Kim *****************************************************************************/ 1093d244b227SJung-uk Kim 1094d244b227SJung-uk Kim void 1095d244b227SJung-uk Kim DtWriteTableToListing ( 1096d244b227SJung-uk Kim void) 1097d244b227SJung-uk Kim { 1098d244b227SJung-uk Kim UINT8 *Buffer; 1099d244b227SJung-uk Kim 1100d244b227SJung-uk Kim 1101d244b227SJung-uk Kim if (!Gbl_ListingFlag) 1102d244b227SJung-uk Kim { 1103d244b227SJung-uk Kim return; 1104d244b227SJung-uk Kim } 1105d244b227SJung-uk Kim 1106d244b227SJung-uk Kim /* Read the entire table from the output file */ 1107d244b227SJung-uk Kim 1108d244b227SJung-uk Kim Buffer = UtLocalCalloc (Gbl_TableLength); 1109d244b227SJung-uk Kim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 1110d244b227SJung-uk Kim FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength); 1111d244b227SJung-uk Kim 1112d244b227SJung-uk Kim /* Dump the raw table data */ 1113d244b227SJung-uk Kim 1114d244b227SJung-uk Kim AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle); 1115d244b227SJung-uk Kim 1116d244b227SJung-uk Kim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 1117d244b227SJung-uk Kim ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength); 11188ef1a331SJung-uk Kim AcpiUtDumpBuffer (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY, 0); 1119d244b227SJung-uk Kim 1120d244b227SJung-uk Kim AcpiOsRedirectOutput (stdout); 1121d244b227SJung-uk Kim } 1122