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