1 /****************************************************************************** 2 * 3 * Module Name: dttemplate - ACPI table template generation 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2015, 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 #include <contrib/dev/acpica/compiler/aslcompiler.h> 45 #include <contrib/dev/acpica/include/acapps.h> 46 #include <contrib/dev/acpica/compiler/dtcompiler.h> 47 #include <contrib/dev/acpica/compiler/dttemplate.h> /* Contains the hex ACPI table templates */ 48 49 #define _COMPONENT DT_COMPILER 50 ACPI_MODULE_NAME ("dttemplate") 51 52 53 /* Local prototypes */ 54 55 static BOOLEAN 56 AcpiUtIsSpecialTable ( 57 char *Signature); 58 59 static ACPI_STATUS 60 DtCreateOneTemplate ( 61 char *Signature, 62 const ACPI_DMTABLE_DATA *TableData); 63 64 static ACPI_STATUS 65 DtCreateAllTemplates ( 66 void); 67 68 69 /******************************************************************************* 70 * 71 * FUNCTION: AcpiUtIsSpecialTable 72 * 73 * PARAMETERS: Signature - ACPI table signature 74 * 75 * RETURN: TRUE if signature is a special ACPI table 76 * 77 * DESCRIPTION: Check for valid ACPI tables that are not in the main ACPI 78 * table data structure (AcpiDmTableData). 79 * 80 ******************************************************************************/ 81 82 static BOOLEAN 83 AcpiUtIsSpecialTable ( 84 char *Signature) 85 { 86 87 if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) || 88 ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT) || 89 ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT) || 90 ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS) || 91 ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME)) 92 { 93 return (TRUE); 94 } 95 96 return (FALSE); 97 } 98 99 100 /******************************************************************************* 101 * 102 * FUNCTION: DtCreateTemplates 103 * 104 * PARAMETERS: Signature - ACPI table signature 105 * 106 * RETURN: Status 107 * 108 * DESCRIPTION: Create one or more template files. 109 * 110 ******************************************************************************/ 111 112 ACPI_STATUS 113 DtCreateTemplates ( 114 char *Signature) 115 { 116 const ACPI_DMTABLE_DATA *TableData; 117 ACPI_STATUS Status; 118 119 120 AslInitializeGlobals (); 121 122 /* Default (no signature) is DSDT */ 123 124 if (!Signature) 125 { 126 Signature = "DSDT"; 127 goto GetTemplate; 128 } 129 130 AcpiUtStrupr (Signature); 131 if (!strcmp (Signature, "ALL") || 132 !strcmp (Signature, "*")) 133 { 134 /* Create all available/known templates */ 135 136 Status = DtCreateAllTemplates (); 137 return (Status); 138 } 139 140 /* 141 * Validate signature and get the template data: 142 * 1) Signature must be 4 characters 143 * 2) Signature must be a recognized ACPI table 144 * 3) There must be a template associated with the signature 145 */ 146 if (strlen (Signature) != ACPI_NAME_SIZE) 147 { 148 fprintf (stderr, 149 "%s: Invalid ACPI table signature (length must be 4 characters)\n", 150 Signature); 151 return (AE_ERROR); 152 } 153 154 /* 155 * Some slack for the two strange tables whose name is different than 156 * their signatures: MADT->APIC and FADT->FACP. 157 */ 158 if (!strcmp (Signature, "MADT")) 159 { 160 Signature = "APIC"; 161 } 162 else if (!strcmp (Signature, "FADT")) 163 { 164 Signature = "FACP"; 165 } 166 167 GetTemplate: 168 TableData = AcpiDmGetTableData (Signature); 169 if (TableData) 170 { 171 if (!TableData->Template) 172 { 173 fprintf (stderr, "%4.4s: No template available\n", Signature); 174 return (AE_ERROR); 175 } 176 } 177 else if (!AcpiUtIsSpecialTable (Signature)) 178 { 179 fprintf (stderr, 180 "%4.4s: Unrecognized ACPI table signature\n", Signature); 181 return (AE_ERROR); 182 } 183 184 Status = AdInitialize (); 185 if (ACPI_FAILURE (Status)) 186 { 187 return (Status); 188 } 189 190 Status = DtCreateOneTemplate (Signature, TableData); 191 192 193 /* Shutdown ACPICA subsystem */ 194 195 (void) AcpiTerminate (); 196 CmDeleteCaches (); 197 return (Status); 198 } 199 200 201 /******************************************************************************* 202 * 203 * FUNCTION: DtCreateAllTemplates 204 * 205 * PARAMETERS: None 206 * 207 * RETURN: Status 208 * 209 * DESCRIPTION: Create all currently defined template files 210 * 211 ******************************************************************************/ 212 213 static ACPI_STATUS 214 DtCreateAllTemplates ( 215 void) 216 { 217 const ACPI_DMTABLE_DATA *TableData; 218 ACPI_STATUS Status; 219 220 221 Status = AdInitialize (); 222 if (ACPI_FAILURE (Status)) 223 { 224 return (Status); 225 } 226 227 fprintf (stderr, "Creating all supported Template files\n"); 228 229 /* Walk entire ACPI table data structure */ 230 231 for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 232 { 233 /* If table has a template, create the template file */ 234 235 if (TableData->Template) 236 { 237 Status = DtCreateOneTemplate (TableData->Signature, 238 TableData); 239 if (ACPI_FAILURE (Status)) 240 { 241 return (Status); 242 } 243 } 244 } 245 246 /* 247 * Create the special ACPI tables: 248 * 1) DSDT/SSDT are AML tables, not data tables 249 * 2) FACS and RSDP have non-standard headers 250 */ 251 Status = DtCreateOneTemplate (ACPI_SIG_DSDT, NULL); 252 if (ACPI_FAILURE (Status)) 253 { 254 return (Status); 255 } 256 257 Status = DtCreateOneTemplate (ACPI_SIG_SSDT, NULL); 258 if (ACPI_FAILURE (Status)) 259 { 260 return (Status); 261 } 262 263 Status = DtCreateOneTemplate (ACPI_SIG_FACS, NULL); 264 if (ACPI_FAILURE (Status)) 265 { 266 return (Status); 267 } 268 269 Status = DtCreateOneTemplate (ACPI_RSDP_NAME, NULL); 270 if (ACPI_FAILURE (Status)) 271 { 272 return (Status); 273 } 274 275 return (AE_OK); 276 } 277 278 279 /******************************************************************************* 280 * 281 * FUNCTION: DtCreateOneTemplate 282 * 283 * PARAMETERS: Signature - ACPI signature, NULL terminated. 284 * TableData - Entry in ACPI table data structure. 285 * NULL if a special ACPI table. 286 * 287 * RETURN: Status 288 * 289 * DESCRIPTION: Create one template source file for the requested ACPI table. 290 * 291 ******************************************************************************/ 292 293 static ACPI_STATUS 294 DtCreateOneTemplate ( 295 char *Signature, 296 const ACPI_DMTABLE_DATA *TableData) 297 { 298 char *DisasmFilename; 299 FILE *File; 300 ACPI_STATUS Status = AE_OK; 301 ACPI_SIZE Actual; 302 303 304 /* New file will have a .asl suffix */ 305 306 DisasmFilename = FlGenerateFilename ( 307 Signature, FILE_SUFFIX_ASL_CODE); 308 if (!DisasmFilename) 309 { 310 fprintf (stderr, "Could not generate output filename\n"); 311 return (AE_ERROR); 312 } 313 314 /* Probably should prompt to overwrite the file */ 315 316 AcpiUtStrlwr (DisasmFilename); 317 File = fopen (DisasmFilename, "w+"); 318 if (!File) 319 { 320 fprintf (stderr, "Could not open output file %s\n", DisasmFilename); 321 return (AE_ERROR); 322 } 323 324 /* Emit the common file header */ 325 326 AcpiOsRedirectOutput (File); 327 328 AcpiOsPrintf ("/*\n"); 329 AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * ")); 330 331 AcpiOsPrintf (" * Template for [%4.4s] ACPI Table", 332 Signature); 333 334 /* Dump the actual ACPI table */ 335 336 if (TableData) 337 { 338 /* Normal case, tables that appear in AcpiDmTableData */ 339 340 AcpiOsPrintf (" (static data table)\n"); 341 342 if (Gbl_VerboseTemplates) 343 { 344 AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]" 345 " FieldName : HexFieldValue\n */\n\n"); 346 } 347 else 348 { 349 AcpiOsPrintf (" * Format: [ByteLength]" 350 " FieldName : HexFieldValue\n */\n"); 351 } 352 353 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, 354 TableData->Template)); 355 } 356 else 357 { 358 /* Special ACPI tables - DSDT, SSDT, OSDT, FADT, RSDP */ 359 360 AcpiOsPrintf (" (AML byte code table)\n"); 361 362 AcpiOsPrintf (" */\n"); 363 if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT)) 364 { 365 Actual = fwrite (TemplateDsdt, 1, sizeof (TemplateDsdt) -1, File); 366 if (Actual != sizeof (TemplateDsdt) -1) 367 { 368 fprintf (stderr, 369 "Could not write to output file %s\n", DisasmFilename); 370 Status = AE_ERROR; 371 goto Cleanup; 372 } 373 } 374 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) 375 { 376 Actual = fwrite (TemplateSsdt, 1, sizeof (TemplateSsdt) -1, File); 377 if (Actual != sizeof (TemplateSsdt) -1) 378 { 379 fprintf (stderr, 380 "Could not write to output file %s\n", DisasmFilename); 381 Status = AE_ERROR; 382 goto Cleanup; 383 } 384 } 385 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT)) 386 { 387 Actual = fwrite (TemplateOsdt, 1, sizeof (TemplateOsdt) -1, File); 388 if (Actual != sizeof (TemplateOsdt) -1) 389 { 390 fprintf (stderr, 391 "Could not write to output file %s\n", DisasmFilename); 392 Status = AE_ERROR; 393 goto Cleanup; 394 } 395 } 396 else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) /* FADT */ 397 { 398 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, 399 TemplateFacs)); 400 } 401 else if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME)) 402 { 403 AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, 404 TemplateRsdp)); 405 } 406 else 407 { 408 fprintf (stderr, 409 "%4.4s, Unrecognized ACPI table signature\n", Signature); 410 Status = AE_ERROR; 411 goto Cleanup; 412 } 413 } 414 415 fprintf (stderr, 416 "Created ACPI table template for [%4.4s], written to \"%s\"\n", 417 Signature, DisasmFilename); 418 419 Cleanup: 420 fclose (File); 421 AcpiOsRedirectOutput (stdout); 422 return (Status); 423 } 424