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