Home | History | Annotate | Line # | Download | only in compiler
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