Home | History | Annotate | Line # | Download | only in compiler
aslhex.c revision 1.1
      1 /******************************************************************************
      2  *
      3  * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL)
      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 
     45 #include "aslcompiler.h"
     46 
     47 #define _COMPONENT          ACPI_COMPILER
     48         ACPI_MODULE_NAME    ("ashex")
     49 
     50 /*
     51  * This module emits ASCII hex output files in either C, ASM, or ASL format
     52  */
     53 
     54 
     55 /* Local prototypes */
     56 
     57 static void
     58 HxDoHexOutputC (
     59     void);
     60 
     61 static void
     62 HxDoHexOutputAsl (
     63     void);
     64 
     65 static void
     66 HxDoHexOutputAsm (
     67     void);
     68 
     69 static UINT32
     70 HxReadAmlOutputFile (
     71     UINT8                   *Buffer);
     72 
     73 
     74 /*******************************************************************************
     75  *
     76  * FUNCTION:    HxDoHexOutput
     77  *
     78  * PARAMETERS:  None
     79  *
     80  * RETURN:      None
     81  *
     82  * DESCRIPTION: Create the hex output file. Note: data is obtained by reading
     83  *              the entire AML output file that was previously generated.
     84  *
     85  ******************************************************************************/
     86 
     87 void
     88 HxDoHexOutput (
     89     void)
     90 {
     91 
     92     switch (Gbl_HexOutputFlag)
     93     {
     94     case HEX_OUTPUT_C:
     95 
     96         HxDoHexOutputC ();
     97         break;
     98 
     99     case HEX_OUTPUT_ASM:
    100 
    101         HxDoHexOutputAsm ();
    102         break;
    103 
    104     case HEX_OUTPUT_ASL:
    105 
    106         HxDoHexOutputAsl ();
    107         break;
    108 
    109     default:
    110 
    111         /* No other output types supported */
    112 
    113         break;
    114     }
    115 }
    116 
    117 
    118 /*******************************************************************************
    119  *
    120  * FUNCTION:    HxReadAmlOutputFile
    121  *
    122  * PARAMETERS:  Buffer              - Where to return data
    123  *
    124  * RETURN:      None
    125  *
    126  * DESCRIPTION: Read a line of the AML output prior to formatting the data
    127  *
    128  ******************************************************************************/
    129 
    130 static UINT32
    131 HxReadAmlOutputFile (
    132     UINT8                   *Buffer)
    133 {
    134     UINT32                  Actual;
    135 
    136 
    137     Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE,
    138         Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
    139 
    140     if (ferror (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle))
    141     {
    142         FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
    143         AslAbort ();
    144     }
    145 
    146     return (Actual);
    147 }
    148 
    149 
    150 /*******************************************************************************
    151  *
    152  * FUNCTION:    HxDoHexOutputC
    153  *
    154  * PARAMETERS:  None
    155  *
    156  * RETURN:      None
    157  *
    158  * DESCRIPTION: Create the hex output file. This is the same data as the AML
    159  *              output file, but formatted into hex/ascii bytes suitable for
    160  *              inclusion into a C source file.
    161  *
    162  ******************************************************************************/
    163 
    164 static void
    165 HxDoHexOutputC (
    166     void)
    167 {
    168     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
    169     UINT32                  LineLength;
    170     UINT32                  Offset = 0;
    171     UINT32                  AmlFileSize;
    172     UINT32                  i;
    173 
    174 
    175     /* Get AML size, seek back to start */
    176 
    177     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
    178     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
    179 
    180     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n");
    181     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
    182         AmlFileSize);
    183     FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n");
    184 
    185     while (Offset < AmlFileSize)
    186     {
    187         /* Read enough bytes needed for one output line */
    188 
    189         LineLength = HxReadAmlOutputFile (FileData);
    190         if (!LineLength)
    191         {
    192             break;
    193         }
    194 
    195         FlPrintFile (ASL_FILE_HEX_OUTPUT, "    ");
    196 
    197         for (i = 0; i < LineLength; i++)
    198         {
    199             /*
    200              * Print each hex byte.
    201              * Add a comma until the very last byte of the AML file
    202              * (Some C compilers complain about a trailing comma)
    203              */
    204             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
    205             if ((Offset + i + 1) < AmlFileSize)
    206             {
    207                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
    208             }
    209             else
    210             {
    211                 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
    212             }
    213         }
    214 
    215         /* Add fill spaces if needed for last line */
    216 
    217         if (LineLength < HEX_TABLE_LINE_SIZE)
    218         {
    219             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
    220                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
    221         }
    222 
    223         /* Emit the offset and ascii dump for the entire line */
    224 
    225         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
    226         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
    227         FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
    228             HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
    229 
    230         Offset += LineLength;
    231     }
    232 
    233     FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n");
    234 }
    235 
    236 
    237 /*******************************************************************************
    238  *
    239  * FUNCTION:    HxDoHexOutputAsl
    240  *
    241  * PARAMETERS:  None
    242  *
    243  * RETURN:      None
    244  *
    245  * DESCRIPTION: Create the hex output file. This is the same data as the AML
    246  *              output file, but formatted into hex/ascii bytes suitable for
    247  *              inclusion into a C source file.
    248  *
    249  ******************************************************************************/
    250 
    251 static void
    252 HxDoHexOutputAsl (
    253     void)
    254 {
    255     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
    256     UINT32                  LineLength;
    257     UINT32                  Offset = 0;
    258     UINT32                  AmlFileSize;
    259     UINT32                  i;
    260 
    261 
    262     /* Get AML size, seek back to start */
    263 
    264     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
    265     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
    266 
    267     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n");
    268     FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
    269         AmlFileSize);
    270     FlPrintFile (ASL_FILE_HEX_OUTPUT, "    Name (BUF1, Buffer()\n    {\n");
    271 
    272     while (Offset < AmlFileSize)
    273     {
    274         /* Read enough bytes needed for one output line */
    275 
    276         LineLength = HxReadAmlOutputFile (FileData);
    277         if (!LineLength)
    278         {
    279             break;
    280         }
    281 
    282         FlPrintFile (ASL_FILE_HEX_OUTPUT, "        ");
    283 
    284         for (i = 0; i < LineLength; i++)
    285         {
    286             /*
    287              * Print each hex byte.
    288              * Add a comma until the very last byte of the AML file
    289              * (Some C compilers complain about a trailing comma)
    290              */
    291             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
    292             if ((Offset + i + 1) < AmlFileSize)
    293             {
    294                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
    295             }
    296             else
    297             {
    298                 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
    299             }
    300         }
    301 
    302         /* Add fill spaces if needed for last line */
    303 
    304         if (LineLength < HEX_TABLE_LINE_SIZE)
    305         {
    306             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
    307                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
    308         }
    309 
    310         /* Emit the offset and ascii dump for the entire line */
    311 
    312         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
    313         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
    314         FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
    315             HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
    316 
    317         Offset += LineLength;
    318     }
    319 
    320     FlPrintFile (ASL_FILE_HEX_OUTPUT, "    })\n");
    321 }
    322 
    323 
    324 /*******************************************************************************
    325  *
    326  * FUNCTION:    HxDoHexOutputAsm
    327  *
    328  * PARAMETERS:  None
    329  *
    330  * RETURN:      None
    331  *
    332  * DESCRIPTION: Create the hex output file. This is the same data as the AML
    333  *              output file, but formatted into hex/ascii bytes suitable for
    334  *              inclusion into a ASM source file.
    335  *
    336  ******************************************************************************/
    337 
    338 static void
    339 HxDoHexOutputAsm (
    340     void)
    341 {
    342     UINT8                   FileData[HEX_TABLE_LINE_SIZE];
    343     UINT32                  LineLength;
    344     UINT32                  Offset = 0;
    345     UINT32                  AmlFileSize;
    346     UINT32                  i;
    347 
    348 
    349     /* Get AML size, seek back to start */
    350 
    351     AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
    352     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
    353 
    354     FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n");
    355     FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n",
    356         AmlFileSize);
    357 
    358     while (Offset < AmlFileSize)
    359     {
    360         /* Read enough bytes needed for one output line */
    361 
    362         LineLength = HxReadAmlOutputFile (FileData);
    363         if (!LineLength)
    364         {
    365             break;
    366         }
    367 
    368         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  db  ");
    369 
    370         for (i = 0; i < LineLength; i++)
    371         {
    372             /*
    373              * Print each hex byte.
    374              * Add a comma until the last byte of the line
    375              */
    376             FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]);
    377             if ((i + 1) < LineLength)
    378             {
    379                 FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
    380             }
    381         }
    382 
    383         FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
    384 
    385         /* Add fill spaces if needed for last line */
    386 
    387         if (LineLength < HEX_TABLE_LINE_SIZE)
    388         {
    389             FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
    390                 5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
    391         }
    392 
    393         /* Emit the offset and ascii dump for the entire line */
    394 
    395         FlPrintFile (ASL_FILE_HEX_OUTPUT, "  ; %8.8X", Offset);
    396         LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
    397         FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
    398 
    399         Offset += LineLength;
    400     }
    401 
    402     FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
    403 }
    404