dtcompiler.h revision 1.1.1.17 1 /******************************************************************************
2 *
3 * Module Name: dtcompiler.h - header for data table compiler
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2019, 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 "acdisasm.h"
50
51
52 #define ASL_FIELD_CACHE_SIZE 512
53 #define ASL_SUBTABLE_CACHE_SIZE 128
54
55
56 #undef DT_EXTERN
57
58 #ifdef _DECLARE_DT_GLOBALS
59 #define DT_EXTERN
60 #define DT_INIT_GLOBAL(a,b) (a)=(b)
61 #else
62 #define DT_EXTERN extern
63 #define DT_INIT_GLOBAL(a,b) (a)
64 #endif
65
66
67 /* Types for individual fields (one per input line) */
68
69 #define DT_FIELD_TYPE_STRING 0
70 #define DT_FIELD_TYPE_INTEGER 1
71 #define DT_FIELD_TYPE_BUFFER 2
72 #define DT_FIELD_TYPE_PCI_PATH 3
73 #define DT_FIELD_TYPE_FLAG 4
74 #define DT_FIELD_TYPE_FLAGS_INTEGER 5
75 #define DT_FIELD_TYPE_INLINE_SUBTABLE 6
76 #define DT_FIELD_TYPE_UUID 7
77 #define DT_FIELD_TYPE_UNICODE 8
78 #define DT_FIELD_TYPE_DEVICE_PATH 9
79 #define DT_FIELD_TYPE_LABEL 10
80
81
82 /*
83 * Structure used for each individual field within an ACPI table
84 */
85 typedef struct dt_field
86 {
87 char *Name; /* Field name (from name : value) */
88 char *Value; /* Field value (from name : value) */
89 UINT32 StringLength; /* Length of Value */
90 struct dt_field *Next; /* Next field */
91 struct dt_field *NextLabel; /* If field is a label, next label */
92 UINT32 Line; /* Line number for this field */
93 UINT32 ByteOffset; /* Offset in source file for field */
94 UINT32 NameColumn; /* Start column for field name */
95 UINT32 Column; /* Start column for field value */
96 UINT32 TableOffset; /* Binary offset within ACPI table */
97 UINT8 Flags;
98
99 } DT_FIELD;
100
101 /* Flags for above */
102
103 #define DT_FIELD_NOT_ALLOCATED 1
104
105 /*
106 * Structure used for each individual key or value
107 */
108 typedef struct dt_table_unit
109 {
110 char *Value; /* Field value (from name : value) */
111 UINT32 Line; /* Line number for this field */
112 UINT32 Column; /* Start column for field value */
113
114 } DT_TABLE_UNIT;
115
116
117 /*
118 * Structure used for individual subtables within an ACPI table
119 */
120 typedef struct dt_subtable
121 {
122 struct dt_subtable *Parent;
123 struct dt_subtable *Child;
124 struct dt_subtable *Peer;
125 struct dt_subtable *StackTop;
126 UINT8 *Buffer;
127 UINT8 *LengthField;
128 char *Name;
129 UINT32 Length;
130 UINT32 TotalLength;
131 UINT32 SizeOfLengthField;
132 UINT16 Depth;
133 UINT8 Flags;
134
135 } DT_SUBTABLE;
136
137
138 /*
139 * Globals
140 */
141
142 /* List of all field names and values from the input source */
143
144 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*AslGbl_FieldList, NULL);
145
146 /* List of all compiled tables and subtables */
147
148 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*AslGbl_RootTable, NULL);
149
150 /* Stack for subtables */
151
152 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*AslGbl_SubtableStack, NULL);
153
154 /* List for defined labels */
155
156 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*AslGbl_LabelList, NULL);
157
158 /* Current offset within the binary output table */
159
160 DT_EXTERN UINT32 DT_INIT_GLOBAL (AslGbl_CurrentTableOffset, 0);
161
162 /* Data table compiler Flex/Bison prototype */
163
164 DT_EXTERN BOOLEAN DT_INIT_GLOBAL (AslGbl_DtLexBisonPrototype, FALSE);
165
166 /* Local caches */
167
168 DT_EXTERN UINT32 DT_INIT_GLOBAL (AslGbl_SubtableCount, 0);
169 DT_EXTERN ASL_CACHE_INFO DT_INIT_GLOBAL (*AslGbl_SubtableCacheList, NULL);
170 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*AslGbl_SubtableCacheNext, NULL);
171 DT_EXTERN DT_SUBTABLE DT_INIT_GLOBAL (*AslGbl_SubtableCacheLast, NULL);
172
173 DT_EXTERN UINT32 DT_INIT_GLOBAL (AslGbl_FieldCount, 0);
174 DT_EXTERN ASL_CACHE_INFO DT_INIT_GLOBAL (*AslGbl_FieldCacheList, NULL);
175 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*AslGbl_FieldCacheNext, NULL);
176 DT_EXTERN DT_FIELD DT_INIT_GLOBAL (*AslGbl_FieldCacheLast, NULL);
177
178
179 /* dtcompiler - main module */
180
181 ACPI_STATUS
182 DtCompileTable (
183 DT_FIELD **Field,
184 ACPI_DMTABLE_INFO *Info,
185 DT_SUBTABLE **RetSubtable);
186
187 ACPI_STATUS
188 DtCompileTwoSubtables (
189 void **List,
190 ACPI_DMTABLE_INFO *TableInfo1,
191 ACPI_DMTABLE_INFO *TableInfo2);
192
193 ACPI_STATUS
194 DtCompilePadding (
195 UINT32 Length,
196 DT_SUBTABLE **RetSubtable);
197
198
199 /* dtio - binary and text input/output */
200
201 UINT32
202 DtGetNextLine (
203 FILE *Handle,
204 UINT32 Flags);
205
206 /* Flags for DtGetNextLine */
207
208 #define DT_ALLOW_MULTILINE_QUOTES 0x01
209
210
211 DT_FIELD *
212 DtScanFile (
213 FILE *Handle);
214
215 void
216 DtOutputBinary (
217 DT_SUBTABLE *RootTable);
218
219 void
220 DtDumpSubtableList (
221 void);
222
223 void
224 DtDumpFieldList (
225 DT_FIELD *Field);
226
227 void
228 DtWriteFieldToListing (
229 UINT8 *Buffer,
230 DT_FIELD *Field,
231 UINT32 Length);
232
233 void
234 DtWriteTableToListing (
235 void);
236
237
238 /* dtsubtable - compile subtables */
239
240 void
241 DtCreateSubtable (
242 UINT8 *Buffer,
243 UINT32 Length,
244 DT_SUBTABLE **RetSubtable);
245
246 UINT32
247 DtGetSubtableLength (
248 DT_FIELD *Field,
249 ACPI_DMTABLE_INFO *Info);
250
251 void
252 DtSetSubtableLength (
253 DT_SUBTABLE *Subtable);
254
255 void
256 DtPushSubtable (
257 DT_SUBTABLE *Subtable);
258
259 void
260 DtPopSubtable (
261 void);
262
263 DT_SUBTABLE *
264 DtPeekSubtable (
265 void);
266
267 void
268 DtInsertSubtable (
269 DT_SUBTABLE *ParentTable,
270 DT_SUBTABLE *Subtable);
271
272 DT_SUBTABLE *
273 DtGetNextSubtable (
274 DT_SUBTABLE *ParentTable,
275 DT_SUBTABLE *ChildTable);
276
277 DT_SUBTABLE *
278 DtGetParentSubtable (
279 DT_SUBTABLE *Subtable);
280
281
282 /* dtexpress - Integer expressions and labels */
283
284 ACPI_STATUS
285 DtResolveIntegerExpression (
286 DT_FIELD *Field,
287 UINT64 *ReturnValue);
288
289 UINT64
290 DtDoOperator (
291 UINT64 LeftValue,
292 UINT32 Operator,
293 UINT64 RightValue);
294
295 UINT64
296 DtResolveLabel (
297 char *LabelString);
298
299 void
300 DtDetectAllLabels (
301 DT_FIELD *FieldList);
302
303
304 /* dtfield - Compile individual fields within a table */
305
306 void
307 DtCompileOneField (
308 UINT8 *Buffer,
309 DT_FIELD *Field,
310 UINT32 ByteLength,
311 UINT8 Type,
312 UINT8 Flags);
313
314 void
315 DtCompileInteger (
316 UINT8 *Buffer,
317 DT_FIELD *Field,
318 UINT32 ByteLength,
319 UINT8 Flags);
320
321 UINT32
322 DtCompileBuffer (
323 UINT8 *Buffer,
324 char *Value,
325 DT_FIELD *Field,
326 UINT32 ByteLength);
327
328 void
329 DtCompileFlag (
330 UINT8 *Buffer,
331 DT_FIELD *Field,
332 ACPI_DMTABLE_INFO *Info);
333
334
335 /* dtfield - DT_FIELD operations */
336
337 void
338 DtLinkField (
339 DT_FIELD *Field);
340
341 void
342 DtCreateField (
343 DT_TABLE_UNIT *FieldKey,
344 DT_TABLE_UNIT *FieldValue,
345 UINT32 Offset);
346
347 DT_TABLE_UNIT *
348 DtCreateTableUnit (
349 char *Data,
350 UINT32 Line,
351 UINT32 Column);
352
353
354 /* dtparser - lex/yacc files */
355
356 UINT64 DtCompilerParserResult; /* Expression return value */
357 int
358 DtCompilerParserparse (
359 void);
360
361 UINT64
362 DtEvaluateExpression (
363 char *ExprString);
364
365 void
366 DtCompilerInitLexer (
367 FILE *inFile);
368
369 void
370 DtCompilerTerminateLexer (
371 void);
372
373 int
374 DtInitLexer (
375 char *String);
376
377 void
378 DtTerminateLexer (
379 void);
380
381 char *
382 DtGetOpName (
383 UINT32 ParseOpcode);
384
385
386 /* dtutils - Miscellaneous utilities */
387
388 typedef
389 void (*DT_WALK_CALLBACK) (
390 DT_SUBTABLE *Subtable,
391 void *Context,
392 void *ReturnValue);
393
394 void
395 DtWalkTableTree (
396 DT_SUBTABLE *StartTable,
397 DT_WALK_CALLBACK UserFunction,
398 void *Context,
399 void *ReturnValue);
400
401 void
402 DtError (
403 UINT8 Level,
404 UINT16 MessageId,
405 DT_FIELD *FieldObject,
406 char *ExtraMessage);
407
408 void
409 DtNameError (
410 UINT8 Level,
411 UINT16 MessageId,
412 DT_FIELD *FieldObject,
413 char *ExtraMessage);
414
415 void
416 DtFatal (
417 UINT16 MessageId,
418 DT_FIELD *FieldObject,
419 char *ExtraMessage);
420
421 UINT64
422 DtDoConstant (
423 char *String);
424
425 char*
426 DtGetFieldValue (
427 DT_FIELD *Field);
428
429 UINT8
430 DtGetFieldType (
431 ACPI_DMTABLE_INFO *Info);
432
433 UINT32
434 DtGetBufferLength (
435 char *Buffer);
436
437 UINT32
438 DtGetFieldLength (
439 DT_FIELD *Field,
440 ACPI_DMTABLE_INFO *Info);
441
442 void
443 DtSetTableChecksum (
444 UINT8 *ChecksumPointer);
445
446 void
447 DtSetTableLength(
448 void);
449
450
451 /* dttable - individual table compilation */
452
453 ACPI_STATUS
454 DtCompileFacs (
455 DT_FIELD **PFieldList);
456
457 ACPI_STATUS
458 DtCompileRsdp (
459 DT_FIELD **PFieldList);
460
461 ACPI_STATUS
462 DtCompileAsf (
463 void **PFieldList);
464
465 ACPI_STATUS
466 DtCompileCpep (
467 void **PFieldList);
468
469 ACPI_STATUS
470 DtCompileCsrt (
471 void **PFieldList);
472
473 ACPI_STATUS
474 DtCompileDbg2 (
475 void **PFieldList);
476
477 ACPI_STATUS
478 DtCompileDmar (
479 void **PFieldList);
480
481 ACPI_STATUS
482 DtCompileDrtm (
483 void **PFieldList);
484
485 ACPI_STATUS
486 DtCompileEinj (
487 void **PFieldList);
488
489 ACPI_STATUS
490 DtCompileErst (
491 void **PFieldList);
492
493 ACPI_STATUS
494 DtCompileFadt (
495 void **PFieldList);
496
497 ACPI_STATUS
498 DtCompileFpdt (
499 void **PFieldList);
500
501 ACPI_STATUS
502 DtCompileGtdt (
503 void **PFieldList);
504
505 ACPI_STATUS
506 DtCompileHest (
507 void **PFieldList);
508
509 ACPI_STATUS
510 DtCompileHmat (
511 void **PFieldList);
512
513 ACPI_STATUS
514 DtCompileIort (
515 void **PFieldList);
516
517 ACPI_STATUS
518 DtCompileIvrs (
519 void **PFieldList);
520
521 ACPI_STATUS
522 DtCompileLpit (
523 void **PFieldList);
524
525 ACPI_STATUS
526 DtCompileMadt (
527 void **PFieldList);
528
529 ACPI_STATUS
530 DtCompileMcfg (
531 void **PFieldList);
532
533 ACPI_STATUS
534 DtCompileMpst (
535 void **PFieldList);
536
537 ACPI_STATUS
538 DtCompileMsct (
539 void **PFieldList);
540
541 ACPI_STATUS
542 DtCompileMtmr (
543 void **PFieldList);
544
545 ACPI_STATUS
546 DtCompileNfit (
547 void **PFieldList);
548
549 ACPI_STATUS
550 DtCompilePcct (
551 void **PFieldList);
552
553 ACPI_STATUS
554 DtCompilePdtt (
555 void **PFieldList);
556
557 ACPI_STATUS
558 DtCompilePmtt (
559 void **PFieldList);
560
561 ACPI_STATUS
562 DtCompilePptt (
563 void **PFieldList);
564
565 ACPI_STATUS
566 DtCompileRsdt (
567 void **PFieldList);
568
569 ACPI_STATUS
570 DtCompileS3pt (
571 DT_FIELD **PFieldList);
572
573 ACPI_STATUS
574 DtCompileSdev (
575 void **PFieldList);
576
577 ACPI_STATUS
578 DtCompileSlic (
579 void **PFieldList);
580
581 ACPI_STATUS
582 DtCompileSlit (
583 void **PFieldList);
584
585 ACPI_STATUS
586 DtCompileSrat (
587 void **PFieldList);
588
589 ACPI_STATUS
590 DtCompileStao (
591 void **PFieldList);
592
593 ACPI_STATUS
594 DtCompileTcpa (
595 void **PFieldList);
596
597 ACPI_STATUS
598 DtCompileTpm2 (
599 void **PFieldList);
600
601 ACPI_STATUS
602 DtCompileUefi (
603 void **PFieldList);
604
605 ACPI_STATUS
606 DtCompileVrtc (
607 void **PFieldList);
608
609 ACPI_STATUS
610 DtCompileWdat (
611 void **PFieldList);
612
613 ACPI_STATUS
614 DtCompileWpbt (
615 void **PFieldList);
616
617 ACPI_STATUS
618 DtCompileXsdt (
619 void **PFieldList);
620
621 ACPI_STATUS
622 DtCompileGeneric (
623 void **PFieldList,
624 char *TermFieldName,
625 UINT32 *PFieldLength);
626
627 ACPI_DMTABLE_INFO *
628 DtGetGenericTableInfo (
629 char *Name);
630
631 /* ACPI Table templates */
632
633 extern const unsigned char TemplateAsf[];
634 extern const unsigned char TemplateBoot[];
635 extern const unsigned char TemplateBert[];
636 extern const unsigned char TemplateBgrt[];
637 extern const unsigned char TemplateCpep[];
638 extern const unsigned char TemplateCsrt[];
639 extern const unsigned char TemplateDbg2[];
640 extern const unsigned char TemplateDbgp[];
641 extern const unsigned char TemplateDmar[];
642 extern const unsigned char TemplateDrtm[];
643 extern const unsigned char TemplateEcdt[];
644 extern const unsigned char TemplateEinj[];
645 extern const unsigned char TemplateErst[];
646 extern const unsigned char TemplateFadt[];
647 extern const unsigned char TemplateFpdt[];
648 extern const unsigned char TemplateGtdt[];
649 extern const unsigned char TemplateHest[];
650 extern const unsigned char TemplateHmat[];
651 extern const unsigned char TemplateHpet[];
652 extern const unsigned char TemplateIort[];
653 extern const unsigned char TemplateIvrs[];
654 extern const unsigned char TemplateLpit[];
655 extern const unsigned char TemplateMadt[];
656 extern const unsigned char TemplateMcfg[];
657 extern const unsigned char TemplateMchi[];
658 extern const unsigned char TemplateMpst[];
659 extern const unsigned char TemplateMsct[];
660 extern const unsigned char TemplateMsdm[];
661 extern const unsigned char TemplateMtmr[];
662 extern const unsigned char TemplateNfit[];
663 extern const unsigned char TemplatePcct[];
664 extern const unsigned char TemplatePdtt[];
665 extern const unsigned char TemplatePmtt[];
666 extern const unsigned char TemplatePptt[];
667 extern const unsigned char TemplateRasf[];
668 extern const unsigned char TemplateRsdt[];
669 extern const unsigned char TemplateS3pt[];
670 extern const unsigned char TemplateSbst[];
671 extern const unsigned char TemplateSdei[];
672 extern const unsigned char TemplateSdev[];
673 extern const unsigned char TemplateSlic[];
674 extern const unsigned char TemplateSlit[];
675 extern const unsigned char TemplateSpcr[];
676 extern const unsigned char TemplateSpmi[];
677 extern const unsigned char TemplateSrat[];
678 extern const unsigned char TemplateStao[];
679 extern const unsigned char TemplateTcpa[];
680 extern const unsigned char TemplateTpm2[];
681 extern const unsigned char TemplateUefi[];
682 extern const unsigned char TemplateVrtc[];
683 extern const unsigned char TemplateWaet[];
684 extern const unsigned char TemplateWdat[];
685 extern const unsigned char TemplateWddt[];
686 extern const unsigned char TemplateWdrt[];
687 extern const unsigned char TemplateWpbt[];
688 extern const unsigned char TemplateWsmt[];
689 extern const unsigned char TemplateXenv[];
690 extern const unsigned char TemplateXsdt[];
691
692 #endif
693