aslhex.c revision 1.1.1.8
11.1Schristos/******************************************************************************
21.1Schristos *
31.1Schristos * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL)
41.1Schristos *
51.1Schristos *****************************************************************************/
61.1Schristos
71.1Schristos/*
81.1.1.6Schristos * Copyright (C) 2000 - 2018, Intel Corp.
91.1Schristos * All rights reserved.
101.1Schristos *
111.1Schristos * Redistribution and use in source and binary forms, with or without
121.1Schristos * modification, are permitted provided that the following conditions
131.1Schristos * are met:
141.1Schristos * 1. Redistributions of source code must retain the above copyright
151.1Schristos *    notice, this list of conditions, and the following disclaimer,
161.1Schristos *    without modification.
171.1Schristos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
181.1Schristos *    substantially similar to the "NO WARRANTY" disclaimer below
191.1Schristos *    ("Disclaimer") and any redistribution must be conditioned upon
201.1Schristos *    including a substantially similar Disclaimer requirement for further
211.1Schristos *    binary redistribution.
221.1Schristos * 3. Neither the names of the above-listed copyright holders nor the names
231.1Schristos *    of any contributors may be used to endorse or promote products derived
241.1Schristos *    from this software without specific prior written permission.
251.1Schristos *
261.1Schristos * Alternatively, this software may be distributed under the terms of the
271.1Schristos * GNU General Public License ("GPL") version 2 as published by the Free
281.1Schristos * Software Foundation.
291.1Schristos *
301.1Schristos * NO WARRANTY
311.1Schristos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
321.1Schristos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
331.1Schristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
341.1Schristos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
351.1Schristos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
361.1Schristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
371.1Schristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
381.1Schristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
391.1Schristos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
401.1Schristos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
411.1Schristos * POSSIBILITY OF SUCH DAMAGES.
421.1Schristos */
431.1Schristos
441.1Schristos#include "aslcompiler.h"
451.1.1.7Schristos#include "acapps.h"
461.1Schristos
471.1Schristos#define _COMPONENT          ACPI_COMPILER
481.1Schristos        ACPI_MODULE_NAME    ("ashex")
491.1Schristos
501.1Schristos/*
511.1Schristos * This module emits ASCII hex output files in either C, ASM, or ASL format
521.1Schristos */
531.1Schristos
541.1Schristos/* Local prototypes */
551.1Schristos
561.1Schristosstatic void
571.1SchristosHxDoHexOutputC (
581.1Schristos    void);
591.1Schristos
601.1Schristosstatic void
611.1SchristosHxDoHexOutputAsl (
621.1Schristos    void);
631.1Schristos
641.1Schristosstatic void
651.1SchristosHxDoHexOutputAsm (
661.1Schristos    void);
671.1Schristos
681.1Schristosstatic UINT32
691.1SchristosHxReadAmlOutputFile (
701.1Schristos    UINT8                   *Buffer);
711.1Schristos
721.1Schristos
731.1Schristos/*******************************************************************************
741.1Schristos *
751.1Schristos * FUNCTION:    HxDoHexOutput
761.1Schristos *
771.1Schristos * PARAMETERS:  None
781.1Schristos *
791.1Schristos * RETURN:      None
801.1Schristos *
811.1Schristos * DESCRIPTION: Create the hex output file. Note: data is obtained by reading
821.1Schristos *              the entire AML output file that was previously generated.
831.1Schristos *
841.1Schristos ******************************************************************************/
851.1Schristos
861.1Schristosvoid
871.1SchristosHxDoHexOutput (
881.1Schristos    void)
891.1Schristos{
901.1Schristos
911.1.1.8Schristos    switch (AslGbl_HexOutputFlag)
921.1Schristos    {
931.1Schristos    case HEX_OUTPUT_C:
941.1Schristos
951.1Schristos        HxDoHexOutputC ();
961.1Schristos        break;
971.1Schristos
981.1Schristos    case HEX_OUTPUT_ASM:
991.1Schristos
1001.1Schristos        HxDoHexOutputAsm ();
1011.1Schristos        break;
1021.1Schristos
1031.1Schristos    case HEX_OUTPUT_ASL:
1041.1Schristos
1051.1Schristos        HxDoHexOutputAsl ();
1061.1Schristos        break;
1071.1Schristos
1081.1Schristos    default:
1091.1Schristos
1101.1Schristos        /* No other output types supported */
1111.1Schristos
1121.1Schristos        break;
1131.1Schristos    }
1141.1Schristos}
1151.1Schristos
1161.1Schristos
1171.1Schristos/*******************************************************************************
1181.1Schristos *
1191.1Schristos * FUNCTION:    HxReadAmlOutputFile
1201.1Schristos *
1211.1Schristos * PARAMETERS:  Buffer              - Where to return data
1221.1Schristos *
1231.1Schristos * RETURN:      None
1241.1Schristos *
1251.1Schristos * DESCRIPTION: Read a line of the AML output prior to formatting the data
1261.1Schristos *
1271.1Schristos ******************************************************************************/
1281.1Schristos
1291.1Schristosstatic UINT32
1301.1SchristosHxReadAmlOutputFile (
1311.1Schristos    UINT8                   *Buffer)
1321.1Schristos{
1331.1Schristos    UINT32                  Actual;
1341.1Schristos
1351.1Schristos
1361.1Schristos    Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE,
1371.1.1.8Schristos        AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle);
1381.1Schristos
1391.1.1.8Schristos    if (ferror (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle))
1401.1Schristos    {
1411.1Schristos        FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
1421.1Schristos        AslAbort ();
1431.1Schristos    }
1441.1Schristos
1451.1Schristos    return (Actual);
1461.1Schristos}
1471.1Schristos
1481.1Schristos
1491.1Schristos/*******************************************************************************
1501.1Schristos *
1511.1Schristos * FUNCTION:    HxDoHexOutputC
1521.1Schristos *
1531.1Schristos * PARAMETERS:  None
1541.1Schristos *
1551.1Schristos * RETURN:      None
1561.1Schristos *
1571.1Schristos * DESCRIPTION: Create the hex output file. This is the same data as the AML
1581.1Schristos *              output file, but formatted into hex/ascii bytes suitable for
1591.1Schristos *              inclusion into a C source file.
1601.1Schristos *
1611.1.1.7Schristos *              Note: the base name of the hex output file is prepended to
1621.1.1.7Schristos *              all symbols as they are output to the file.
1631.1.1.7Schristos *
1641.1Schristos ******************************************************************************/
1651.1Schristos
1661.1Schristosstatic void
1671.1SchristosHxDoHexOutputC (
1681.1Schristos    void)
1691.1Schristos{
1701.1Schristos    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
1711.1Schristos    UINT32                  LineLength;
1721.1Schristos    UINT32                  Offset = 0;
1731.1Schristos    UINT32                  AmlFileSize;
1741.1Schristos    UINT32                  i;
1751.1.1.7Schristos    char                    *FileBasename;
1761.1.1.7Schristos
1771.1Schristos
1781.1.1.7Schristos    /* Obtain the file basename (filename with no extension) */
1791.1.1.7Schristos
1801.1.1.8Schristos    FileBasename = FlGetFileBasename (AslGbl_Files [ASL_FILE_HEX_OUTPUT].Filename);
1811.1Schristos
1821.1Schristos    /* Get AML size, seek back to start */
1831.1Schristos
1841.1Schristos    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
1851.1Schristos    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
1861.1Schristos
1871.1.1.7Schristos    /* Finish the file header and emit the non-data symbols */
1881.1.1.7Schristos
1891.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n");
1901.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
1911.1Schristos        AmlFileSize);
1921.1.1.7Schristos
1931.1.1.7Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "#ifndef __%s_HEX__\n", FileBasename);
1941.1.1.7Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "#define __%s_HEX__\n\n", FileBasename);
1951.1.1.7Schristos
1961.1.1.7Schristos    AcpiUtStrlwr (FileBasename);
1971.1.1.7Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char %s_aml_code[] =\n{\n", FileBasename);
1981.1Schristos
1991.1Schristos    while (Offset < AmlFileSize)
2001.1Schristos    {
2011.1Schristos        /* Read enough bytes needed for one output line */
2021.1Schristos
2031.1Schristos        LineLength = HxReadAmlOutputFile (FileData);
2041.1Schristos        if (!LineLength)
2051.1Schristos        {
2061.1Schristos            break;
2071.1Schristos        }
2081.1Schristos
2091.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "    ");
2101.1Schristos
2111.1Schristos        for (i = 0; i < LineLength; i++)
2121.1Schristos        {
2131.1Schristos            /*
2141.1.1.7Schristos             * Output each hex byte in the form: "0xnn,"
2151.1Schristos             * Add a comma until the very last byte of the AML file
2161.1Schristos             * (Some C compilers complain about a trailing comma)
2171.1Schristos             */
2181.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
2191.1Schristos            if ((Offset + i + 1) < AmlFileSize)
2201.1Schristos            {
2211.1Schristos                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
2221.1Schristos            }
2231.1Schristos            else
2241.1Schristos            {
2251.1Schristos                FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
2261.1Schristos            }
2271.1Schristos        }
2281.1Schristos
2291.1Schristos        /* Add fill spaces if needed for last line */
2301.1Schristos
2311.1Schristos        if (LineLength < HEX_TABLE_LINE_SIZE)
2321.1Schristos        {
2331.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
2341.1Schristos                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
2351.1Schristos        }
2361.1Schristos
2371.1Schristos        /* Emit the offset and ascii dump for the entire line */
2381.1Schristos
2391.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
2401.1Schristos        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
2411.1.1.4Schristos
2421.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
2431.1Schristos            HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
2441.1Schristos
2451.1Schristos        Offset += LineLength;
2461.1Schristos    }
2471.1Schristos
2481.1.1.7Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n\n");
2491.1.1.7Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "#endif\n");
2501.1Schristos}
2511.1Schristos
2521.1Schristos
2531.1Schristos/*******************************************************************************
2541.1Schristos *
2551.1Schristos * FUNCTION:    HxDoHexOutputAsl
2561.1Schristos *
2571.1Schristos * PARAMETERS:  None
2581.1Schristos *
2591.1Schristos * RETURN:      None
2601.1Schristos *
2611.1Schristos * DESCRIPTION: Create the hex output file. This is the same data as the AML
2621.1Schristos *              output file, but formatted into hex/ascii bytes suitable for
2631.1Schristos *              inclusion into a C source file.
2641.1Schristos *
2651.1Schristos ******************************************************************************/
2661.1Schristos
2671.1Schristosstatic void
2681.1SchristosHxDoHexOutputAsl (
2691.1Schristos    void)
2701.1Schristos{
2711.1Schristos    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
2721.1Schristos    UINT32                  LineLength;
2731.1Schristos    UINT32                  Offset = 0;
2741.1Schristos    UINT32                  AmlFileSize;
2751.1Schristos    UINT32                  i;
2761.1Schristos
2771.1Schristos
2781.1Schristos    /* Get AML size, seek back to start */
2791.1Schristos
2801.1Schristos    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
2811.1Schristos    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
2821.1Schristos
2831.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n");
2841.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
2851.1Schristos        AmlFileSize);
2861.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "    Name (BUF1, Buffer()\n    {\n");
2871.1Schristos
2881.1Schristos    while (Offset < AmlFileSize)
2891.1Schristos    {
2901.1Schristos        /* Read enough bytes needed for one output line */
2911.1Schristos
2921.1Schristos        LineLength = HxReadAmlOutputFile (FileData);
2931.1Schristos        if (!LineLength)
2941.1Schristos        {
2951.1Schristos            break;
2961.1Schristos        }
2971.1Schristos
2981.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "        ");
2991.1Schristos
3001.1Schristos        for (i = 0; i < LineLength; i++)
3011.1Schristos        {
3021.1Schristos            /*
3031.1Schristos             * Print each hex byte.
3041.1Schristos             * Add a comma until the very last byte of the AML file
3051.1Schristos             * (Some C compilers complain about a trailing comma)
3061.1Schristos             */
3071.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
3081.1Schristos            if ((Offset + i + 1) < AmlFileSize)
3091.1Schristos            {
3101.1Schristos                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
3111.1Schristos            }
3121.1Schristos            else
3131.1Schristos            {
3141.1Schristos                FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
3151.1Schristos            }
3161.1Schristos        }
3171.1Schristos
3181.1Schristos        /* Add fill spaces if needed for last line */
3191.1Schristos
3201.1Schristos        if (LineLength < HEX_TABLE_LINE_SIZE)
3211.1Schristos        {
3221.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
3231.1Schristos                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
3241.1Schristos        }
3251.1Schristos
3261.1Schristos        /* Emit the offset and ascii dump for the entire line */
3271.1Schristos
3281.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
3291.1Schristos        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
3301.1.1.4Schristos
3311.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
3321.1Schristos            HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
3331.1Schristos
3341.1Schristos        Offset += LineLength;
3351.1Schristos    }
3361.1Schristos
3371.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "    })\n");
3381.1Schristos}
3391.1Schristos
3401.1Schristos
3411.1Schristos/*******************************************************************************
3421.1Schristos *
3431.1Schristos * FUNCTION:    HxDoHexOutputAsm
3441.1Schristos *
3451.1Schristos * PARAMETERS:  None
3461.1Schristos *
3471.1Schristos * RETURN:      None
3481.1Schristos *
3491.1Schristos * DESCRIPTION: Create the hex output file. This is the same data as the AML
3501.1Schristos *              output file, but formatted into hex/ascii bytes suitable for
3511.1Schristos *              inclusion into a ASM source file.
3521.1Schristos *
3531.1Schristos ******************************************************************************/
3541.1Schristos
3551.1Schristosstatic void
3561.1SchristosHxDoHexOutputAsm (
3571.1Schristos    void)
3581.1Schristos{
3591.1Schristos    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
3601.1Schristos    UINT32                  LineLength;
3611.1Schristos    UINT32                  Offset = 0;
3621.1Schristos    UINT32                  AmlFileSize;
3631.1Schristos    UINT32                  i;
3641.1Schristos
3651.1Schristos
3661.1Schristos    /* Get AML size, seek back to start */
3671.1Schristos
3681.1Schristos    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
3691.1Schristos    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
3701.1Schristos
3711.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n");
3721.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n",
3731.1Schristos        AmlFileSize);
3741.1Schristos
3751.1Schristos    while (Offset < AmlFileSize)
3761.1Schristos    {
3771.1Schristos        /* Read enough bytes needed for one output line */
3781.1Schristos
3791.1Schristos        LineLength = HxReadAmlOutputFile (FileData);
3801.1Schristos        if (!LineLength)
3811.1Schristos        {
3821.1Schristos            break;
3831.1Schristos        }
3841.1Schristos
3851.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  db  ");
3861.1Schristos
3871.1Schristos        for (i = 0; i < LineLength; i++)
3881.1Schristos        {
3891.1Schristos            /*
3901.1Schristos             * Print each hex byte.
3911.1Schristos             * Add a comma until the last byte of the line
3921.1Schristos             */
3931.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]);
3941.1Schristos            if ((i + 1) < LineLength)
3951.1Schristos            {
3961.1Schristos                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
3971.1Schristos            }
3981.1Schristos        }
3991.1Schristos
4001.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
4011.1Schristos
4021.1Schristos        /* Add fill spaces if needed for last line */
4031.1Schristos
4041.1Schristos        if (LineLength < HEX_TABLE_LINE_SIZE)
4051.1Schristos        {
4061.1Schristos            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
4071.1Schristos                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
4081.1Schristos        }
4091.1Schristos
4101.1Schristos        /* Emit the offset and ascii dump for the entire line */
4111.1Schristos
4121.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  ; %8.8X", Offset);
4131.1Schristos        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
4141.1.1.4Schristos
4151.1Schristos        FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
4161.1Schristos
4171.1Schristos        Offset += LineLength;
4181.1Schristos    }
4191.1Schristos
4201.1Schristos    FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
4211.1Schristos}
422