]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/dev/acpica/compiler/aslhex.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / dev / acpica / compiler / aslhex.c
1 /******************************************************************************
2  *
3  * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL)
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2013, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44
45 #include <contrib/dev/acpica/compiler/aslcompiler.h>
46
47 #define _COMPONENT          ACPI_COMPILER
48         ACPI_MODULE_NAME    ("ashex")
49
50 /*
51  * This module emits ASCII hex output files in either C, ASM, or ASL format
52  */
53
54
55 /* Local prototypes */
56
57 static void
58 HxDoHexOutputC (
59     void);
60
61 static void
62 HxDoHexOutputAsl (
63     void);
64
65 static void
66 HxDoHexOutputAsm (
67     void);
68
69 static UINT32
70 HxReadAmlOutputFile (
71     UINT8                   *Buffer);
72
73
74 /*******************************************************************************
75  *
76  * FUNCTION:    HxDoHexOutput
77  *
78  * PARAMETERS:  None
79  *
80  * RETURN:      None
81  *
82  * DESCRIPTION: Create the hex output file. Note: data is obtained by reading
83  *              the entire AML output file that was previously generated.
84  *
85  ******************************************************************************/
86
87 void
88 HxDoHexOutput (
89     void)
90 {
91
92     switch (Gbl_HexOutputFlag)
93     {
94     case HEX_OUTPUT_C:
95
96         HxDoHexOutputC ();
97         break;
98
99     case HEX_OUTPUT_ASM:
100
101         HxDoHexOutputAsm ();
102         break;
103
104     case HEX_OUTPUT_ASL:
105
106         HxDoHexOutputAsl ();
107         break;
108
109     default:
110
111         /* No other output types supported */
112
113         break;
114     }
115 }
116
117
118 /*******************************************************************************
119  *
120  * FUNCTION:    HxReadAmlOutputFile
121  *
122  * PARAMETERS:  Buffer              - Where to return data
123  *
124  * RETURN:      None
125  *
126  * DESCRIPTION: Read a line of the AML output prior to formatting the data
127  *
128  ******************************************************************************/
129
130 static UINT32
131 HxReadAmlOutputFile (
132     UINT8                   *Buffer)
133 {
134     UINT32                  Actual;
135
136
137     Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE,
138         Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
139
140     if (ferror (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle))
141     {
142         FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
143         AslAbort ();
144     }
145
146     return (Actual);
147 }
148
149
150 /*******************************************************************************
151  *
152  * FUNCTION:    HxDoHexOutputC
153  *
154  * PARAMETERS:  None
155  *
156  * RETURN:      None
157  *
158  * DESCRIPTION: Create the hex output file. This is the same data as the AML
159  *              output file, but formatted into hex/ascii bytes suitable for
160  *              inclusion into a C source file.
161  *
162  ******************************************************************************/
163
164 static void
165 HxDoHexOutputC (
166     void)
167 {
168     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
169     UINT32                  LineLength;
170     UINT32                  Offset = 0;
171     UINT32                  AmlFileSize;
172     UINT32                  i;
173
174
175     /* Get AML size, seek back to start */
176
177     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
178     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
179
180     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n");
181     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
182         AmlFileSize);
183     FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n");
184
185     while (Offset < AmlFileSize)
186     {
187         /* Read enough bytes needed for one output line */
188
189         LineLength = HxReadAmlOutputFile (FileData);
190         if (!LineLength)
191         {
192             break;
193         }
194
195         FlPrintFile (ASL_FILE_HEX_OUTPUT, "    ");
196
197         for (i = 0; i < LineLength; i++)
198         {
199             /*
200              * Print each hex byte.
201              * Add a comma until the very last byte of the AML file
202              * (Some C compilers complain about a trailing comma)
203              */
204             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
205             if ((Offset + i + 1) < AmlFileSize)
206             {
207                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
208             }
209             else
210             {
211                 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
212             }
213         }
214
215         /* Add fill spaces if needed for last line */
216
217         if (LineLength < HEX_TABLE_LINE_SIZE)
218         {
219             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
220                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
221         }
222
223         /* Emit the offset and ascii dump for the entire line */
224
225         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
226         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
227         FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
228             HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
229
230         Offset += LineLength;
231     }
232
233     FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n");
234 }
235
236
237 /*******************************************************************************
238  *
239  * FUNCTION:    HxDoHexOutputAsl
240  *
241  * PARAMETERS:  None
242  *
243  * RETURN:      None
244  *
245  * DESCRIPTION: Create the hex output file. This is the same data as the AML
246  *              output file, but formatted into hex/ascii bytes suitable for
247  *              inclusion into a C source file.
248  *
249  ******************************************************************************/
250
251 static void
252 HxDoHexOutputAsl (
253     void)
254 {
255     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
256     UINT32                  LineLength;
257     UINT32                  Offset = 0;
258     UINT32                  AmlFileSize;
259     UINT32                  i;
260
261
262     /* Get AML size, seek back to start */
263
264     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
265     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
266
267     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n");
268     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
269         AmlFileSize);
270     FlPrintFile (ASL_FILE_HEX_OUTPUT, "    Name (BUF1, Buffer()\n    {\n");
271
272     while (Offset < AmlFileSize)
273     {
274         /* Read enough bytes needed for one output line */
275
276         LineLength = HxReadAmlOutputFile (FileData);
277         if (!LineLength)
278         {
279             break;
280         }
281
282         FlPrintFile (ASL_FILE_HEX_OUTPUT, "        ");
283
284         for (i = 0; i < LineLength; i++)
285         {
286             /*
287              * Print each hex byte.
288              * Add a comma until the very last byte of the AML file
289              * (Some C compilers complain about a trailing comma)
290              */
291             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
292             if ((Offset + i + 1) < AmlFileSize)
293             {
294                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
295             }
296             else
297             {
298                 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
299             }
300         }
301
302         /* Add fill spaces if needed for last line */
303
304         if (LineLength < HEX_TABLE_LINE_SIZE)
305         {
306             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
307                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
308         }
309
310         /* Emit the offset and ascii dump for the entire line */
311
312         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
313         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
314         FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
315             HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
316
317         Offset += LineLength;
318     }
319
320     FlPrintFile (ASL_FILE_HEX_OUTPUT, "    })\n");
321 }
322
323
324 /*******************************************************************************
325  *
326  * FUNCTION:    HxDoHexOutputAsm
327  *
328  * PARAMETERS:  None
329  *
330  * RETURN:      None
331  *
332  * DESCRIPTION: Create the hex output file. This is the same data as the AML
333  *              output file, but formatted into hex/ascii bytes suitable for
334  *              inclusion into a ASM source file.
335  *
336  ******************************************************************************/
337
338 static void
339 HxDoHexOutputAsm (
340     void)
341 {
342     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
343     UINT32                  LineLength;
344     UINT32                  Offset = 0;
345     UINT32                  AmlFileSize;
346     UINT32                  i;
347
348
349     /* Get AML size, seek back to start */
350
351     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
352     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
353
354     FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n");
355     FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n",
356         AmlFileSize);
357
358     while (Offset < AmlFileSize)
359     {
360         /* Read enough bytes needed for one output line */
361
362         LineLength = HxReadAmlOutputFile (FileData);
363         if (!LineLength)
364         {
365             break;
366         }
367
368         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  db  ");
369
370         for (i = 0; i < LineLength; i++)
371         {
372             /*
373              * Print each hex byte.
374              * Add a comma until the last byte of the line
375              */
376             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]);
377             if ((i + 1) < LineLength)
378             {
379                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
380             }
381         }
382
383         FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
384
385         /* Add fill spaces if needed for last line */
386
387         if (LineLength < HEX_TABLE_LINE_SIZE)
388         {
389             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
390                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
391         }
392
393         /* Emit the offset and ascii dump for the entire line */
394
395         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  ; %8.8X", Offset);
396         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
397         FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
398
399         Offset += LineLength;
400     }
401
402     FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
403 }