aslhex.c revision 1.1.1.2 1 /******************************************************************************
2 *
3 * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL)
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2014, 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 #include "aslcompiler.h"
45
46 #define _COMPONENT ACPI_COMPILER
47 ACPI_MODULE_NAME ("ashex")
48
49 /*
50 * This module emits ASCII hex output files in either C, ASM, or ASL format
51 */
52
53
54 /* Local prototypes */
55
56 static void
57 HxDoHexOutputC (
58 void);
59
60 static void
61 HxDoHexOutputAsl (
62 void);
63
64 static void
65 HxDoHexOutputAsm (
66 void);
67
68 static UINT32
69 HxReadAmlOutputFile (
70 UINT8 *Buffer);
71
72
73 /*******************************************************************************
74 *
75 * FUNCTION: HxDoHexOutput
76 *
77 * PARAMETERS: None
78 *
79 * RETURN: None
80 *
81 * DESCRIPTION: Create the hex output file. Note: data is obtained by reading
82 * the entire AML output file that was previously generated.
83 *
84 ******************************************************************************/
85
86 void
87 HxDoHexOutput (
88 void)
89 {
90
91 switch (Gbl_HexOutputFlag)
92 {
93 case HEX_OUTPUT_C:
94
95 HxDoHexOutputC ();
96 break;
97
98 case HEX_OUTPUT_ASM:
99
100 HxDoHexOutputAsm ();
101 break;
102
103 case HEX_OUTPUT_ASL:
104
105 HxDoHexOutputAsl ();
106 break;
107
108 default:
109
110 /* No other output types supported */
111
112 break;
113 }
114 }
115
116
117 /*******************************************************************************
118 *
119 * FUNCTION: HxReadAmlOutputFile
120 *
121 * PARAMETERS: Buffer - Where to return data
122 *
123 * RETURN: None
124 *
125 * DESCRIPTION: Read a line of the AML output prior to formatting the data
126 *
127 ******************************************************************************/
128
129 static UINT32
130 HxReadAmlOutputFile (
131 UINT8 *Buffer)
132 {
133 UINT32 Actual;
134
135
136 Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE,
137 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
138
139 if (ferror (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle))
140 {
141 FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
142 AslAbort ();
143 }
144
145 return (Actual);
146 }
147
148
149 /*******************************************************************************
150 *
151 * FUNCTION: HxDoHexOutputC
152 *
153 * PARAMETERS: None
154 *
155 * RETURN: None
156 *
157 * DESCRIPTION: Create the hex output file. This is the same data as the AML
158 * output file, but formatted into hex/ascii bytes suitable for
159 * inclusion into a C source file.
160 *
161 ******************************************************************************/
162
163 static void
164 HxDoHexOutputC (
165 void)
166 {
167 UINT8 FileData[HEX_TABLE_LINE_SIZE];
168 UINT32 LineLength;
169 UINT32 Offset = 0;
170 UINT32 AmlFileSize;
171 UINT32 i;
172
173
174 /* Get AML size, seek back to start */
175
176 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
177 FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
178
179 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n");
180 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
181 AmlFileSize);
182 FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n");
183
184 while (Offset < AmlFileSize)
185 {
186 /* Read enough bytes needed for one output line */
187
188 LineLength = HxReadAmlOutputFile (FileData);
189 if (!LineLength)
190 {
191 break;
192 }
193
194 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
195
196 for (i = 0; i < LineLength; i++)
197 {
198 /*
199 * Print each hex byte.
200 * Add a comma until the very last byte of the AML file
201 * (Some C compilers complain about a trailing comma)
202 */
203 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
204 if ((Offset + i + 1) < AmlFileSize)
205 {
206 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
207 }
208 else
209 {
210 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
211 }
212 }
213
214 /* Add fill spaces if needed for last line */
215
216 if (LineLength < HEX_TABLE_LINE_SIZE)
217 {
218 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
219 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
220 }
221
222 /* Emit the offset and ascii dump for the entire line */
223
224 FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset);
225 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
226 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
227 HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
228
229 Offset += LineLength;
230 }
231
232 FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n");
233 }
234
235
236 /*******************************************************************************
237 *
238 * FUNCTION: HxDoHexOutputAsl
239 *
240 * PARAMETERS: None
241 *
242 * RETURN: None
243 *
244 * DESCRIPTION: Create the hex output file. This is the same data as the AML
245 * output file, but formatted into hex/ascii bytes suitable for
246 * inclusion into a C source file.
247 *
248 ******************************************************************************/
249
250 static void
251 HxDoHexOutputAsl (
252 void)
253 {
254 UINT8 FileData[HEX_TABLE_LINE_SIZE];
255 UINT32 LineLength;
256 UINT32 Offset = 0;
257 UINT32 AmlFileSize;
258 UINT32 i;
259
260
261 /* Get AML size, seek back to start */
262
263 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
264 FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
265
266 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n");
267 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
268 AmlFileSize);
269 FlPrintFile (ASL_FILE_HEX_OUTPUT, " Name (BUF1, Buffer()\n {\n");
270
271 while (Offset < AmlFileSize)
272 {
273 /* Read enough bytes needed for one output line */
274
275 LineLength = HxReadAmlOutputFile (FileData);
276 if (!LineLength)
277 {
278 break;
279 }
280
281 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
282
283 for (i = 0; i < LineLength; i++)
284 {
285 /*
286 * Print each hex byte.
287 * Add a comma until the very last byte of the AML file
288 * (Some C compilers complain about a trailing comma)
289 */
290 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
291 if ((Offset + i + 1) < AmlFileSize)
292 {
293 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
294 }
295 else
296 {
297 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
298 }
299 }
300
301 /* Add fill spaces if needed for last line */
302
303 if (LineLength < HEX_TABLE_LINE_SIZE)
304 {
305 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
306 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
307 }
308
309 /* Emit the offset and ascii dump for the entire line */
310
311 FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset);
312 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
313 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
314 HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
315
316 Offset += LineLength;
317 }
318
319 FlPrintFile (ASL_FILE_HEX_OUTPUT, " })\n");
320 }
321
322
323 /*******************************************************************************
324 *
325 * FUNCTION: HxDoHexOutputAsm
326 *
327 * PARAMETERS: None
328 *
329 * RETURN: None
330 *
331 * DESCRIPTION: Create the hex output file. This is the same data as the AML
332 * output file, but formatted into hex/ascii bytes suitable for
333 * inclusion into a ASM source file.
334 *
335 ******************************************************************************/
336
337 static void
338 HxDoHexOutputAsm (
339 void)
340 {
341 UINT8 FileData[HEX_TABLE_LINE_SIZE];
342 UINT32 LineLength;
343 UINT32 Offset = 0;
344 UINT32 AmlFileSize;
345 UINT32 i;
346
347
348 /* Get AML size, seek back to start */
349
350 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
351 FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
352
353 FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n");
354 FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n",
355 AmlFileSize);
356
357 while (Offset < AmlFileSize)
358 {
359 /* Read enough bytes needed for one output line */
360
361 LineLength = HxReadAmlOutputFile (FileData);
362 if (!LineLength)
363 {
364 break;
365 }
366
367 FlPrintFile (ASL_FILE_HEX_OUTPUT, " db ");
368
369 for (i = 0; i < LineLength; i++)
370 {
371 /*
372 * Print each hex byte.
373 * Add a comma until the last byte of the line
374 */
375 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]);
376 if ((i + 1) < LineLength)
377 {
378 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
379 }
380 }
381
382 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
383
384 /* Add fill spaces if needed for last line */
385
386 if (LineLength < HEX_TABLE_LINE_SIZE)
387 {
388 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
389 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
390 }
391
392 /* Emit the offset and ascii dump for the entire line */
393
394 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ; %8.8X", Offset);
395 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
396 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
397
398 Offset += LineLength;
399 }
400
401 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
402 }
403