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 7*d244b227SJung-uk Kim /* 8*d244b227SJung-uk Kim * Copyright (C) 2000 - 2011, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11*d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13*d244b227SJung-uk Kim * are met: 14*d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*d244b227SJung-uk Kim * without modification. 17*d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*d244b227SJung-uk Kim * binary redistribution. 22*d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26*d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30*d244b227SJung-uk Kim * NO WARRANTY 31*d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*d244b227SJung-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 63*d244b227SJung-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 UINT32 70a88e22b7SJung-uk Kim DtGetNextLine ( 71a88e22b7SJung-uk Kim FILE *Handle); 72a88e22b7SJung-uk Kim 73a88e22b7SJung-uk Kim static void 74a88e22b7SJung-uk Kim DtWriteBinary ( 75a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 76a88e22b7SJung-uk Kim void *Context, 77a88e22b7SJung-uk Kim void *ReturnValue); 78a88e22b7SJung-uk Kim 79*d244b227SJung-uk Kim static void 80*d244b227SJung-uk Kim DtDumpBuffer ( 81*d244b227SJung-uk Kim UINT32 FileId, 82*d244b227SJung-uk Kim UINT8 *Buffer, 83*d244b227SJung-uk Kim UINT32 Length); 84a88e22b7SJung-uk Kim 85a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 86a88e22b7SJung-uk Kim 87a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 88a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 89a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 90a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 91a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 92a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 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 * 229*d244b227SJung-uk Kim * RETURN: Status 230a88e22b7SJung-uk Kim * 231a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 232a88e22b7SJung-uk Kim * 233a88e22b7SJung-uk Kim *****************************************************************************/ 234a88e22b7SJung-uk Kim 235*d244b227SJung-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; 252a88e22b7SJung-uk Kim 253a88e22b7SJung-uk Kim 254a88e22b7SJung-uk Kim if (!LineBuffer) 255a88e22b7SJung-uk Kim { 256*d244b227SJung-uk Kim return (AE_OK); 257*d244b227SJung-uk Kim } 258*d244b227SJung-uk Kim 259*d244b227SJung-uk Kim /* All lines after "Raw Table Data" are ingored */ 260*d244b227SJung-uk Kim 261*d244b227SJung-uk Kim if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER)) 262*d244b227SJung-uk Kim { 263*d244b227SJung-uk Kim return (AE_NOT_FOUND); 264a88e22b7SJung-uk Kim } 265a88e22b7SJung-uk Kim 266a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 267*d244b227SJung-uk Kim if (!Colon) 268a88e22b7SJung-uk Kim { 269*d244b227SJung-uk Kim return (AE_OK); 270a88e22b7SJung-uk Kim } 271a88e22b7SJung-uk Kim 272a88e22b7SJung-uk Kim Start = LineBuffer; 273a88e22b7SJung-uk Kim End = Colon; 274a88e22b7SJung-uk Kim 275a88e22b7SJung-uk Kim while (Start < Colon) 276a88e22b7SJung-uk Kim { 277a88e22b7SJung-uk Kim if (*Start == ' ') 278a88e22b7SJung-uk Kim { 279a88e22b7SJung-uk Kim Start++; 280a88e22b7SJung-uk Kim continue; 281a88e22b7SJung-uk Kim } 282a88e22b7SJung-uk Kim 283a88e22b7SJung-uk Kim /* Found left bracket, go to the right bracket */ 284a88e22b7SJung-uk Kim 285a88e22b7SJung-uk Kim if (*Start == '[') 286a88e22b7SJung-uk Kim { 287a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 288a88e22b7SJung-uk Kim { 289a88e22b7SJung-uk Kim Start++; 290a88e22b7SJung-uk Kim } 291a88e22b7SJung-uk Kim 292a88e22b7SJung-uk Kim if (Start == Colon) 293a88e22b7SJung-uk Kim { 294a88e22b7SJung-uk Kim break; 295a88e22b7SJung-uk Kim } 296a88e22b7SJung-uk Kim 297a88e22b7SJung-uk Kim Start++; 298a88e22b7SJung-uk Kim continue; 299a88e22b7SJung-uk Kim } 300a88e22b7SJung-uk Kim 301a88e22b7SJung-uk Kim break; 302a88e22b7SJung-uk Kim } 303a88e22b7SJung-uk Kim 304a88e22b7SJung-uk Kim /* 305a88e22b7SJung-uk Kim * There are two column values. One for the field name, 306a88e22b7SJung-uk Kim * and one for the field value. 307a88e22b7SJung-uk Kim */ 308a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 309a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 310a88e22b7SJung-uk Kim 311a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 312a88e22b7SJung-uk Kim 313a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 314a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpName, Start, Length); 315a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 316a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 317a88e22b7SJung-uk Kim 318a88e22b7SJung-uk Kim Start = End = (Colon + 1); 319a88e22b7SJung-uk Kim 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++; 327a88e22b7SJung-uk Kim while (*End && *End != '"') 328a88e22b7SJung-uk Kim { 329a88e22b7SJung-uk Kim End++; 330a88e22b7SJung-uk Kim } 331a88e22b7SJung-uk Kim 332a88e22b7SJung-uk Kim End++; 333a88e22b7SJung-uk Kim break; 334a88e22b7SJung-uk Kim } 335a88e22b7SJung-uk Kim 336a88e22b7SJung-uk Kim if (*End == '(' || 337a88e22b7SJung-uk Kim *End == '<' || 338a88e22b7SJung-uk Kim *End == '/') 339a88e22b7SJung-uk Kim { 340a88e22b7SJung-uk Kim break; 341a88e22b7SJung-uk Kim } 342a88e22b7SJung-uk Kim 343a88e22b7SJung-uk Kim End++; 344a88e22b7SJung-uk Kim } 345a88e22b7SJung-uk Kim 346a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 347a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 348a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpValue, Start, Length); 349a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 350a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 351a88e22b7SJung-uk Kim 352a88e22b7SJung-uk Kim if (Name && Value) 353a88e22b7SJung-uk Kim { 354a88e22b7SJung-uk Kim Field = UtLocalCalloc (sizeof (DT_FIELD)); 355a88e22b7SJung-uk Kim Field->Name = Name; 356a88e22b7SJung-uk Kim Field->Value = Value; 357a88e22b7SJung-uk Kim Field->Line = Line; 358a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 359a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 360a88e22b7SJung-uk Kim Field->Column = Column; 361a88e22b7SJung-uk Kim 362a88e22b7SJung-uk Kim DtLinkField (Field); 363a88e22b7SJung-uk Kim } 364*d244b227SJung-uk Kim 365*d244b227SJung-uk Kim return (AE_OK); 366a88e22b7SJung-uk Kim } 367a88e22b7SJung-uk Kim 368a88e22b7SJung-uk Kim 369a88e22b7SJung-uk Kim /****************************************************************************** 370a88e22b7SJung-uk Kim * 371a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 372a88e22b7SJung-uk Kim * 373a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 374a88e22b7SJung-uk Kim * 375a88e22b7SJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (zero on EOF) 376a88e22b7SJung-uk Kim * 377a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 378a88e22b7SJung-uk Kim * Ignores empty lines. 379a88e22b7SJung-uk Kim * 380a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 381a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 382a88e22b7SJung-uk Kim * 383a88e22b7SJung-uk Kim * Line is returned in Gbl_CurrentLineBuffer. 384a88e22b7SJung-uk Kim * Line number in original file is returned in Gbl_CurrentLineNumber. 385a88e22b7SJung-uk Kim * 386a88e22b7SJung-uk Kim *****************************************************************************/ 387a88e22b7SJung-uk Kim 388a88e22b7SJung-uk Kim static UINT32 389a88e22b7SJung-uk Kim DtGetNextLine ( 390a88e22b7SJung-uk Kim FILE *Handle) 391a88e22b7SJung-uk Kim { 392a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 393a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 394a88e22b7SJung-uk Kim UINT32 i; 395a88e22b7SJung-uk Kim char c; 396a88e22b7SJung-uk Kim 397a88e22b7SJung-uk Kim 398a88e22b7SJung-uk Kim for (i = 0; i < ASL_LINE_BUFFER_SIZE;) 399a88e22b7SJung-uk Kim { 400a88e22b7SJung-uk Kim c = (char) getc (Handle); 401a88e22b7SJung-uk Kim if (c == EOF) 402a88e22b7SJung-uk Kim { 403a88e22b7SJung-uk Kim return (0); 404a88e22b7SJung-uk Kim } 405a88e22b7SJung-uk Kim 406a88e22b7SJung-uk Kim switch (State) 407a88e22b7SJung-uk Kim { 408a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 409a88e22b7SJung-uk Kim 410a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 411a88e22b7SJung-uk Kim 412a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 413a88e22b7SJung-uk Kim switch (c) 414a88e22b7SJung-uk Kim { 415a88e22b7SJung-uk Kim case '/': 416a88e22b7SJung-uk Kim State = DT_START_COMMENT; 417a88e22b7SJung-uk Kim break; 418a88e22b7SJung-uk Kim 419a88e22b7SJung-uk Kim case '"': 420a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 421a88e22b7SJung-uk Kim i++; 422a88e22b7SJung-uk Kim break; 423a88e22b7SJung-uk Kim 424a88e22b7SJung-uk Kim case '\n': 425a88e22b7SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 426a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 427a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 428a88e22b7SJung-uk Kim 429a88e22b7SJung-uk Kim /* Exit if line is complete. Ignore blank lines */ 430a88e22b7SJung-uk Kim 431a88e22b7SJung-uk Kim if (i != 0) 432a88e22b7SJung-uk Kim { 433a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate line */ 434a88e22b7SJung-uk Kim return (CurrentLineOffset); 435a88e22b7SJung-uk Kim } 436a88e22b7SJung-uk Kim break; 437a88e22b7SJung-uk Kim 438a88e22b7SJung-uk Kim default: 439a88e22b7SJung-uk Kim i++; 440a88e22b7SJung-uk Kim break; 441a88e22b7SJung-uk Kim } 442a88e22b7SJung-uk Kim break; 443a88e22b7SJung-uk Kim 444a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 445a88e22b7SJung-uk Kim 446a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 447a88e22b7SJung-uk Kim 448a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 449a88e22b7SJung-uk Kim i++; 450a88e22b7SJung-uk Kim 451a88e22b7SJung-uk Kim if (c == '"') 452a88e22b7SJung-uk Kim { 453a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 454a88e22b7SJung-uk Kim } 455a88e22b7SJung-uk Kim break; 456a88e22b7SJung-uk Kim 457a88e22b7SJung-uk Kim case DT_START_COMMENT: 458a88e22b7SJung-uk Kim 459a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 460a88e22b7SJung-uk Kim 461a88e22b7SJung-uk Kim switch (c) 462a88e22b7SJung-uk Kim { 463a88e22b7SJung-uk Kim case '*': 464a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 465a88e22b7SJung-uk Kim break; 466a88e22b7SJung-uk Kim 467a88e22b7SJung-uk Kim case '/': 468a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 469a88e22b7SJung-uk Kim break; 470a88e22b7SJung-uk Kim 471a88e22b7SJung-uk Kim default: /* Not a comment */ 472a88e22b7SJung-uk Kim i++; /* Save the preceeding slash */ 473a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 474a88e22b7SJung-uk Kim i++; 475a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 476a88e22b7SJung-uk Kim break; 477a88e22b7SJung-uk Kim } 478a88e22b7SJung-uk Kim break; 479a88e22b7SJung-uk Kim 480a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 481a88e22b7SJung-uk Kim 482a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 483a88e22b7SJung-uk Kim 484a88e22b7SJung-uk Kim switch (c) 485a88e22b7SJung-uk Kim { 486a88e22b7SJung-uk Kim case '\n': 487a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 488a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 489a88e22b7SJung-uk Kim break; 490a88e22b7SJung-uk Kim 491a88e22b7SJung-uk Kim case '*': 492a88e22b7SJung-uk Kim State = DT_END_COMMENT; 493a88e22b7SJung-uk Kim break; 494a88e22b7SJung-uk Kim 495a88e22b7SJung-uk Kim default: 496a88e22b7SJung-uk Kim break; 497a88e22b7SJung-uk Kim } 498a88e22b7SJung-uk Kim break; 499a88e22b7SJung-uk Kim 500a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 501a88e22b7SJung-uk Kim 502a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 503a88e22b7SJung-uk Kim 504a88e22b7SJung-uk Kim if (c == '\n') 505a88e22b7SJung-uk Kim { 506a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 507a88e22b7SJung-uk Kim 508a88e22b7SJung-uk Kim ungetc (c, Handle); 509a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 510a88e22b7SJung-uk Kim } 511a88e22b7SJung-uk Kim break; 512a88e22b7SJung-uk Kim 513a88e22b7SJung-uk Kim case DT_END_COMMENT: 514a88e22b7SJung-uk Kim 515a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 516a88e22b7SJung-uk Kim 517a88e22b7SJung-uk Kim switch (c) 518a88e22b7SJung-uk Kim { 519a88e22b7SJung-uk Kim case '/': 520a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 521a88e22b7SJung-uk Kim break; 522a88e22b7SJung-uk Kim 523a88e22b7SJung-uk Kim default: 524a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 525a88e22b7SJung-uk Kim break; 526a88e22b7SJung-uk Kim } 527a88e22b7SJung-uk Kim break; 528a88e22b7SJung-uk Kim 529a88e22b7SJung-uk Kim default: 530a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 531a88e22b7SJung-uk Kim return (0); 532a88e22b7SJung-uk Kim } 533a88e22b7SJung-uk Kim } 534a88e22b7SJung-uk Kim 535a88e22b7SJung-uk Kim printf ("ERROR - Input line is too long (max %u)\n", ASL_LINE_BUFFER_SIZE); 536a88e22b7SJung-uk Kim return (0); 537a88e22b7SJung-uk Kim } 538a88e22b7SJung-uk Kim 539a88e22b7SJung-uk Kim 540a88e22b7SJung-uk Kim /****************************************************************************** 541a88e22b7SJung-uk Kim * 542a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 543a88e22b7SJung-uk Kim * 544a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 545a88e22b7SJung-uk Kim * 546a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 547a88e22b7SJung-uk Kim * 548a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 549a88e22b7SJung-uk Kim * to the global parse tree: Gbl_FieldList 550a88e22b7SJung-uk Kim * 551a88e22b7SJung-uk Kim *****************************************************************************/ 552a88e22b7SJung-uk Kim 553a88e22b7SJung-uk Kim DT_FIELD * 554a88e22b7SJung-uk Kim DtScanFile ( 555a88e22b7SJung-uk Kim FILE *Handle) 556a88e22b7SJung-uk Kim { 557*d244b227SJung-uk Kim ACPI_STATUS Status; 558a88e22b7SJung-uk Kim UINT32 Offset; 559a88e22b7SJung-uk Kim 560a88e22b7SJung-uk Kim 561a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 562a88e22b7SJung-uk Kim 563a88e22b7SJung-uk Kim 564a88e22b7SJung-uk Kim /* Get the file size */ 565a88e22b7SJung-uk Kim 566a88e22b7SJung-uk Kim Gbl_InputByteCount = DtGetFileSize (Handle); 567a88e22b7SJung-uk Kim 568a88e22b7SJung-uk Kim Gbl_CurrentLineNumber = 0; 569a88e22b7SJung-uk Kim Gbl_CurrentLineOffset = 0; 570a88e22b7SJung-uk Kim Gbl_NextLineOffset = 0; 571a88e22b7SJung-uk Kim 572a88e22b7SJung-uk Kim /* Scan line-by-line */ 573a88e22b7SJung-uk Kim 574a88e22b7SJung-uk Kim while ((Offset = DtGetNextLine (Handle))) 575a88e22b7SJung-uk Kim { 576a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 577a88e22b7SJung-uk Kim Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer)); 578a88e22b7SJung-uk Kim 579*d244b227SJung-uk Kim Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset); 580*d244b227SJung-uk Kim if (Status == AE_NOT_FOUND) 581*d244b227SJung-uk Kim { 582*d244b227SJung-uk Kim break; 583*d244b227SJung-uk Kim } 584a88e22b7SJung-uk Kim } 585a88e22b7SJung-uk Kim 586a88e22b7SJung-uk Kim return (Gbl_FieldList); 587a88e22b7SJung-uk Kim } 588a88e22b7SJung-uk Kim 589a88e22b7SJung-uk Kim 590a88e22b7SJung-uk Kim /* 591a88e22b7SJung-uk Kim * Output functions 592a88e22b7SJung-uk Kim */ 593a88e22b7SJung-uk Kim 594a88e22b7SJung-uk Kim /****************************************************************************** 595a88e22b7SJung-uk Kim * 596a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 597a88e22b7SJung-uk Kim * 598a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 599a88e22b7SJung-uk Kim * 600a88e22b7SJung-uk Kim * RETURN: Status 601a88e22b7SJung-uk Kim * 602a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 603a88e22b7SJung-uk Kim * 604a88e22b7SJung-uk Kim *****************************************************************************/ 605a88e22b7SJung-uk Kim 606a88e22b7SJung-uk Kim static void 607a88e22b7SJung-uk Kim DtWriteBinary ( 608a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 609a88e22b7SJung-uk Kim void *Context, 610a88e22b7SJung-uk Kim void *ReturnValue) 611a88e22b7SJung-uk Kim { 612a88e22b7SJung-uk Kim 613a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 614a88e22b7SJung-uk Kim } 615a88e22b7SJung-uk Kim 616a88e22b7SJung-uk Kim 617a88e22b7SJung-uk Kim /****************************************************************************** 618a88e22b7SJung-uk Kim * 619a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 620a88e22b7SJung-uk Kim * 621a88e22b7SJung-uk Kim * PARAMETERS: 622a88e22b7SJung-uk Kim * 623a88e22b7SJung-uk Kim * RETURN: Status 624a88e22b7SJung-uk Kim * 625a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 626a88e22b7SJung-uk Kim * 627a88e22b7SJung-uk Kim *****************************************************************************/ 628a88e22b7SJung-uk Kim 629a88e22b7SJung-uk Kim void 630a88e22b7SJung-uk Kim DtOutputBinary ( 631a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 632a88e22b7SJung-uk Kim { 633a88e22b7SJung-uk Kim 634a88e22b7SJung-uk Kim if (!RootTable) 635a88e22b7SJung-uk Kim { 636a88e22b7SJung-uk Kim return; 637a88e22b7SJung-uk Kim } 638a88e22b7SJung-uk Kim 639a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 640a88e22b7SJung-uk Kim 641a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 642a88e22b7SJung-uk Kim Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 643a88e22b7SJung-uk Kim } 644*d244b227SJung-uk Kim 645*d244b227SJung-uk Kim 646*d244b227SJung-uk Kim /* 647*d244b227SJung-uk Kim * Listing support 648*d244b227SJung-uk Kim */ 649*d244b227SJung-uk Kim 650*d244b227SJung-uk Kim /****************************************************************************** 651*d244b227SJung-uk Kim * 652*d244b227SJung-uk Kim * FUNCTION: DtDumpBuffer 653*d244b227SJung-uk Kim * 654*d244b227SJung-uk Kim * PARAMETERS: FileID - Where to write buffer data 655*d244b227SJung-uk Kim * Buffer - Buffer to dump 656*d244b227SJung-uk Kim * Length - Buffer Length 657*d244b227SJung-uk Kim * 658*d244b227SJung-uk Kim * RETURN: None 659*d244b227SJung-uk Kim * 660*d244b227SJung-uk Kim * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately). 661*d244b227SJung-uk Kim * 662*d244b227SJung-uk Kim * TBD: merge dump buffer routines 663*d244b227SJung-uk Kim * 664*d244b227SJung-uk Kim *****************************************************************************/ 665*d244b227SJung-uk Kim 666*d244b227SJung-uk Kim static void 667*d244b227SJung-uk Kim DtDumpBuffer ( 668*d244b227SJung-uk Kim UINT32 FileId, 669*d244b227SJung-uk Kim UINT8 *Buffer, 670*d244b227SJung-uk Kim UINT32 Length) 671*d244b227SJung-uk Kim { 672*d244b227SJung-uk Kim UINT32 i; 673*d244b227SJung-uk Kim UINT32 j; 674*d244b227SJung-uk Kim UINT8 BufChar; 675*d244b227SJung-uk Kim 676*d244b227SJung-uk Kim 677*d244b227SJung-uk Kim i = 0; 678*d244b227SJung-uk Kim while (i < Length) 679*d244b227SJung-uk Kim { 680*d244b227SJung-uk Kim /* Print 16 hex chars */ 681*d244b227SJung-uk Kim 682*d244b227SJung-uk Kim FlPrintFile (FileId, "Output: [%.3d] ", Length); 683*d244b227SJung-uk Kim 684*d244b227SJung-uk Kim for (j = 0; j < 16;) 685*d244b227SJung-uk Kim { 686*d244b227SJung-uk Kim if (i + j >= Length) 687*d244b227SJung-uk Kim { 688*d244b227SJung-uk Kim /* Dump fill spaces */ 689*d244b227SJung-uk Kim 690*d244b227SJung-uk Kim FlPrintFile (FileId, " "); 691*d244b227SJung-uk Kim j++; 692*d244b227SJung-uk Kim continue; 693*d244b227SJung-uk Kim } 694*d244b227SJung-uk Kim 695*d244b227SJung-uk Kim FlPrintFile (FileId, "%02X ", Buffer[i+j]); 696*d244b227SJung-uk Kim j++; 697*d244b227SJung-uk Kim } 698*d244b227SJung-uk Kim 699*d244b227SJung-uk Kim FlPrintFile (FileId, " "); 700*d244b227SJung-uk Kim for (j = 0; j < 16; j++) 701*d244b227SJung-uk Kim { 702*d244b227SJung-uk Kim if (i + j >= Length) 703*d244b227SJung-uk Kim { 704*d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 705*d244b227SJung-uk Kim return; 706*d244b227SJung-uk Kim } 707*d244b227SJung-uk Kim 708*d244b227SJung-uk Kim BufChar = Buffer[(ACPI_SIZE) i + j]; 709*d244b227SJung-uk Kim if (ACPI_IS_PRINT (BufChar)) 710*d244b227SJung-uk Kim { 711*d244b227SJung-uk Kim FlPrintFile (FileId, "%c", BufChar); 712*d244b227SJung-uk Kim } 713*d244b227SJung-uk Kim else 714*d244b227SJung-uk Kim { 715*d244b227SJung-uk Kim FlPrintFile (FileId, "."); 716*d244b227SJung-uk Kim } 717*d244b227SJung-uk Kim } 718*d244b227SJung-uk Kim 719*d244b227SJung-uk Kim /* Done with that line. */ 720*d244b227SJung-uk Kim 721*d244b227SJung-uk Kim FlPrintFile (FileId, "\n"); 722*d244b227SJung-uk Kim i += 16; 723*d244b227SJung-uk Kim } 724*d244b227SJung-uk Kim 725*d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 726*d244b227SJung-uk Kim } 727*d244b227SJung-uk Kim 728*d244b227SJung-uk Kim 729*d244b227SJung-uk Kim /****************************************************************************** 730*d244b227SJung-uk Kim * 731*d244b227SJung-uk Kim * FUNCTION: DtWriteFieldToListing 732*d244b227SJung-uk Kim * 733*d244b227SJung-uk Kim * PARAMETERS: Buffer - Contains the compiled data 734*d244b227SJung-uk Kim * Field - Field node for the input line 735*d244b227SJung-uk Kim * Length - Length of the output data 736*d244b227SJung-uk Kim * 737*d244b227SJung-uk Kim * RETURN: None 738*d244b227SJung-uk Kim * 739*d244b227SJung-uk Kim * DESCRIPTION: Write one field to the listing file (if listing is enabled). 740*d244b227SJung-uk Kim * 741*d244b227SJung-uk Kim *****************************************************************************/ 742*d244b227SJung-uk Kim 743*d244b227SJung-uk Kim void 744*d244b227SJung-uk Kim DtWriteFieldToListing ( 745*d244b227SJung-uk Kim UINT8 *Buffer, 746*d244b227SJung-uk Kim DT_FIELD *Field, 747*d244b227SJung-uk Kim UINT32 Length) 748*d244b227SJung-uk Kim { 749*d244b227SJung-uk Kim UINT8 FileByte; 750*d244b227SJung-uk Kim 751*d244b227SJung-uk Kim 752*d244b227SJung-uk Kim if (!Gbl_ListingFlag || !Field) 753*d244b227SJung-uk Kim { 754*d244b227SJung-uk Kim return; 755*d244b227SJung-uk Kim } 756*d244b227SJung-uk Kim 757*d244b227SJung-uk Kim /* Dump the original source line */ 758*d244b227SJung-uk Kim 759*d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input: "); 760*d244b227SJung-uk Kim FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset); 761*d244b227SJung-uk Kim 762*d244b227SJung-uk Kim while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK) 763*d244b227SJung-uk Kim { 764*d244b227SJung-uk Kim FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1); 765*d244b227SJung-uk Kim if (FileByte == '\n') 766*d244b227SJung-uk Kim { 767*d244b227SJung-uk Kim break; 768*d244b227SJung-uk Kim } 769*d244b227SJung-uk Kim } 770*d244b227SJung-uk Kim 771*d244b227SJung-uk Kim /* Dump the line as parsed and represented internally */ 772*d244b227SJung-uk Kim 773*d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %s\n", 774*d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 775*d244b227SJung-uk Kim 776*d244b227SJung-uk Kim #if 0 777*d244b227SJung-uk Kim /* TBD Dump the length and AML offset */ 778*d244b227SJung-uk Kim 779*d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, 780*d244b227SJung-uk Kim "Output: Length %d(0x%X) Offset %d(0x%X)\n", 781*d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 782*d244b227SJung-uk Kim #endif 783*d244b227SJung-uk Kim 784*d244b227SJung-uk Kim /* Dump the hex data that will be output for this field */ 785*d244b227SJung-uk Kim 786*d244b227SJung-uk Kim DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Length); 787*d244b227SJung-uk Kim } 788*d244b227SJung-uk Kim 789*d244b227SJung-uk Kim 790*d244b227SJung-uk Kim /****************************************************************************** 791*d244b227SJung-uk Kim * 792*d244b227SJung-uk Kim * FUNCTION: DtWriteTableToListing 793*d244b227SJung-uk Kim * 794*d244b227SJung-uk Kim * PARAMETERS: None 795*d244b227SJung-uk Kim * 796*d244b227SJung-uk Kim * RETURN: None 797*d244b227SJung-uk Kim * 798*d244b227SJung-uk Kim * DESCRIPTION: Write the entire compiled table to the listing file 799*d244b227SJung-uk Kim * in hex format 800*d244b227SJung-uk Kim * 801*d244b227SJung-uk Kim *****************************************************************************/ 802*d244b227SJung-uk Kim 803*d244b227SJung-uk Kim void 804*d244b227SJung-uk Kim DtWriteTableToListing ( 805*d244b227SJung-uk Kim void) 806*d244b227SJung-uk Kim { 807*d244b227SJung-uk Kim UINT8 *Buffer; 808*d244b227SJung-uk Kim 809*d244b227SJung-uk Kim 810*d244b227SJung-uk Kim if (!Gbl_ListingFlag) 811*d244b227SJung-uk Kim { 812*d244b227SJung-uk Kim return; 813*d244b227SJung-uk Kim } 814*d244b227SJung-uk Kim 815*d244b227SJung-uk Kim /* Read the entire table from the output file */ 816*d244b227SJung-uk Kim 817*d244b227SJung-uk Kim Buffer = UtLocalCalloc (Gbl_TableLength); 818*d244b227SJung-uk Kim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 819*d244b227SJung-uk Kim FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength); 820*d244b227SJung-uk Kim 821*d244b227SJung-uk Kim /* Dump the raw table data */ 822*d244b227SJung-uk Kim 823*d244b227SJung-uk Kim AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle); 824*d244b227SJung-uk Kim 825*d244b227SJung-uk Kim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 826*d244b227SJung-uk Kim ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength); 827*d244b227SJung-uk Kim AcpiUtDumpBuffer2 (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY); 828*d244b227SJung-uk Kim 829*d244b227SJung-uk Kim AcpiOsRedirectOutput (stdout); 830*d244b227SJung-uk Kim } 831