dtcompiler.h revision 1.1.1.4 1 /******************************************************************************
2 *
3 * Module Name: dtcompiler.h - header for data table compiler
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 #define __DTCOMPILER_H__
45
46 #ifndef _DTCOMPILER
47 #define _DTCOMPILER
48
49 #include <stdio.h>
50 #include "acdisasm.h"
51
52
53 #undef DT_EXTERN
54
55 #ifdef _DECLARE_DT_GLOBALS
56 #define DT_EXTERN
57 #define DT_INIT_GLOBAL(a,b) (a)=(b)
58 #else
59 #define DT_EXTERN extern
60 #define DT_INIT_GLOBAL(a,b) (a)
61 #endif
62
63
64 /* Types for individual fields (one per input line) */
65
66 #define DT_FIELD_TYPE_STRING 0
67 #define DT_FIELD_TYPE_INTEGER 1
68 #define DT_FIELD_TYPE_BUFFER 2
69 #define DT_FIELD_TYPE_PCI_PATH 3
70 #define DT_FIELD_TYPE_FLAG 4
71 #define DT_FIELD_TYPE_FLAGS_INTEGER 5
72 #define DT_FIELD_TYPE_INLINE_SUBTABLE 6
73 #define DT_FIELD_TYPE_UUID 7
74 #define DT_FIELD_TYPE_UNICODE 8
75 #define DT_FIELD_TYPE_DEVICE_PATH 9
76 #define DT_FIELD_TYPE_LABEL 10
77
78
79 /*
80 * Structure used for each individual field within an ACPI table
81 */
82 typedef struct dt_field
83 {
84 char *Name; /* Field name (from name : value) */
85 char *Value; /* Field value (from name : value) */
86 struct dt_field *Next; /* Next field */
87 struct dt_field *NextLabel; /* If field is a label, next label */
88 UINT32 Line; /* Line number for this field */
89 UINT32 ByteOffset; /* Offset in source file for field */
90 UINT32 NameColumn; /* Start column for field name */
91 UINT32 Column; /* Start column for field value */
92 UINT32 TableOffset;/* Binary offset within ACPI table */
93 UINT8 Flags;
94
95 } DT_FIELD;
96
97 /* Flags for above */
98
99 #define DT_FIELD_NOT_ALLOCATED 1
100
101
102 /*
103 * Structure used for individual subtables within an ACPI table
104 */
105 typedef struct dt_subtable
106 {
107 struct dt_subtable *Parent;
108 struct dt_subtable *Child;
109 struct dt_subtable *Peer;
110 struct dt_subtable *StackTop;
111 UINT8 *Buffer;
112 UINT8 *LengthField;
113 UINT32 Length;
114 UINT32 TotalLength;
115 UINT32 SizeOfLengthField;
116 UINT16 Depth;
117 UINT8 Flags;
118
119 } DT_SUBTABLE;
120
121
122 /*
123 * Globals
124 */
125
126 /* List of all field names and values from the input source */
127
128 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*Gbl_FieldList, NULL);
129
130 /* List of all compiled tables and subtables */
131
132 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*Gbl_RootTable, NULL);
133
134 /* Stack for subtables */
135
136 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*Gbl_SubtableStack, NULL);
137
138 /* List for defined labels */
139
140 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*Gbl_LabelList, NULL);
141
142 /* Current offset within the binary output table */
143
144 DT_EXTERN UINT32 DT_INIT_GLOBAL (Gbl_CurrentTableOffset, 0);
145
146
147 /* dtcompiler - main module */
148
149 ACPI_STATUS
150 DtCompileTable (
151 DT_FIELD **Field,
152 ACPI_DMTABLE_INFO *Info,
153 DT_SUBTABLE **RetSubtable,
154 BOOLEAN Required);
155
156
157 /* dtio - binary and text input/output */
158
159 UINT32
160 DtGetNextLine (
161 FILE *Handle);
162
163 DT_FIELD *
164 DtScanFile (
165 FILE *Handle);
166
167 void
168 DtOutputBinary (
169 DT_SUBTABLE *RootTable);
170
171 void
172 DtDumpSubtableList (
173 void);
174
175 void
176 DtDumpFieldList (
177 DT_FIELD *Field);
178
179 void
180 DtWriteFieldToListing (
181 UINT8 *Buffer,
182 DT_FIELD *Field,
183 UINT32 Length);
184
185 void
186 DtWriteTableToListing (
187 void);
188
189
190 /* dtsubtable - compile subtables */
191
192 void
193 DtCreateSubtable (
194 UINT8 *Buffer,
195 UINT32 Length,
196 DT_SUBTABLE **RetSubtable);
197
198 UINT32
199 DtGetSubtableLength (
200 DT_FIELD *Field,
201 ACPI_DMTABLE_INFO *Info);
202
203 void
204 DtSetSubtableLength (
205 DT_SUBTABLE *Subtable);
206
207 void
208 DtPushSubtable (
209 DT_SUBTABLE *Subtable);
210
211 void
212 DtPopSubtable (
213 void);
214
215 DT_SUBTABLE *
216 DtPeekSubtable (
217 void);
218
219 void
220 DtInsertSubtable (
221 DT_SUBTABLE *ParentTable,
222 DT_SUBTABLE *Subtable);
223
224 DT_SUBTABLE *
225 DtGetNextSubtable (
226 DT_SUBTABLE *ParentTable,
227 DT_SUBTABLE *ChildTable);
228
229 DT_SUBTABLE *
230 DtGetParentSubtable (
231 DT_SUBTABLE *Subtable);
232
233
234 /* dtexpress - Integer expressions and labels */
235
236 ACPI_STATUS
237 DtResolveIntegerExpression (
238 DT_FIELD *Field,
239 UINT64 *ReturnValue);
240
241 UINT64
242 DtDoOperator (
243 UINT64 LeftValue,
244 UINT32 Operator,
245 UINT64 RightValue);
246
247 UINT64
248 DtResolveLabel (
249 char *LabelString);
250
251 void
252 DtDetectAllLabels (
253 DT_FIELD *FieldList);
254
255
256 /* dtfield - Compile individual fields within a table */
257
258 void
259 DtCompileOneField (
260 UINT8 *Buffer,
261 DT_FIELD *Field,
262 UINT32 ByteLength,
263 UINT8 Type,
264 UINT8 Flags);
265
266 void
267 DtCompileInteger (
268 UINT8 *Buffer,
269 DT_FIELD *Field,
270 UINT32 ByteLength,
271 UINT8 Flags);
272
273 UINT32
274 DtCompileBuffer (
275 UINT8 *Buffer,
276 char *Value,
277 DT_FIELD *Field,
278 UINT32 ByteLength);
279
280 void
281 DtCompileFlag (
282 UINT8 *Buffer,
283 DT_FIELD *Field,
284 ACPI_DMTABLE_INFO *Info);
285
286
287 /* dtparser - lex/yacc files */
288
289 UINT64
290 DtEvaluateExpression (
291 char *ExprString);
292
293 int
294 DtInitLexer (
295 char *String);
296
297 void
298 DtTerminateLexer (
299 void);
300
301 char *
302 DtGetOpName (
303 UINT32 ParseOpcode);
304
305
306 /* dtutils - Miscellaneous utilities */
307
308 typedef
309 void (*DT_WALK_CALLBACK) (
310 DT_SUBTABLE *Subtable,
311 void *Context,
312 void *ReturnValue);
313
314 void
315 DtWalkTableTree (
316 DT_SUBTABLE *StartTable,
317 DT_WALK_CALLBACK UserFunction,
318 void *Context,
319 void *ReturnValue);
320
321 void
322 DtError (
323 UINT8 Level,
324 UINT8 MessageId,
325 DT_FIELD *FieldObject,
326 char *ExtraMessage);
327
328 void
329 DtNameError (
330 UINT8 Level,
331 UINT8 MessageId,
332 DT_FIELD *FieldObject,
333 char *ExtraMessage);
334
335 void
336 DtFatal (
337 UINT8 MessageId,
338 DT_FIELD *FieldObject,
339 char *ExtraMessage);
340
341 ACPI_STATUS
342 DtStrtoul64 (
343 char *String,
344 UINT64 *ReturnInteger);
345
346 UINT32
347 DtGetFileSize (
348 FILE *Handle);
349
350 char*
351 DtGetFieldValue (
352 DT_FIELD *Field);
353
354 UINT8
355 DtGetFieldType (
356 ACPI_DMTABLE_INFO *Info);
357
358 UINT32
359 DtGetBufferLength (
360 char *Buffer);
361
362 UINT32
363 DtGetFieldLength (
364 DT_FIELD *Field,
365 ACPI_DMTABLE_INFO *Info);
366
367 void
368 DtSetTableChecksum (
369 UINT8 *ChecksumPointer);
370
371 void
372 DtSetTableLength(
373 void);
374
375 void
376 DtFreeFieldList (
377 void);
378
379
380 /* dttable - individual table compilation */
381
382 ACPI_STATUS
383 DtCompileFacs (
384 DT_FIELD **PFieldList);
385
386 ACPI_STATUS
387 DtCompileRsdp (
388 DT_FIELD **PFieldList);
389
390 ACPI_STATUS
391 DtCompileAsf (
392 void **PFieldList);
393
394 ACPI_STATUS
395 DtCompileCpep (
396 void **PFieldList);
397
398 ACPI_STATUS
399 DtCompileCsrt (
400 void **PFieldList);
401
402 ACPI_STATUS
403 DtCompileDbg2 (
404 void **PFieldList);
405
406 ACPI_STATUS
407 DtCompileDmar (
408 void **PFieldList);
409
410 ACPI_STATUS
411 DtCompileEinj (
412 void **PFieldList);
413
414 ACPI_STATUS
415 DtCompileErst (
416 void **PFieldList);
417
418 ACPI_STATUS
419 DtCompileFadt (
420 void **PFieldList);
421
422 ACPI_STATUS
423 DtCompileFpdt (
424 void **PFieldList);
425
426 ACPI_STATUS
427 DtCompileHest (
428 void **PFieldList);
429
430 ACPI_STATUS
431 DtCompileIvrs (
432 void **PFieldList);
433
434 ACPI_STATUS
435 DtCompileMadt (
436 void **PFieldList);
437
438 ACPI_STATUS
439 DtCompileMcfg (
440 void **PFieldList);
441
442 ACPI_STATUS
443 DtCompileMpst (
444 void **PFieldList);
445
446 ACPI_STATUS
447 DtCompileMsct (
448 void **PFieldList);
449
450 ACPI_STATUS
451 DtCompileMtmr (
452 void **PFieldList);
453
454 ACPI_STATUS
455 DtCompilePmtt (
456 void **PFieldList);
457
458 ACPI_STATUS
459 DtCompilePcct (
460 void **PFieldList);
461
462 ACPI_STATUS
463 DtCompileRsdt (
464 void **PFieldList);
465
466 ACPI_STATUS
467 DtCompileS3pt (
468 DT_FIELD **PFieldList);
469
470 ACPI_STATUS
471 DtCompileSlic (
472 void **PFieldList);
473
474 ACPI_STATUS
475 DtCompileSlit (
476 void **PFieldList);
477
478 ACPI_STATUS
479 DtCompileSrat (
480 void **PFieldList);
481
482 ACPI_STATUS
483 DtCompileUefi (
484 void **PFieldList);
485
486 ACPI_STATUS
487 DtCompileVrtc (
488 void **PFieldList);
489
490 ACPI_STATUS
491 DtCompileWdat (
492 void **PFieldList);
493
494 ACPI_STATUS
495 DtCompileXsdt (
496 void **PFieldList);
497
498 ACPI_STATUS
499 DtCompileGeneric (
500 void **PFieldList);
501
502 ACPI_DMTABLE_INFO *
503 DtGetGenericTableInfo (
504 char *Name);
505
506 /* ACPI Table templates */
507
508 extern const unsigned char TemplateAsf[];
509 extern const unsigned char TemplateBoot[];
510 extern const unsigned char TemplateBert[];
511 extern const unsigned char TemplateBgrt[];
512 extern const unsigned char TemplateCpep[];
513 extern const unsigned char TemplateCsrt[];
514 extern const unsigned char TemplateDbg2[];
515 extern const unsigned char TemplateDbgp[];
516 extern const unsigned char TemplateDmar[];
517 extern const unsigned char TemplateEcdt[];
518 extern const unsigned char TemplateEinj[];
519 extern const unsigned char TemplateErst[];
520 extern const unsigned char TemplateFadt[];
521 extern const unsigned char TemplateFpdt[];
522 extern const unsigned char TemplateGtdt[];
523 extern const unsigned char TemplateHest[];
524 extern const unsigned char TemplateHpet[];
525 extern const unsigned char TemplateIvrs[];
526 extern const unsigned char TemplateMadt[];
527 extern const unsigned char TemplateMcfg[];
528 extern const unsigned char TemplateMchi[];
529 extern const unsigned char TemplateMpst[];
530 extern const unsigned char TemplateMsct[];
531 extern const unsigned char TemplateMtmr[];
532 extern const unsigned char TemplatePcct[];
533 extern const unsigned char TemplatePmtt[];
534 extern const unsigned char TemplateRsdt[];
535 extern const unsigned char TemplateS3pt[];
536 extern const unsigned char TemplateSbst[];
537 extern const unsigned char TemplateSlic[];
538 extern const unsigned char TemplateSlit[];
539 extern const unsigned char TemplateSpcr[];
540 extern const unsigned char TemplateSpmi[];
541 extern const unsigned char TemplateSrat[];
542 extern const unsigned char TemplateTcpa[];
543 extern const unsigned char TemplateTpm2[];
544 extern const unsigned char TemplateUefi[];
545 extern const unsigned char TemplateVrtc[];
546 extern const unsigned char TemplateWaet[];
547 extern const unsigned char TemplateWdat[];
548 extern const unsigned char TemplateWddt[];
549 extern const unsigned char TemplateWdrt[];
550 extern const unsigned char TemplateXsdt[];
551
552 #endif
553