1 /****************************************************************************** 2 * 3 * Module Name: aslhex - ASCII hex output file generation (C, ASM, and ASL) 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2017, 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 <contrib/dev/acpica/compiler/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 /* Local prototypes */ 54 55 static void 56 HxDoHexOutputC ( 57 void); 58 59 static void 60 HxDoHexOutputAsl ( 61 void); 62 63 static void 64 HxDoHexOutputAsm ( 65 void); 66 67 static UINT32 68 HxReadAmlOutputFile ( 69 UINT8 *Buffer); 70 71 72 /******************************************************************************* 73 * 74 * FUNCTION: HxDoHexOutput 75 * 76 * PARAMETERS: None 77 * 78 * RETURN: None 79 * 80 * DESCRIPTION: Create the hex output file. Note: data is obtained by reading 81 * the entire AML output file that was previously generated. 82 * 83 ******************************************************************************/ 84 85 void 86 HxDoHexOutput ( 87 void) 88 { 89 90 switch (Gbl_HexOutputFlag) 91 { 92 case HEX_OUTPUT_C: 93 94 HxDoHexOutputC (); 95 break; 96 97 case HEX_OUTPUT_ASM: 98 99 HxDoHexOutputAsm (); 100 break; 101 102 case HEX_OUTPUT_ASL: 103 104 HxDoHexOutputAsl (); 105 break; 106 107 default: 108 109 /* No other output types supported */ 110 111 break; 112 } 113 } 114 115 116 /******************************************************************************* 117 * 118 * FUNCTION: HxReadAmlOutputFile 119 * 120 * PARAMETERS: Buffer - Where to return data 121 * 122 * RETURN: None 123 * 124 * DESCRIPTION: Read a line of the AML output prior to formatting the data 125 * 126 ******************************************************************************/ 127 128 static UINT32 129 HxReadAmlOutputFile ( 130 UINT8 *Buffer) 131 { 132 UINT32 Actual; 133 134 135 Actual = fread (Buffer, 1, HEX_TABLE_LINE_SIZE, 136 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 137 138 if (ferror (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)) 139 { 140 FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ); 141 AslAbort (); 142 } 143 144 return (Actual); 145 } 146 147 148 /******************************************************************************* 149 * 150 * FUNCTION: HxDoHexOutputC 151 * 152 * PARAMETERS: None 153 * 154 * RETURN: None 155 * 156 * DESCRIPTION: Create the hex output file. This is the same data as the AML 157 * output file, but formatted into hex/ascii bytes suitable for 158 * inclusion into a C source file. 159 * 160 ******************************************************************************/ 161 162 static void 163 HxDoHexOutputC ( 164 void) 165 { 166 UINT8 FileData[HEX_TABLE_LINE_SIZE]; 167 UINT32 LineLength; 168 UINT32 Offset = 0; 169 UINT32 AmlFileSize; 170 UINT32 i; 171 172 173 /* Get AML size, seek back to start */ 174 175 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 176 FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 177 178 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n"); 179 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", 180 AmlFileSize); 181 FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n"); 182 183 while (Offset < AmlFileSize) 184 { 185 /* Read enough bytes needed for one output line */ 186 187 LineLength = HxReadAmlOutputFile (FileData); 188 if (!LineLength) 189 { 190 break; 191 } 192 193 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 194 195 for (i = 0; i < LineLength; i++) 196 { 197 /* 198 * Print each hex byte. 199 * Add a comma until the very last byte of the AML file 200 * (Some C compilers complain about a trailing comma) 201 */ 202 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); 203 if ((Offset + i + 1) < AmlFileSize) 204 { 205 FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 206 } 207 else 208 { 209 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 210 } 211 } 212 213 /* Add fill spaces if needed for last line */ 214 215 if (LineLength < HEX_TABLE_LINE_SIZE) 216 { 217 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 218 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 219 } 220 221 /* Emit the offset and ascii dump for the entire line */ 222 223 FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); 224 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 225 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 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 398 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 399 400 Offset += LineLength; 401 } 402 403 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 404 } 405