1244971Sjkim/****************************************************************************** 2244971Sjkim * 3244971Sjkim * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL) 4244971Sjkim * 5244971Sjkim *****************************************************************************/ 6244971Sjkim 7244971Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9244971Sjkim * All rights reserved. 10244971Sjkim * 11244971Sjkim * Redistribution and use in source and binary forms, with or without 12244971Sjkim * modification, are permitted provided that the following conditions 13244971Sjkim * are met: 14244971Sjkim * 1. Redistributions of source code must retain the above copyright 15244971Sjkim * notice, this list of conditions, and the following disclaimer, 16244971Sjkim * without modification. 17244971Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18244971Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19244971Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20244971Sjkim * including a substantially similar Disclaimer requirement for further 21244971Sjkim * binary redistribution. 22244971Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23244971Sjkim * of any contributors may be used to endorse or promote products derived 24244971Sjkim * from this software without specific prior written permission. 25244971Sjkim * 26244971Sjkim * Alternatively, this software may be distributed under the terms of the 27244971Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28244971Sjkim * Software Foundation. 29244971Sjkim * 30244971Sjkim * NO WARRANTY 31244971Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32244971Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33244971Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34244971Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35244971Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36244971Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37244971Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38244971Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39244971Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40244971Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41244971Sjkim * POSSIBILITY OF SUCH DAMAGES. 42244971Sjkim */ 43244971Sjkim 44245582Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45244971Sjkim 46244971Sjkim#define _COMPONENT ACPI_COMPILER 47244971Sjkim ACPI_MODULE_NAME ("ashex") 48244971Sjkim 49244971Sjkim/* 50244971Sjkim * This module emits ASCII hex output files in either C, ASM, or ASL format 51244971Sjkim */ 52244971Sjkim 53244971Sjkim/* Local prototypes */ 54244971Sjkim 55244971Sjkimstatic void 56244971SjkimHxDoHexOutputC ( 57244971Sjkim void); 58244971Sjkim 59244971Sjkimstatic void 60244971SjkimHxDoHexOutputAsl ( 61244971Sjkim void); 62244971Sjkim 63244971Sjkimstatic void 64244971SjkimHxDoHexOutputAsm ( 65244971Sjkim void); 66244971Sjkim 67244971Sjkimstatic UINT32 68244971SjkimHxReadAmlOutputFile ( 69244971Sjkim UINT8 *Buffer); 70244971Sjkim 71244971Sjkim 72244971Sjkim/******************************************************************************* 73244971Sjkim * 74244971Sjkim * FUNCTION: HxDoHexOutput 75244971Sjkim * 76244971Sjkim * PARAMETERS: None 77244971Sjkim * 78244971Sjkim * RETURN: None 79244971Sjkim * 80244971Sjkim * DESCRIPTION: Create the hex output file. Note: data is obtained by reading 81244971Sjkim * the entire AML output file that was previously generated. 82244971Sjkim * 83244971Sjkim ******************************************************************************/ 84244971Sjkim 85244971Sjkimvoid 86244971SjkimHxDoHexOutput ( 87244971Sjkim void) 88244971Sjkim{ 89244971Sjkim 90244971Sjkim switch (Gbl_HexOutputFlag) 91244971Sjkim { 92244971Sjkim case HEX_OUTPUT_C: 93244971Sjkim 94244971Sjkim HxDoHexOutputC (); 95244971Sjkim break; 96244971Sjkim 97244971Sjkim case HEX_OUTPUT_ASM: 98244971Sjkim 99244971Sjkim HxDoHexOutputAsm (); 100244971Sjkim break; 101244971Sjkim 102244971Sjkim case HEX_OUTPUT_ASL: 103244971Sjkim 104244971Sjkim HxDoHexOutputAsl (); 105244971Sjkim break; 106244971Sjkim 107244971Sjkim default: 108250838Sjkim 109244971Sjkim /* No other output types supported */ 110250838Sjkim 111244971Sjkim break; 112244971Sjkim } 113244971Sjkim} 114244971Sjkim 115244971Sjkim 116244971Sjkim/******************************************************************************* 117244971Sjkim * 118244971Sjkim * FUNCTION: HxReadAmlOutputFile 119244971Sjkim * 120244971Sjkim * PARAMETERS: Buffer - Where to return data 121244971Sjkim * 122244971Sjkim * RETURN: None 123244971Sjkim * 124244971Sjkim * DESCRIPTION: Read a line of the AML output prior to formatting the data 125244971Sjkim * 126244971Sjkim ******************************************************************************/ 127244971Sjkim 128244971Sjkimstatic UINT32 129244971SjkimHxReadAmlOutputFile ( 130244971Sjkim UINT8 *Buffer) 131244971Sjkim{ 132244971Sjkim UINT32 Actual; 133244971Sjkim 134244971Sjkim 135244971Sjkim Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE, 136244971Sjkim Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 137244971Sjkim 138244971Sjkim if (ferror (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)) 139244971Sjkim { 140244971Sjkim FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ); 141244971Sjkim AslAbort (); 142244971Sjkim } 143244971Sjkim 144244971Sjkim return (Actual); 145244971Sjkim} 146244971Sjkim 147244971Sjkim 148244971Sjkim/******************************************************************************* 149244971Sjkim * 150244971Sjkim * FUNCTION: HxDoHexOutputC 151244971Sjkim * 152244971Sjkim * PARAMETERS: None 153244971Sjkim * 154244971Sjkim * RETURN: None 155244971Sjkim * 156244971Sjkim * DESCRIPTION: Create the hex output file. This is the same data as the AML 157244971Sjkim * output file, but formatted into hex/ascii bytes suitable for 158244971Sjkim * inclusion into a C source file. 159244971Sjkim * 160244971Sjkim ******************************************************************************/ 161244971Sjkim 162244971Sjkimstatic void 163244971SjkimHxDoHexOutputC ( 164244971Sjkim void) 165244971Sjkim{ 166244971Sjkim UINT8 FileData[HEX_TABLE_LINE_SIZE]; 167244971Sjkim UINT32 LineLength; 168244971Sjkim UINT32 Offset = 0; 169244971Sjkim UINT32 AmlFileSize; 170244971Sjkim UINT32 i; 171244971Sjkim 172244971Sjkim 173244971Sjkim /* Get AML size, seek back to start */ 174244971Sjkim 175244971Sjkim AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 176244971Sjkim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 177244971Sjkim 178244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n"); 179244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", 180244971Sjkim AmlFileSize); 181244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n"); 182244971Sjkim 183244971Sjkim while (Offset < AmlFileSize) 184244971Sjkim { 185244971Sjkim /* Read enough bytes needed for one output line */ 186244971Sjkim 187244971Sjkim LineLength = HxReadAmlOutputFile (FileData); 188244971Sjkim if (!LineLength) 189244971Sjkim { 190244971Sjkim break; 191244971Sjkim } 192244971Sjkim 193244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 194244971Sjkim 195244971Sjkim for (i = 0; i < LineLength; i++) 196244971Sjkim { 197244971Sjkim /* 198244971Sjkim * Print each hex byte. 199244971Sjkim * Add a comma until the very last byte of the AML file 200244971Sjkim * (Some C compilers complain about a trailing comma) 201244971Sjkim */ 202244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); 203244971Sjkim if ((Offset + i + 1) < AmlFileSize) 204244971Sjkim { 205244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 206244971Sjkim } 207244971Sjkim else 208244971Sjkim { 209244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 210244971Sjkim } 211244971Sjkim } 212244971Sjkim 213244971Sjkim /* Add fill spaces if needed for last line */ 214244971Sjkim 215244971Sjkim if (LineLength < HEX_TABLE_LINE_SIZE) 216244971Sjkim { 217244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 218244971Sjkim 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 219244971Sjkim } 220244971Sjkim 221244971Sjkim /* Emit the offset and ascii dump for the entire line */ 222244971Sjkim 223244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); 224244971Sjkim LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 225306536Sjkim 226244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n", 227244971Sjkim HEX_TABLE_LINE_SIZE - LineLength + 1, " "); 228244971Sjkim 229244971Sjkim Offset += LineLength; 230244971Sjkim } 231244971Sjkim 232244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n"); 233244971Sjkim} 234244971Sjkim 235244971Sjkim 236244971Sjkim/******************************************************************************* 237244971Sjkim * 238244971Sjkim * FUNCTION: HxDoHexOutputAsl 239244971Sjkim * 240244971Sjkim * PARAMETERS: None 241244971Sjkim * 242244971Sjkim * RETURN: None 243244971Sjkim * 244244971Sjkim * DESCRIPTION: Create the hex output file. This is the same data as the AML 245244971Sjkim * output file, but formatted into hex/ascii bytes suitable for 246244971Sjkim * inclusion into a C source file. 247244971Sjkim * 248244971Sjkim ******************************************************************************/ 249244971Sjkim 250244971Sjkimstatic void 251244971SjkimHxDoHexOutputAsl ( 252244971Sjkim void) 253244971Sjkim{ 254244971Sjkim UINT8 FileData[HEX_TABLE_LINE_SIZE]; 255244971Sjkim UINT32 LineLength; 256244971Sjkim UINT32 Offset = 0; 257244971Sjkim UINT32 AmlFileSize; 258244971Sjkim UINT32 i; 259244971Sjkim 260244971Sjkim 261244971Sjkim /* Get AML size, seek back to start */ 262244971Sjkim 263244971Sjkim AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 264244971Sjkim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 265244971Sjkim 266244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n"); 267244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", 268244971Sjkim AmlFileSize); 269244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " Name (BUF1, Buffer()\n {\n"); 270244971Sjkim 271244971Sjkim while (Offset < AmlFileSize) 272244971Sjkim { 273244971Sjkim /* Read enough bytes needed for one output line */ 274244971Sjkim 275244971Sjkim LineLength = HxReadAmlOutputFile (FileData); 276244971Sjkim if (!LineLength) 277244971Sjkim { 278244971Sjkim break; 279244971Sjkim } 280244971Sjkim 281244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 282244971Sjkim 283244971Sjkim for (i = 0; i < LineLength; i++) 284244971Sjkim { 285244971Sjkim /* 286244971Sjkim * Print each hex byte. 287244971Sjkim * Add a comma until the very last byte of the AML file 288244971Sjkim * (Some C compilers complain about a trailing comma) 289244971Sjkim */ 290244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); 291244971Sjkim if ((Offset + i + 1) < AmlFileSize) 292244971Sjkim { 293244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 294244971Sjkim } 295244971Sjkim else 296244971Sjkim { 297244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 298244971Sjkim } 299244971Sjkim } 300244971Sjkim 301244971Sjkim /* Add fill spaces if needed for last line */ 302244971Sjkim 303244971Sjkim if (LineLength < HEX_TABLE_LINE_SIZE) 304244971Sjkim { 305244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 306244971Sjkim 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 307244971Sjkim } 308244971Sjkim 309244971Sjkim /* Emit the offset and ascii dump for the entire line */ 310244971Sjkim 311244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); 312244971Sjkim LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 313306536Sjkim 314244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n", 315244971Sjkim HEX_TABLE_LINE_SIZE - LineLength + 1, " "); 316244971Sjkim 317244971Sjkim Offset += LineLength; 318244971Sjkim } 319244971Sjkim 320244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " })\n"); 321244971Sjkim} 322244971Sjkim 323244971Sjkim 324244971Sjkim/******************************************************************************* 325244971Sjkim * 326244971Sjkim * FUNCTION: HxDoHexOutputAsm 327244971Sjkim * 328244971Sjkim * PARAMETERS: None 329244971Sjkim * 330244971Sjkim * RETURN: None 331244971Sjkim * 332244971Sjkim * DESCRIPTION: Create the hex output file. This is the same data as the AML 333244971Sjkim * output file, but formatted into hex/ascii bytes suitable for 334244971Sjkim * inclusion into a ASM source file. 335244971Sjkim * 336244971Sjkim ******************************************************************************/ 337244971Sjkim 338244971Sjkimstatic void 339244971SjkimHxDoHexOutputAsm ( 340244971Sjkim void) 341244971Sjkim{ 342244971Sjkim UINT8 FileData[HEX_TABLE_LINE_SIZE]; 343244971Sjkim UINT32 LineLength; 344244971Sjkim UINT32 Offset = 0; 345244971Sjkim UINT32 AmlFileSize; 346244971Sjkim UINT32 i; 347244971Sjkim 348244971Sjkim 349244971Sjkim /* Get AML size, seek back to start */ 350244971Sjkim 351244971Sjkim AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 352244971Sjkim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 353244971Sjkim 354244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n"); 355244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n", 356244971Sjkim AmlFileSize); 357244971Sjkim 358244971Sjkim while (Offset < AmlFileSize) 359244971Sjkim { 360244971Sjkim /* Read enough bytes needed for one output line */ 361244971Sjkim 362244971Sjkim LineLength = HxReadAmlOutputFile (FileData); 363244971Sjkim if (!LineLength) 364244971Sjkim { 365244971Sjkim break; 366244971Sjkim } 367244971Sjkim 368244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " db "); 369244971Sjkim 370244971Sjkim for (i = 0; i < LineLength; i++) 371244971Sjkim { 372244971Sjkim /* 373244971Sjkim * Print each hex byte. 374244971Sjkim * Add a comma until the last byte of the line 375244971Sjkim */ 376244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]); 377244971Sjkim if ((i + 1) < LineLength) 378244971Sjkim { 379244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 380244971Sjkim } 381244971Sjkim } 382244971Sjkim 383244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 384244971Sjkim 385244971Sjkim /* Add fill spaces if needed for last line */ 386244971Sjkim 387244971Sjkim if (LineLength < HEX_TABLE_LINE_SIZE) 388244971Sjkim { 389244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 390244971Sjkim 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 391244971Sjkim } 392244971Sjkim 393244971Sjkim /* Emit the offset and ascii dump for the entire line */ 394244971Sjkim 395244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, " ; %8.8X", Offset); 396244971Sjkim LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 397306536Sjkim 398244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 399244971Sjkim 400244971Sjkim Offset += LineLength; 401244971Sjkim } 402244971Sjkim 403244971Sjkim FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 404244971Sjkim} 405