xref: /freebsd/sys/contrib/dev/acpica/compiler/dtio.c (revision efcc2a30547c400649a351e85e6cd97dab8f3817)
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