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