aslhex.c revision 1.1 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 "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 }
404