xref: /freebsd/sys/contrib/dev/acpica/compiler/aslhex.c (revision af6a5351a1fdb1130f18be6c782c4d48916eb971)
1 /******************************************************************************
2  *
3  * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL)
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2017, 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 <contrib/dev/acpica/compiler/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 /* Local prototypes */
54 
55 static void
56 HxDoHexOutputC (
57     void);
58 
59 static void
60 HxDoHexOutputAsl (
61     void);
62 
63 static void
64 HxDoHexOutputAsm (
65     void);
66 
67 static UINT32
68 HxReadAmlOutputFile (
69     UINT8                   *Buffer);
70 
71 
72 /*******************************************************************************
73  *
74  * FUNCTION:    HxDoHexOutput
75  *
76  * PARAMETERS:  None
77  *
78  * RETURN:      None
79  *
80  * DESCRIPTION: Create the hex output file. Note: data is obtained by reading
81  *              the entire AML output file that was previously generated.
82  *
83  ******************************************************************************/
84 
85 void
86 HxDoHexOutput (
87     void)
88 {
89 
90     switch (Gbl_HexOutputFlag)
91     {
92     case HEX_OUTPUT_C:
93 
94         HxDoHexOutputC ();
95         break;
96 
97     case HEX_OUTPUT_ASM:
98 
99         HxDoHexOutputAsm ();
100         break;
101 
102     case HEX_OUTPUT_ASL:
103 
104         HxDoHexOutputAsl ();
105         break;
106 
107     default:
108 
109         /* No other output types supported */
110 
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 
128 static UINT32
129 HxReadAmlOutputFile (
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 
162 static void
163 HxDoHexOutputC (
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 
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 
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 
398         FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
399 
400         Offset += LineLength;
401     }
402 
403     FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
404 }
405