1 1.1 jruoho /****************************************************************************** 2 1.1 jruoho * 3 1.9 christos * Module Name: acpixtract - Top level functions to convert ascii/hex 4 1.9 christos * ACPI tables to the original binary tables 5 1.1 jruoho * 6 1.1 jruoho *****************************************************************************/ 7 1.1 jruoho 8 1.19 christos /****************************************************************************** 9 1.19 christos * 10 1.19 christos * 1. Copyright Notice 11 1.19 christos * 12 1.20 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 13 1.1 jruoho * All rights reserved. 14 1.1 jruoho * 15 1.19 christos * 2. License 16 1.19 christos * 17 1.19 christos * 2.1. This is your license from Intel Corp. under its intellectual property 18 1.19 christos * rights. You may have additional license terms from the party that provided 19 1.19 christos * you this software, covering your right to use that party's intellectual 20 1.19 christos * property rights. 21 1.19 christos * 22 1.19 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23 1.19 christos * copy of the source code appearing in this file ("Covered Code") an 24 1.19 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25 1.19 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 26 1.19 christos * make derivatives, distribute, use and display any portion of the Covered 27 1.19 christos * Code in any form, with the right to sublicense such rights; and 28 1.19 christos * 29 1.19 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30 1.19 christos * license (with the right to sublicense), under only those claims of Intel 31 1.19 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 32 1.19 christos * offer to sell, and import the Covered Code and derivative works thereof 33 1.19 christos * solely to the minimum extent necessary to exercise the above copyright 34 1.19 christos * license, and in no event shall the patent license extend to any additions 35 1.19 christos * to or modifications of the Original Intel Code. No other license or right 36 1.19 christos * is granted directly or by implication, estoppel or otherwise; 37 1.19 christos * 38 1.19 christos * The above copyright and patent license is granted only if the following 39 1.19 christos * conditions are met: 40 1.19 christos * 41 1.19 christos * 3. Conditions 42 1.19 christos * 43 1.19 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44 1.19 christos * Redistribution of source code of any substantial portion of the Covered 45 1.19 christos * Code or modification with rights to further distribute source must include 46 1.19 christos * the above Copyright Notice, the above License, this list of Conditions, 47 1.19 christos * and the following Disclaimer and Export Compliance provision. In addition, 48 1.19 christos * Licensee must cause all Covered Code to which Licensee contributes to 49 1.19 christos * contain a file documenting the changes Licensee made to create that Covered 50 1.19 christos * Code and the date of any change. Licensee must include in that file the 51 1.19 christos * documentation of any changes made by any predecessor Licensee. Licensee 52 1.19 christos * must include a prominent statement that the modification is derived, 53 1.19 christos * directly or indirectly, from Original Intel Code. 54 1.19 christos * 55 1.19 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56 1.19 christos * Redistribution of source code of any substantial portion of the Covered 57 1.19 christos * Code or modification without rights to further distribute source must 58 1.19 christos * include the following Disclaimer and Export Compliance provision in the 59 1.19 christos * documentation and/or other materials provided with distribution. In 60 1.19 christos * addition, Licensee may not authorize further sublicense of source of any 61 1.19 christos * portion of the Covered Code, and must include terms to the effect that the 62 1.19 christos * license from Licensee to its licensee is limited to the intellectual 63 1.19 christos * property embodied in the software Licensee provides to its licensee, and 64 1.19 christos * not to intellectual property embodied in modifications its licensee may 65 1.19 christos * make. 66 1.19 christos * 67 1.19 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 68 1.19 christos * substantial portion of the Covered Code or modification must reproduce the 69 1.19 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 70 1.19 christos * provision in the documentation and/or other materials provided with the 71 1.19 christos * distribution. 72 1.19 christos * 73 1.19 christos * 3.4. Intel retains all right, title, and interest in and to the Original 74 1.19 christos * Intel Code. 75 1.19 christos * 76 1.19 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77 1.19 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 78 1.19 christos * other dealings in products derived from or relating to the Covered Code 79 1.19 christos * without prior written authorization from Intel. 80 1.19 christos * 81 1.19 christos * 4. Disclaimer and Export Compliance 82 1.19 christos * 83 1.19 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84 1.19 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85 1.19 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86 1.19 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87 1.19 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88 1.19 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89 1.19 christos * PARTICULAR PURPOSE. 90 1.19 christos * 91 1.19 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92 1.19 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93 1.19 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94 1.19 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95 1.19 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96 1.19 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97 1.19 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98 1.19 christos * LIMITED REMEDY. 99 1.19 christos * 100 1.19 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 101 1.19 christos * software or system incorporating such software without first obtaining any 102 1.19 christos * required license or other approval from the U. S. Department of Commerce or 103 1.19 christos * any other agency or department of the United States Government. In the 104 1.19 christos * event Licensee exports any such software from the United States or 105 1.19 christos * re-exports any such software from a foreign destination, Licensee shall 106 1.19 christos * ensure that the distribution and export/re-export of the software is in 107 1.19 christos * compliance with all laws, regulations, orders, or other restrictions of the 108 1.19 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109 1.19 christos * any of its subsidiaries will export/re-export any technical data, process, 110 1.19 christos * software, or service, directly or indirectly, to any country for which the 111 1.19 christos * United States government or any agency thereof requires an export license, 112 1.19 christos * other governmental approval, or letter of assurance, without first obtaining 113 1.19 christos * such license, approval or letter. 114 1.19 christos * 115 1.19 christos ***************************************************************************** 116 1.19 christos * 117 1.19 christos * Alternatively, you may choose to be licensed under the terms of the 118 1.19 christos * following license: 119 1.19 christos * 120 1.2 christos * Redistribution and use in source and binary forms, with or without 121 1.2 christos * modification, are permitted provided that the following conditions 122 1.2 christos * are met: 123 1.2 christos * 1. Redistributions of source code must retain the above copyright 124 1.2 christos * notice, this list of conditions, and the following disclaimer, 125 1.2 christos * without modification. 126 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 127 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below 128 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon 129 1.2 christos * including a substantially similar Disclaimer requirement for further 130 1.2 christos * binary redistribution. 131 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names 132 1.2 christos * of any contributors may be used to endorse or promote products derived 133 1.2 christos * from this software without specific prior written permission. 134 1.2 christos * 135 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 136 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 137 1.14 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 138 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 139 1.19 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 140 1.19 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 141 1.19 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 142 1.19 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 143 1.19 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 144 1.19 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 145 1.19 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 146 1.19 christos * 147 1.19 christos * Alternatively, you may choose to be licensed under the terms of the 148 1.19 christos * GNU General Public License ("GPL") version 2 as published by the Free 149 1.19 christos * Software Foundation. 150 1.19 christos * 151 1.19 christos *****************************************************************************/ 152 1.2 christos 153 1.6 christos #include "acpixtract.h" 154 1.1 jruoho 155 1.1 jruoho 156 1.2 christos /****************************************************************************** 157 1.2 christos * 158 1.6 christos * FUNCTION: AxExtractTables 159 1.2 christos * 160 1.6 christos * PARAMETERS: InputPathname - Filename for input acpidump file 161 1.6 christos * Signature - Requested ACPI signature to extract. 162 1.6 christos * NULL means extract ALL tables. 163 1.6 christos * MinimumInstances - Min instances that are acceptable 164 1.2 christos * 165 1.6 christos * RETURN: Status 166 1.2 christos * 167 1.6 christos * DESCRIPTION: Convert text ACPI tables to binary 168 1.2 christos * 169 1.2 christos ******************************************************************************/ 170 1.2 christos 171 1.6 christos int 172 1.6 christos AxExtractTables ( 173 1.6 christos char *InputPathname, 174 1.6 christos char *Signature, 175 1.6 christos unsigned int MinimumInstances) 176 1.2 christos { 177 1.6 christos FILE *InputFile; 178 1.6 christos FILE *OutputFile = NULL; 179 1.11 christos int BytesConverted; 180 1.11 christos int ThisTableBytesWritten = 0; 181 1.6 christos unsigned int FoundTable = 0; 182 1.6 christos unsigned int Instances = 0; 183 1.6 christos unsigned int ThisInstance; 184 1.7 christos char ThisSignature[5]; 185 1.7 christos char UpperSignature[5]; 186 1.6 christos int Status = 0; 187 1.6 christos unsigned int State = AX_STATE_FIND_HEADER; 188 1.2 christos 189 1.18 christos memset (UpperSignature, 0, sizeof(UpperSignature)); 190 1.2 christos 191 1.6 christos /* Open input in text mode, output is in binary mode */ 192 1.2 christos 193 1.8 christos InputFile = fopen (InputPathname, "r"); 194 1.6 christos if (!InputFile) 195 1.2 christos { 196 1.6 christos printf ("Could not open input file %s\n", InputPathname); 197 1.6 christos return (-1); 198 1.2 christos } 199 1.2 christos 200 1.7 christos if (!AxIsFileAscii (InputFile)) 201 1.7 christos { 202 1.7 christos fclose (InputFile); 203 1.7 christos return (-1); 204 1.7 christos } 205 1.7 christos 206 1.6 christos if (Signature) 207 1.1 jruoho { 208 1.20 christos memcpy (UpperSignature, Signature, ACPI_NAMESEG_SIZE); 209 1.7 christos AcpiUtStrupr (UpperSignature); 210 1.7 christos 211 1.6 christos /* Are there enough instances of the table to continue? */ 212 1.1 jruoho 213 1.7 christos AxNormalizeSignature (UpperSignature); 214 1.9 christos Instances = AxCountTableInstances (InputPathname, UpperSignature); 215 1.1 jruoho 216 1.19 christos if (Instances < MinimumInstances || 217 1.19 christos (Instances == 0 && MinimumInstances == AX_OPTIONAL_TABLES)) 218 1.6 christos { 219 1.6 christos printf ("Table [%s] was not found in %s\n", 220 1.7 christos UpperSignature, InputPathname); 221 1.6 christos fclose (InputFile); 222 1.9 christos return (0); /* Don't abort */ 223 1.6 christos } 224 1.1 jruoho 225 1.6 christos if (Instances == 0) 226 1.6 christos { 227 1.6 christos fclose (InputFile); 228 1.6 christos return (-1); 229 1.6 christos } 230 1.1 jruoho } 231 1.1 jruoho 232 1.6 christos /* Convert all instances of the table to binary */ 233 1.1 jruoho 234 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) 235 1.1 jruoho { 236 1.9 christos /* 237 1.9 christos * Check up front if we have a header line of the form: 238 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes) 239 1.9 christos */ 240 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER && 241 1.9 christos (State == AX_STATE_EXTRACT_DATA)) 242 1.9 christos { 243 1.9 christos /* End of previous table, start of new table */ 244 1.9 christos 245 1.9 christos if (ThisTableBytesWritten) 246 1.9 christos { 247 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, 248 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename); 249 1.9 christos } 250 1.9 christos else 251 1.9 christos { 252 1.9 christos Gbl_TableCount--; 253 1.9 christos } 254 1.9 christos 255 1.9 christos State = AX_STATE_FIND_HEADER; 256 1.9 christos } 257 1.9 christos 258 1.6 christos switch (State) 259 1.6 christos { 260 1.6 christos case AX_STATE_FIND_HEADER: 261 1.1 jruoho 262 1.6 christos if (!AxIsDataBlockHeader ()) 263 1.6 christos { 264 1.6 christos continue; 265 1.6 christos } 266 1.1 jruoho 267 1.12 christos ACPI_COPY_NAMESEG (ThisSignature, Gbl_LineBuffer); 268 1.6 christos if (Signature) 269 1.6 christos { 270 1.6 christos /* Ignore signatures that don't match */ 271 1.1 jruoho 272 1.12 christos if (!ACPI_COMPARE_NAMESEG (ThisSignature, UpperSignature)) 273 1.6 christos { 274 1.6 christos continue; 275 1.6 christos } 276 1.6 christos } 277 1.1 jruoho 278 1.6 christos /* 279 1.6 christos * Get the instance number for this signature. Only the 280 1.6 christos * SSDT and PSDT tables can have multiple instances. 281 1.6 christos */ 282 1.6 christos ThisInstance = AxGetNextInstance (InputPathname, ThisSignature); 283 1.1 jruoho 284 1.6 christos /* Build an output filename and create/open the output file */ 285 1.1 jruoho 286 1.6 christos if (ThisInstance > 0) 287 1.6 christos { 288 1.6 christos /* Add instance number to the output filename */ 289 1.1 jruoho 290 1.6 christos sprintf (Gbl_OutputFilename, "%4.4s%u.dat", 291 1.6 christos ThisSignature, ThisInstance); 292 1.6 christos } 293 1.6 christos else 294 1.6 christos { 295 1.6 christos sprintf (Gbl_OutputFilename, "%4.4s.dat", 296 1.6 christos ThisSignature); 297 1.6 christos } 298 1.1 jruoho 299 1.6 christos AcpiUtStrlwr (Gbl_OutputFilename); 300 1.6 christos OutputFile = fopen (Gbl_OutputFilename, "w+b"); 301 1.6 christos if (!OutputFile) 302 1.6 christos { 303 1.6 christos printf ("Could not open output file %s\n", 304 1.6 christos Gbl_OutputFilename); 305 1.6 christos fclose (InputFile); 306 1.6 christos return (-1); 307 1.6 christos } 308 1.1 jruoho 309 1.6 christos /* 310 1.6 christos * Toss this block header of the form "<sig> @ <addr>" line 311 1.6 christos * and move on to the actual data block 312 1.6 christos */ 313 1.6 christos Gbl_TableCount++; 314 1.6 christos FoundTable = 1; 315 1.6 christos ThisTableBytesWritten = 0; 316 1.6 christos State = AX_STATE_EXTRACT_DATA; 317 1.6 christos continue; 318 1.1 jruoho 319 1.6 christos case AX_STATE_EXTRACT_DATA: 320 1.1 jruoho 321 1.9 christos if (!AxIsHexDataLine ()) 322 1.9 christos { 323 1.9 christos continue; /* Toss any lines that are not raw hex data */ 324 1.9 christos } 325 1.9 christos 326 1.6 christos /* Empty line or non-data line terminates the data block */ 327 1.1 jruoho 328 1.11 christos BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature); 329 1.6 christos switch (BytesConverted) 330 1.6 christos { 331 1.6 christos case 0: 332 1.1 jruoho 333 1.6 christos State = AX_STATE_FIND_HEADER; /* No more data block lines */ 334 1.6 christos continue; 335 1.1 jruoho 336 1.6 christos case -1: 337 1.1 jruoho 338 1.11 christos Status = -1; 339 1.6 christos goto CleanupAndExit; /* There was a write error */ 340 1.1 jruoho 341 1.6 christos default: /* Normal case, get next line */ 342 1.1 jruoho 343 1.6 christos ThisTableBytesWritten += BytesConverted; 344 1.6 christos continue; 345 1.6 christos } 346 1.1 jruoho 347 1.6 christos default: 348 1.1 jruoho 349 1.6 christos Status = -1; 350 1.6 christos goto CleanupAndExit; 351 1.1 jruoho } 352 1.1 jruoho } 353 1.1 jruoho 354 1.6 christos if (!FoundTable) 355 1.6 christos { 356 1.7 christos printf ("No ACPI tables were found in %s\n", InputPathname); 357 1.6 christos } 358 1.1 jruoho 359 1.1 jruoho 360 1.6 christos CleanupAndExit: 361 1.1 jruoho 362 1.6 christos if (State == AX_STATE_EXTRACT_DATA) 363 1.1 jruoho { 364 1.6 christos /* Received an input file EOF while extracting data */ 365 1.1 jruoho 366 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, 367 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename); 368 1.1 jruoho } 369 1.1 jruoho 370 1.6 christos if (OutputFile) 371 1.1 jruoho { 372 1.6 christos fclose (OutputFile); 373 1.1 jruoho } 374 1.1 jruoho 375 1.6 christos fclose (InputFile); 376 1.6 christos return (Status); 377 1.1 jruoho } 378 1.1 jruoho 379 1.1 jruoho 380 1.1 jruoho /****************************************************************************** 381 1.1 jruoho * 382 1.6 christos * FUNCTION: AxExtractToMultiAmlFile 383 1.1 jruoho * 384 1.6 christos * PARAMETERS: InputPathname - Filename for input acpidump file 385 1.1 jruoho * 386 1.1 jruoho * RETURN: Status 387 1.1 jruoho * 388 1.6 christos * DESCRIPTION: Convert all DSDT/SSDT tables to binary and append them all 389 1.6 christos * into a single output file. Used to simplify the loading of 390 1.6 christos * multiple/many SSDTs into a utility like acpiexec -- instead 391 1.6 christos * of creating many separate output files. 392 1.1 jruoho * 393 1.1 jruoho ******************************************************************************/ 394 1.1 jruoho 395 1.1 jruoho int 396 1.6 christos AxExtractToMultiAmlFile ( 397 1.6 christos char *InputPathname) 398 1.1 jruoho { 399 1.1 jruoho FILE *InputFile; 400 1.6 christos FILE *OutputFile; 401 1.6 christos int Status = 0; 402 1.11 christos int TotalBytesWritten = 0; 403 1.11 christos int ThisTableBytesWritten = 0; 404 1.9 christos unsigned int BytesConverted; 405 1.6 christos char ThisSignature[4]; 406 1.2 christos unsigned int State = AX_STATE_FIND_HEADER; 407 1.1 jruoho 408 1.1 jruoho 409 1.6 christos strcpy (Gbl_OutputFilename, AX_MULTI_TABLE_FILENAME); 410 1.6 christos 411 1.6 christos /* Open the input file in text mode */ 412 1.1 jruoho 413 1.8 christos InputFile = fopen (InputPathname, "r"); 414 1.1 jruoho if (!InputFile) 415 1.1 jruoho { 416 1.6 christos printf ("Could not open input file %s\n", InputPathname); 417 1.1 jruoho return (-1); 418 1.1 jruoho } 419 1.1 jruoho 420 1.7 christos if (!AxIsFileAscii (InputFile)) 421 1.7 christos { 422 1.7 christos fclose (InputFile); 423 1.7 christos return (-1); 424 1.7 christos } 425 1.7 christos 426 1.6 christos /* Open the output file in binary mode */ 427 1.6 christos 428 1.6 christos OutputFile = fopen (Gbl_OutputFilename, "w+b"); 429 1.6 christos if (!OutputFile) 430 1.1 jruoho { 431 1.6 christos printf ("Could not open output file %s\n", Gbl_OutputFilename); 432 1.6 christos fclose (InputFile); 433 1.6 christos return (-1); 434 1.1 jruoho } 435 1.1 jruoho 436 1.6 christos /* Convert the DSDT and all SSDTs to binary */ 437 1.1 jruoho 438 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) 439 1.1 jruoho { 440 1.9 christos /* 441 1.9 christos * Check up front if we have a header line of the form: 442 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes) 443 1.9 christos */ 444 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER && 445 1.9 christos (State == AX_STATE_EXTRACT_DATA)) 446 1.9 christos { 447 1.9 christos /* End of previous table, start of new table */ 448 1.9 christos 449 1.9 christos if (ThisTableBytesWritten) 450 1.9 christos { 451 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, 452 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename); 453 1.9 christos } 454 1.9 christos else 455 1.9 christos { 456 1.9 christos Gbl_TableCount--; 457 1.9 christos } 458 1.9 christos 459 1.9 christos State = AX_STATE_FIND_HEADER; 460 1.9 christos } 461 1.9 christos 462 1.1 jruoho switch (State) 463 1.1 jruoho { 464 1.2 christos case AX_STATE_FIND_HEADER: 465 1.2 christos 466 1.6 christos if (!AxIsDataBlockHeader ()) 467 1.2 christos { 468 1.2 christos continue; 469 1.2 christos } 470 1.1 jruoho 471 1.12 christos ACPI_COPY_NAMESEG (ThisSignature, Gbl_LineBuffer); 472 1.1 jruoho 473 1.6 christos /* Only want DSDT and SSDTs */ 474 1.1 jruoho 475 1.12 christos if (!ACPI_COMPARE_NAMESEG (ThisSignature, ACPI_SIG_DSDT) && 476 1.12 christos !ACPI_COMPARE_NAMESEG (ThisSignature, ACPI_SIG_SSDT)) 477 1.2 christos { 478 1.2 christos continue; 479 1.2 christos } 480 1.2 christos 481 1.1 jruoho /* 482 1.6 christos * Toss this block header of the form "<sig> @ <addr>" line 483 1.6 christos * and move on to the actual data block 484 1.1 jruoho */ 485 1.6 christos Gbl_TableCount++; 486 1.6 christos ThisTableBytesWritten = 0; 487 1.2 christos State = AX_STATE_EXTRACT_DATA; 488 1.1 jruoho continue; 489 1.1 jruoho 490 1.2 christos case AX_STATE_EXTRACT_DATA: 491 1.1 jruoho 492 1.9 christos if (!AxIsHexDataLine ()) 493 1.9 christos { 494 1.9 christos continue; /* Toss any lines that are not raw hex data */ 495 1.9 christos } 496 1.9 christos 497 1.6 christos /* Empty line or non-data line terminates the data block */ 498 1.1 jruoho 499 1.11 christos BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature); 500 1.6 christos switch (BytesConverted) 501 1.1 jruoho { 502 1.6 christos case 0: 503 1.1 jruoho 504 1.6 christos State = AX_STATE_FIND_HEADER; /* No more data block lines */ 505 1.1 jruoho continue; 506 1.1 jruoho 507 1.6 christos case -1: 508 1.1 jruoho 509 1.11 christos Status = -1; 510 1.6 christos goto CleanupAndExit; /* There was a write error */ 511 1.1 jruoho 512 1.6 christos default: /* Normal case, get next line */ 513 1.1 jruoho 514 1.6 christos ThisTableBytesWritten += BytesConverted; 515 1.6 christos TotalBytesWritten += BytesConverted; 516 1.6 christos continue; 517 1.1 jruoho } 518 1.1 jruoho 519 1.1 jruoho default: 520 1.2 christos 521 1.1 jruoho Status = -1; 522 1.1 jruoho goto CleanupAndExit; 523 1.1 jruoho } 524 1.1 jruoho } 525 1.1 jruoho 526 1.1 jruoho 527 1.1 jruoho CleanupAndExit: 528 1.1 jruoho 529 1.6 christos if (State == AX_STATE_EXTRACT_DATA) 530 1.1 jruoho { 531 1.6 christos /* Received an input file EOF or error while writing data */ 532 1.1 jruoho 533 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, 534 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename); 535 1.1 jruoho } 536 1.1 jruoho 537 1.7 christos printf ("\n%u binary ACPI tables extracted and written to %s (%u bytes)\n", 538 1.6 christos Gbl_TableCount, Gbl_OutputFilename, TotalBytesWritten); 539 1.6 christos 540 1.1 jruoho fclose (InputFile); 541 1.6 christos fclose (OutputFile); 542 1.1 jruoho return (Status); 543 1.1 jruoho } 544 1.1 jruoho 545 1.1 jruoho 546 1.1 jruoho /****************************************************************************** 547 1.1 jruoho * 548 1.9 christos * FUNCTION: AxListAllTables 549 1.1 jruoho * 550 1.1 jruoho * PARAMETERS: InputPathname - Filename for acpidump file 551 1.1 jruoho * 552 1.1 jruoho * RETURN: Status 553 1.1 jruoho * 554 1.1 jruoho * DESCRIPTION: Display info for all ACPI tables found in input. Does not 555 1.1 jruoho * perform an actual extraction of the tables. 556 1.1 jruoho * 557 1.1 jruoho ******************************************************************************/ 558 1.1 jruoho 559 1.1 jruoho int 560 1.9 christos AxListAllTables ( 561 1.1 jruoho char *InputPathname) 562 1.1 jruoho { 563 1.1 jruoho FILE *InputFile; 564 1.1 jruoho unsigned char Header[48]; 565 1.9 christos UINT32 ByteCount = 0; 566 1.16 christos INT32 ThisLineByteCount; 567 1.9 christos unsigned int State = AX_STATE_FIND_HEADER; 568 1.1 jruoho 569 1.1 jruoho 570 1.1 jruoho /* Open input in text mode, output is in binary mode */ 571 1.1 jruoho 572 1.8 christos InputFile = fopen (InputPathname, "r"); 573 1.1 jruoho if (!InputFile) 574 1.1 jruoho { 575 1.6 christos printf ("Could not open input file %s\n", InputPathname); 576 1.1 jruoho return (-1); 577 1.1 jruoho } 578 1.1 jruoho 579 1.7 christos if (!AxIsFileAscii (InputFile)) 580 1.7 christos { 581 1.7 christos fclose (InputFile); 582 1.7 christos return (-1); 583 1.7 christos } 584 1.7 christos 585 1.9 christos /* Info header */ 586 1.9 christos 587 1.9 christos printf ("\n Signature Length Version Oem Oem " 588 1.9 christos "Oem Compiler Compiler\n"); 589 1.9 christos printf ( " Id TableId " 590 1.9 christos "RevisionId Name Revision\n"); 591 1.9 christos printf ( " _________ __________ ____ ________ __________ " 592 1.9 christos "__________ _______ __________\n\n"); 593 1.9 christos 594 1.1 jruoho /* Dump the headers for all tables found in the input file */ 595 1.1 jruoho 596 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) 597 1.1 jruoho { 598 1.9 christos /* Ignore empty lines */ 599 1.1 jruoho 600 1.9 christos if (AxIsEmptyLine (Gbl_LineBuffer)) 601 1.1 jruoho { 602 1.1 jruoho continue; 603 1.1 jruoho } 604 1.1 jruoho 605 1.9 christos /* 606 1.9 christos * Check up front if we have a header line of the form: 607 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes) 608 1.9 christos */ 609 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER && 610 1.9 christos (State == AX_STATE_EXTRACT_DATA)) 611 1.1 jruoho { 612 1.9 christos State = AX_STATE_FIND_HEADER; 613 1.1 jruoho } 614 1.1 jruoho 615 1.9 christos switch (State) 616 1.1 jruoho { 617 1.9 christos case AX_STATE_FIND_HEADER: 618 1.1 jruoho 619 1.9 christos ByteCount = 0; 620 1.9 christos if (!AxIsDataBlockHeader ()) 621 1.9 christos { 622 1.9 christos continue; 623 1.9 christos } 624 1.1 jruoho 625 1.9 christos State = AX_STATE_EXTRACT_DATA; 626 1.1 jruoho continue; 627 1.1 jruoho 628 1.9 christos case AX_STATE_EXTRACT_DATA: 629 1.7 christos 630 1.9 christos /* Ignore any lines that don't look like a data line */ 631 1.1 jruoho 632 1.9 christos if (!AxIsHexDataLine ()) 633 1.9 christos { 634 1.9 christos continue; /* Toss any lines that are not raw hex data */ 635 1.9 christos } 636 1.1 jruoho 637 1.9 christos /* Convert header to hex and display it */ 638 1.1 jruoho 639 1.11 christos ThisLineByteCount = AxConvertToBinary (Gbl_LineBuffer, 640 1.11 christos &Header[ByteCount]); 641 1.11 christos if (ThisLineByteCount == EOF) 642 1.11 christos { 643 1.11 christos fclose (InputFile); 644 1.11 christos return (-1); 645 1.11 christos } 646 1.11 christos 647 1.11 christos ByteCount += ThisLineByteCount; 648 1.9 christos if (ByteCount >= sizeof (ACPI_TABLE_HEADER)) 649 1.9 christos { 650 1.9 christos AxDumpTableHeader (Header); 651 1.9 christos State = AX_STATE_FIND_HEADER; 652 1.9 christos } 653 1.1 jruoho continue; 654 1.9 christos 655 1.9 christos default: 656 1.9 christos break; 657 1.1 jruoho } 658 1.1 jruoho } 659 1.1 jruoho 660 1.7 christos printf ("\nFound %u ACPI tables in %s\n", Gbl_TableCount, InputPathname); 661 1.1 jruoho fclose (InputFile); 662 1.1 jruoho return (0); 663 1.1 jruoho } 664