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