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