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