dtcompiler.h revision 1.1.1.23 1 /******************************************************************************
2 *
3 * Module Name: dtcompiler.h - header for data table compiler
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2022, 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 MERCHANTABILITY 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 int
357 DtCompilerParserparse (
358 void);
359
360 UINT64
361 DtEvaluateExpression (
362 char *ExprString);
363
364 void
365 DtCompilerInitLexer (
366 FILE *inFile);
367
368 void
369 DtCompilerTerminateLexer (
370 void);
371
372 int
373 DtInitLexer (
374 char *String);
375
376 void
377 DtTerminateLexer (
378 void);
379
380 char *
381 DtGetOpName (
382 UINT32 ParseOpcode);
383
384
385 /* dtutils - Miscellaneous utilities */
386
387 typedef
388 void (*DT_WALK_CALLBACK) (
389 DT_SUBTABLE *Subtable,
390 void *Context,
391 void *ReturnValue);
392
393 void
394 DtWalkTableTree (
395 DT_SUBTABLE *StartTable,
396 DT_WALK_CALLBACK UserFunction,
397 void *Context,
398 void *ReturnValue);
399
400 void
401 DtError (
402 UINT8 Level,
403 UINT16 MessageId,
404 DT_FIELD *FieldObject,
405 char *ExtraMessage);
406
407 void
408 DtNameError (
409 UINT8 Level,
410 UINT16 MessageId,
411 DT_FIELD *FieldObject,
412 char *ExtraMessage);
413
414 void
415 DtFatal (
416 UINT16 MessageId,
417 DT_FIELD *FieldObject,
418 char *ExtraMessage);
419
420 UINT64
421 DtDoConstant (
422 char *String);
423
424 char*
425 DtGetFieldValue (
426 DT_FIELD *Field);
427
428 UINT8
429 DtGetFieldType (
430 ACPI_DMTABLE_INFO *Info);
431
432 UINT32
433 DtGetBufferLength (
434 char *Buffer);
435
436 UINT32
437 DtGetFieldLength (
438 DT_FIELD *Field,
439 ACPI_DMTABLE_INFO *Info);
440
441 void
442 DtSetTableChecksum (
443 UINT8 *ChecksumPointer);
444
445 void
446 DtSetTableLength(
447 void);
448
449
450 /* dttable - individual table compilation */
451
452 ACPI_STATUS
453 DtCompileFacs (
454 DT_FIELD **PFieldList);
455
456 ACPI_STATUS
457 DtCompileRsdp (
458 DT_FIELD **PFieldList);
459
460 ACPI_STATUS
461 DtCompileAest (
462 void **PFieldList);
463
464 ACPI_STATUS
465 DtCompileApmt (
466 void **PFieldList);
467
468 ACPI_STATUS
469 DtCompileAsf (
470 void **PFieldList);
471
472 ACPI_STATUS
473 DtCompileCpep (
474 void **PFieldList);
475
476 ACPI_STATUS
477 DtCompileCedt (
478 void **PFieldList);
479
480 ACPI_STATUS
481 DtCompileCsrt (
482 void **PFieldList);
483
484 ACPI_STATUS
485 DtCompileDbg2 (
486 void **PFieldList);
487
488 ACPI_STATUS
489 DtCompileDmar (
490 void **PFieldList);
491
492 ACPI_STATUS
493 DtCompileDrtm (
494 void **PFieldList);
495
496 ACPI_STATUS
497 DtCompileEinj (
498 void **PFieldList);
499
500 ACPI_STATUS
501 DtCompileErst (
502 void **PFieldList);
503
504 ACPI_STATUS
505 DtCompileFadt (
506 void **PFieldList);
507
508 ACPI_STATUS
509 DtCompileFpdt (
510 void **PFieldList);
511
512 ACPI_STATUS
513 DtCompileGtdt (
514 void **PFieldList);
515
516 ACPI_STATUS
517 DtCompileHest (
518 void **PFieldList);
519
520 ACPI_STATUS
521 DtCompileHmat (
522 void **PFieldList);
523
524 ACPI_STATUS
525 DtCompileIort (
526 void **PFieldList);
527
528 ACPI_STATUS
529 DtCompileIvrs (
530 void **PFieldList);
531
532 ACPI_STATUS
533 DtCompileLpit (
534 void **PFieldList);
535
536 ACPI_STATUS
537 DtCompileMadt (
538 void **PFieldList);
539
540 ACPI_STATUS
541 DtCompileMcfg (
542 void **PFieldList);
543
544 ACPI_STATUS
545 DtCompileMpst (
546 void **PFieldList);
547
548 ACPI_STATUS
549 DtCompileMsct (
550 void **PFieldList);
551
552 ACPI_STATUS
553 DtCompileNfit (
554 void **PFieldList);
555
556 ACPI_STATUS
557 DtCompileNhlt (
558 void **PFieldList);
559
560 ACPI_STATUS
561 DtCompilePcct (
562 void **PFieldList);
563
564 ACPI_STATUS
565 DtCompilePdtt (
566 void **PFieldList);
567
568 ACPI_STATUS
569 DtCompilePhat (
570 void **PFieldList);
571
572 ACPI_STATUS
573 DtCompilePmtt (
574 void **PFieldList);
575
576 ACPI_STATUS
577 DtCompilePptt (
578 void **PFieldList);
579
580 ACPI_STATUS
581 DtCompilePrmt (
582 void **PFieldList);
583
584 ACPI_STATUS
585 DtCompileRgrt (
586 void **PFieldList);
587
588 ACPI_STATUS
589 DtCompileRsdt (
590 void **PFieldList);
591
592 ACPI_STATUS
593 DtCompileS3pt (
594 DT_FIELD **PFieldList);
595
596 ACPI_STATUS
597 DtCompileSdev (
598 void **PFieldList);
599
600 ACPI_STATUS
601 DtCompileSlic (
602 void **PFieldList);
603
604 ACPI_STATUS
605 DtCompileSlit (
606 void **PFieldList);
607
608 ACPI_STATUS
609 DtCompileSrat (
610 void **PFieldList);
611
612 ACPI_STATUS
613 DtCompileStao (
614 void **PFieldList);
615
616 ACPI_STATUS
617 DtCompileSvkl (
618 void **PFieldList);
619
620 ACPI_STATUS
621 DtCompileTcpa (
622 void **PFieldList);
623
624 ACPI_STATUS
625 DtCompileTpm2 (
626 void **PFieldList);
627
628 ACPI_STATUS
629 DtCompileUefi (
630 void **PFieldList);
631
632 ACPI_STATUS
633 DtCompileViot (
634 void **PFieldList);
635
636 ACPI_STATUS
637 DtCompileWdat (
638 void **PFieldList);
639
640 ACPI_STATUS
641 DtCompileWpbt (
642 void **PFieldList);
643
644 ACPI_STATUS
645 DtCompileXsdt (
646 void **PFieldList);
647
648 ACPI_STATUS
649 DtCompileGeneric (
650 void **PFieldList,
651 char *TermFieldName,
652 UINT32 *PFieldLength);
653
654 ACPI_DMTABLE_INFO *
655 DtGetGenericTableInfo (
656 char *Name);
657
658 /* ACPI Table templates */
659
660 extern const unsigned char TemplateAest[];
661 extern const unsigned char TemplateAgdi[];
662 extern const unsigned char TemplateApmt[];
663 extern const unsigned char TemplateAsf[];
664 extern const unsigned char TemplateBoot[];
665 extern const unsigned char TemplateBdat[];
666 extern const unsigned char TemplateBert[];
667 extern const unsigned char TemplateBgrt[];
668 extern const unsigned char TemplateCedt[];
669 extern const unsigned char TemplateCpep[];
670 extern const unsigned char TemplateCsrt[];
671 extern const unsigned char TemplateDbg2[];
672 extern const unsigned char TemplateDbgp[];
673 extern const unsigned char TemplateDmar[];
674 extern const unsigned char TemplateDrtm[];
675 extern const unsigned char TemplateEcdt[];
676 extern const unsigned char TemplateEinj[];
677 extern const unsigned char TemplateErst[];
678 extern const unsigned char TemplateFadt[];
679 extern const unsigned char TemplateFpdt[];
680 extern const unsigned char TemplateGtdt[];
681 extern const unsigned char TemplateHest[];
682 extern const unsigned char TemplateHmat[];
683 extern const unsigned char TemplateHpet[];
684 extern const unsigned char TemplateIort[];
685 extern const unsigned char TemplateIvrs[];
686 extern const unsigned char TemplateLpit[];
687 extern const unsigned char TemplateMadt[];
688 extern const unsigned char TemplateMcfg[];
689 extern const unsigned char TemplateMchi[];
690 extern const unsigned char TemplateMpst[];
691 extern const unsigned char TemplateMsct[];
692 extern const unsigned char TemplateMsdm[];
693 extern const unsigned char TemplateNfit[];
694 extern const unsigned char TemplateNhlt[];
695 extern const unsigned char TemplatePcct[];
696 extern const unsigned char TemplatePdtt[];
697 extern const unsigned char TemplatePhat[];
698 extern const unsigned char TemplatePmtt[];
699 extern const unsigned char TemplatePptt[];
700 extern const unsigned char TemplatePrmt[];
701 extern const unsigned char TemplateRasf[];
702 extern const unsigned char TemplateRgrt[];
703 extern const unsigned char TemplateRsdt[];
704 extern const unsigned char TemplateS3pt[];
705 extern const unsigned char TemplateSbst[];
706 extern const unsigned char TemplateSdei[];
707 extern const unsigned char TemplateSdev[];
708 extern const unsigned char TemplateSlic[];
709 extern const unsigned char TemplateSlit[];
710 extern const unsigned char TemplateSpcr[];
711 extern const unsigned char TemplateSpmi[];
712 extern const unsigned char TemplateSrat[];
713 extern const unsigned char TemplateStao[];
714 extern const unsigned char TemplateSvkl[];
715 extern const unsigned char TemplateTcpa[];
716 extern const unsigned char TemplateTdel[];
717 extern const unsigned char TemplateTpm2[];
718 extern const unsigned char TemplateUefi[];
719 extern const unsigned char TemplateViot[];
720 extern const unsigned char TemplateWaet[];
721 extern const unsigned char TemplateWdat[];
722 extern const unsigned char TemplateWddt[];
723 extern const unsigned char TemplateWdrt[];
724 extern const unsigned char TemplateWpbt[];
725 extern const unsigned char TemplateWsmt[];
726 extern const unsigned char TemplateXenv[];
727 extern const unsigned char TemplateXsdt[];
728
729 #endif
730