Home | History | Annotate | Line # | Download | only in compiler
dttemplate.c revision 1.1.1.4.2.2
      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 "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     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