dttemplate.c revision 1.1.1.4.2.2 1 /******************************************************************************
2 *
3 * Module Name: dttemplate - ACPI table template generation
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2015, 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 #include "acapps.h"
46 #include "dtcompiler.h"
47 #include "dttemplate.h" /* Contains the hex ACPI table templates */
48
49 #define _COMPONENT DT_COMPILER
50 ACPI_MODULE_NAME ("dttemplate")
51
52
53 /* Local prototypes */
54
55 static BOOLEAN
56 AcpiUtIsSpecialTable (
57 char *Signature);
58
59 static ACPI_STATUS
60 DtCreateOneTemplate (
61 char *Signature,
62 const ACPI_DMTABLE_DATA *TableData);
63
64 static ACPI_STATUS
65 DtCreateAllTemplates (
66 void);
67
68
69 /*******************************************************************************
70 *
71 * FUNCTION: AcpiUtIsSpecialTable
72 *
73 * PARAMETERS: Signature - ACPI table signature
74 *
75 * RETURN: TRUE if signature is a special ACPI table
76 *
77 * DESCRIPTION: Check for valid ACPI tables that are not in the main ACPI
78 * table data structure (AcpiDmTableData).
79 *
80 ******************************************************************************/
81
82 static BOOLEAN
83 AcpiUtIsSpecialTable (
84 char *Signature)
85 {
86
87 if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
88 ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT) ||
89 ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT) ||
90 ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS) ||
91 ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME))
92 {
93 return (TRUE);
94 }
95
96 return (FALSE);
97 }
98
99
100 /*******************************************************************************
101 *
102 * FUNCTION: DtCreateTemplates
103 *
104 * PARAMETERS: Signature - ACPI table signature
105 *
106 * RETURN: Status
107 *
108 * DESCRIPTION: Create one or more template files.
109 *
110 ******************************************************************************/
111
112 ACPI_STATUS
113 DtCreateTemplates (
114 char *Signature)
115 {
116 const ACPI_DMTABLE_DATA *TableData;
117 ACPI_STATUS Status;
118
119
120 AslInitializeGlobals ();
121
122 /* Default (no signature) is DSDT */
123
124 if (!Signature)
125 {
126 Signature = "DSDT";
127 goto GetTemplate;
128 }
129
130 AcpiUtStrupr (Signature);
131 if (!strcmp (Signature, "ALL") ||
132 !strcmp (Signature, "*"))
133 {
134 /* Create all available/known templates */
135
136 Status = DtCreateAllTemplates ();
137 return (Status);
138 }
139
140 /*
141 * Validate signature and get the template data:
142 * 1) Signature must be 4 characters
143 * 2) Signature must be a recognized ACPI table
144 * 3) There must be a template associated with the signature
145 */
146 if (strlen (Signature) != ACPI_NAME_SIZE)
147 {
148 fprintf (stderr,
149 "%s: Invalid ACPI table signature (length must be 4 characters)\n",
150 Signature);
151 return (AE_ERROR);
152 }
153
154 /*
155 * Some slack for the two strange tables whose name is different than
156 * their signatures: MADT->APIC and FADT->FACP.
157 */
158 if (!strcmp (Signature, "MADT"))
159 {
160 Signature = "APIC";
161 }
162 else if (!strcmp (Signature, "FADT"))
163 {
164 Signature = "FACP";
165 }
166
167 GetTemplate:
168 TableData = AcpiDmGetTableData (Signature);
169 if (TableData)
170 {
171 if (!TableData->Template)
172 {
173 fprintf (stderr, "%4.4s: No template available\n", Signature);
174 return (AE_ERROR);
175 }
176 }
177 else if (!AcpiUtIsSpecialTable (Signature))
178 {
179 fprintf (stderr,
180 "%4.4s: Unrecognized ACPI table signature\n", Signature);
181 return (AE_ERROR);
182 }
183
184 Status = AdInitialize ();
185 if (ACPI_FAILURE (Status))
186 {
187 return (Status);
188 }
189
190 Status = DtCreateOneTemplate (Signature, TableData);
191
192
193 /* Shutdown ACPICA subsystem */
194
195 (void) AcpiTerminate ();
196 CmDeleteCaches ();
197 return (Status);
198 }
199
200
201 /*******************************************************************************
202 *
203 * FUNCTION: DtCreateAllTemplates
204 *
205 * PARAMETERS: None
206 *
207 * RETURN: Status
208 *
209 * DESCRIPTION: Create all currently defined template files
210 *
211 ******************************************************************************/
212
213 static ACPI_STATUS
214 DtCreateAllTemplates (
215 void)
216 {
217 const ACPI_DMTABLE_DATA *TableData;
218 ACPI_STATUS Status;
219
220
221 Status = AdInitialize ();
222 if (ACPI_FAILURE (Status))
223 {
224 return (Status);
225 }
226
227 fprintf (stderr, "Creating all supported Template files\n");
228
229 /* Walk entire ACPI table data structure */
230
231 for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
232 {
233 /* If table has a template, create the template file */
234
235 if (TableData->Template)
236 {
237 Status = DtCreateOneTemplate (TableData->Signature,
238 TableData);
239 if (ACPI_FAILURE (Status))
240 {
241 return (Status);
242 }
243 }
244 }
245
246 /*
247 * Create the special ACPI tables:
248 * 1) DSDT/SSDT are AML tables, not data tables
249 * 2) FACS and RSDP have non-standard headers
250 */
251 Status = DtCreateOneTemplate (ACPI_SIG_DSDT, NULL);
252 if (ACPI_FAILURE (Status))
253 {
254 return (Status);
255 }
256
257 Status = DtCreateOneTemplate (ACPI_SIG_SSDT, NULL);
258 if (ACPI_FAILURE (Status))
259 {
260 return (Status);
261 }
262
263 Status = DtCreateOneTemplate (ACPI_SIG_FACS, NULL);
264 if (ACPI_FAILURE (Status))
265 {
266 return (Status);
267 }
268
269 Status = DtCreateOneTemplate (ACPI_RSDP_NAME, NULL);
270 if (ACPI_FAILURE (Status))
271 {
272 return (Status);
273 }
274
275 return (AE_OK);
276 }
277
278
279 /*******************************************************************************
280 *
281 * FUNCTION: DtCreateOneTemplate
282 *
283 * PARAMETERS: Signature - ACPI signature, NULL terminated.
284 * TableData - Entry in ACPI table data structure.
285 * NULL if a special ACPI table.
286 *
287 * RETURN: Status
288 *
289 * DESCRIPTION: Create one template source file for the requested ACPI table.
290 *
291 ******************************************************************************/
292
293 static ACPI_STATUS
294 DtCreateOneTemplate (
295 char *Signature,
296 const ACPI_DMTABLE_DATA *TableData)
297 {
298 char *DisasmFilename;
299 FILE *File;
300 ACPI_STATUS Status = AE_OK;
301 ACPI_SIZE Actual;
302
303
304 /* New file will have a .asl suffix */
305
306 DisasmFilename = FlGenerateFilename (
307 Signature, FILE_SUFFIX_ASL_CODE);
308 if (!DisasmFilename)
309 {
310 fprintf (stderr, "Could not generate output filename\n");
311 return (AE_ERROR);
312 }
313
314 /* Probably should prompt to overwrite the file */
315
316 AcpiUtStrlwr (DisasmFilename);
317 File = fopen (DisasmFilename, "w+");
318 if (!File)
319 {
320 fprintf (stderr, "Could not open output file %s\n", DisasmFilename);
321 return (AE_ERROR);
322 }
323
324 /* Emit the common file header */
325
326 AcpiOsRedirectOutput (File);
327
328 AcpiOsPrintf ("/*\n");
329 AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * "));
330
331 AcpiOsPrintf (" * Template for [%4.4s] ACPI Table",
332 Signature);
333
334 /* Dump the actual ACPI table */
335
336 if (TableData)
337 {
338 /* Normal case, tables that appear in AcpiDmTableData */
339
340 AcpiOsPrintf (" (static data table)\n");
341
342 if (Gbl_VerboseTemplates)
343 {
344 AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]"
345 " FieldName : HexFieldValue\n */\n\n");
346 }
347 else
348 {
349 AcpiOsPrintf (" * Format: [ByteLength]"
350 " FieldName : HexFieldValue\n */\n");
351 }
352
353 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
354 TableData->Template));
355 }
356 else
357 {
358 /* Special ACPI tables - DSDT, SSDT, OSDT, FADT, RSDP */
359
360 AcpiOsPrintf (" (AML byte code table)\n");
361
362 AcpiOsPrintf (" */\n");
363 if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT))
364 {
365 Actual = fwrite (TemplateDsdt, 1, sizeof (TemplateDsdt) -1, File);
366 if (Actual != sizeof (TemplateDsdt) -1)
367 {
368 fprintf (stderr,
369 "Could not write to output file %s\n", DisasmFilename);
370 Status = AE_ERROR;
371 goto Cleanup;
372 }
373 }
374 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT))
375 {
376 Actual = fwrite (TemplateSsdt, 1, sizeof (TemplateSsdt) -1, File);
377 if (Actual != sizeof (TemplateSsdt) -1)
378 {
379 fprintf (stderr,
380 "Could not write to output file %s\n", DisasmFilename);
381 Status = AE_ERROR;
382 goto Cleanup;
383 }
384 }
385 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT))
386 {
387 Actual = fwrite (TemplateOsdt, 1, sizeof (TemplateOsdt) -1, File);
388 if (Actual != sizeof (TemplateOsdt) -1)
389 {
390 fprintf (stderr,
391 "Could not write to output file %s\n", DisasmFilename);
392 Status = AE_ERROR;
393 goto Cleanup;
394 }
395 }
396 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) /* FADT */
397 {
398 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
399 TemplateFacs));
400 }
401 else if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME))
402 {
403 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
404 TemplateRsdp));
405 }
406 else
407 {
408 fprintf (stderr,
409 "%4.4s, Unrecognized ACPI table signature\n", Signature);
410 Status = AE_ERROR;
411 goto Cleanup;
412 }
413 }
414
415 fprintf (stderr,
416 "Created ACPI table template for [%4.4s], written to \"%s\"\n",
417 Signature, DisasmFilename);
418
419 Cleanup:
420 fclose (File);
421 AcpiOsRedirectOutput (stdout);
422 return (Status);
423 }
424