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