1 /******************************************************************************
3 * Module Name: abcompare - compare AML files
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2014, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
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.
48 ACPI_TABLE_HEADER Header1;
49 ACPI_TABLE_HEADER Header2;
51 #define BUFFER_SIZE 256
52 char Buffer[BUFFER_SIZE];
55 /* Local prototypes */
59 ACPI_TABLE_HEADER *Header);
73 ACPI_TABLE_HEADER *Header);
77 ACPI_TABLE_HEADER *Header,
78 ACPI_TABLE_HEADER *Header2);
81 AeLocalGetRootPointer (
85 /******************************************************************************
87 * FUNCTION: AbValidateHeader
89 * DESCRIPTION: Check for valid ACPI table header
91 ******************************************************************************/
95 ACPI_TABLE_HEADER *Header)
98 if (!AcpiUtValidAcpiName (Header->Signature))
100 printf ("Header signature is invalid\n");
108 /*******************************************************************************
110 * FUNCTION: AcpiTbSumTable
112 * PARAMETERS: Buffer - Buffer to checksum
113 * Length - Size of the buffer
115 * RETURNS 8 bit checksum of buffer
117 * DESCRIPTION: Computes an 8 bit checksum of the buffer(length) and returns it.
119 ******************************************************************************/
131 if (Buffer && Length)
133 /* Buffer and Length are valid */
135 Limit = (UINT8 *) Buffer + Length;
137 for (Rover = Buffer; Rover < Limit; Rover++)
139 Sum = (UINT8) (Sum + *Rover);
147 /*******************************************************************************
149 * FUNCTION: AbPrintHeaderInfo
151 * PARAMETERS: Header - An ACPI table header
155 * DESCRIPTION: Format and display header contents.
157 ******************************************************************************/
161 ACPI_TABLE_HEADER *Header)
164 /* Display header information */
166 printf ("Signature : %4.4s\n", Header->Signature);
167 printf ("Length : %8.8X\n", Header->Length);
168 printf ("Revision : %2.2X\n", Header->Revision);
169 printf ("Checksum : %2.2X\n", Header->Checksum);
170 printf ("OEM ID : %.6s\n", Header->OemId);
171 printf ("OEM Table ID : %.8s\n", Header->OemTableId);
172 printf ("OEM Revision : %8.8X\n", Header->OemRevision);
173 printf ("ASL Compiler ID : %.4s\n", Header->AslCompilerId);
174 printf ("Compiler Revision : %8.8X\n", Header->AslCompilerRevision);
180 ACPI_TABLE_HEADER *Header,
181 ACPI_TABLE_HEADER *Header2)
184 /* Display header information for both headers */
186 printf ("Signature %8.4s : %4.4s\n", Header->Signature, Header2->Signature);
187 printf ("Length %8.8X : %8.8X\n", Header->Length, Header2->Length);
188 printf ("Revision %8.2X : %2.2X\n", Header->Revision, Header2->Revision);
189 printf ("Checksum %8.2X : %2.2X\n", Header->Checksum, Header2->Checksum);
190 printf ("OEM ID %8.6s : %.6s\n", Header->OemId, Header2->OemId);
191 printf ("OEM Table ID %8.8s : %.8s\n", Header->OemTableId, Header2->OemTableId);
192 printf ("OEM Revision %8.8X : %8.8X\n", Header->OemRevision, Header2->OemRevision);
193 printf ("ASL Compiler ID %8.4s : %.4s\n", Header->AslCompilerId, Header2->AslCompilerId);
194 printf ("Compiler Revision %8.8X : %8.8X\n", Header->AslCompilerRevision, Header2->AslCompilerRevision);
199 /******************************************************************************
201 * FUNCTION: AbDisplayHeader
203 * DESCRIPTION: Display an ACPI table header
205 ******************************************************************************/
215 File = fopen (FilePath, "rb");
218 printf ("Could not open file %s\n", FilePath);
222 Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File);
225 if (Actual != sizeof (ACPI_TABLE_HEADER))
227 printf ("File %s does not contain a valid ACPI table header\n", FilePath);
231 if (!AbValidateHeader (&Header1))
236 AbPrintHeaderInfo (&Header1);
240 /******************************************************************************
242 * FUNCTION: AbComputeChecksum
244 * DESCRIPTION: Compute proper checksum for an ACPI table
246 ******************************************************************************/
253 ACPI_TABLE_HEADER *Table;
258 File = fopen (FilePath, "rb");
261 printf ("Could not open file %s\n", FilePath);
265 Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File);
266 if (Actual < sizeof (ACPI_TABLE_HEADER))
268 printf ("File %s does not contain a valid ACPI table header\n", FilePath);
272 if (!AbValidateHeader (&Header1))
279 AbPrintHeaderInfo (&Header1);
282 /* Allocate a buffer to hold the entire table */
284 Table = AcpiOsAllocate (Header1.Length);
287 printf ("Could not allocate buffer for table\n");
291 /* Read the entire table, including header */
293 fseek (File, 0, SEEK_SET);
294 Actual = fread (Table, 1, Header1.Length, File);
295 if (Actual != Header1.Length)
297 printf ("Could not read table, length %u\n", Header1.Length);
301 /* Compute the checksum for the table */
305 Checksum = (UINT8) (0 - AcpiTbSumTable (Table, Table->Length));
306 printf ("Computed checksum: 0x%X\n\n", Checksum);
308 if (Header1.Checksum == Checksum)
310 printf ("Checksum OK in AML file, not updating\n");
314 /* Open the target file for writing, to update checksum */
317 File = fopen (FilePath, "r+b");
320 printf ("Could not open file %s for writing\n", FilePath);
324 /* Set the checksum, write the new header */
326 Header1.Checksum = Checksum;
328 Actual = fwrite (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File);
329 if (Actual != sizeof (ACPI_TABLE_HEADER))
331 printf ("Could not write updated table header\n");
335 printf ("Wrote new checksum\n");
349 /******************************************************************************
351 * FUNCTION: AbCompareAmlFiles
353 * DESCRIPTION: Compare two AML files
355 ******************************************************************************/
367 UINT8 Mismatches = 0;
368 BOOLEAN HeaderMismatch = FALSE;
374 File1 = fopen (File1Path, "rb");
377 printf ("Could not open file %s\n", File1Path);
381 File2 = fopen (File2Path, "rb");
384 printf ("Could not open file %s\n", File2Path);
388 /* Read the ACPI header from each file */
390 Actual1 = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File1);
391 if (Actual1 != sizeof (ACPI_TABLE_HEADER))
393 printf ("File %s does not contain an ACPI table header\n", File1Path);
397 Actual2 = fread (&Header2, 1, sizeof (ACPI_TABLE_HEADER), File2);
398 if (Actual2 != sizeof (ACPI_TABLE_HEADER))
400 printf ("File %s does not contain an ACPI table header\n", File2Path);
404 if ((!AbValidateHeader (&Header1)) ||
405 (!AbValidateHeader (&Header2)))
410 /* Table signatures must match */
412 if (*((UINT32 *) Header1.Signature) != *((UINT32 *) Header2.Signature))
414 printf ("Table signatures do not match\n");
420 /* Display header information */
422 AbPrintHeadersInfo (&Header1, &Header2);
425 if (memcmp (&Header1, &Header2, sizeof (ACPI_TABLE_HEADER)))
427 printf ("Headers do not match exactly\n");
428 HeaderMismatch = TRUE;
431 /* Do the byte-by-byte compare */
433 Actual1 = fread (&Char1, 1, 1, File1);
434 Actual2 = fread (&Char2, 1, 1, File2);
435 Offset = sizeof (ACPI_TABLE_HEADER);
437 while ((Actual1 == 1) && (Actual2 == 1))
441 printf ("Error - Byte mismatch at offset %8.8X: 0x%2.2X 0x%2.2X\n",
442 Offset, Char1, Char2);
444 if (Mismatches > 100)
446 printf ("100 Mismatches: Too many mismatches\n");
452 Actual1 = fread (&Char1, 1, 1, File1);
453 Actual2 = fread (&Char2, 1, 1, File2);
458 printf ("Error - file %s is longer than file %s\n", File1Path, File2Path);
463 printf ("Error - file %s is shorter than file %s\n", File1Path, File2Path);
466 else if (!Mismatches)
470 printf ("Files compare exactly after header\n");
474 printf ("Files compare exactly\n");
478 printf ("%u Mismatches found\n", Mismatches);
490 /******************************************************************************
492 * FUNCTION: AbGetFile
494 * DESCRIPTION: Open a file and read it entirely into a new buffer
496 ******************************************************************************/
509 /* Binary mode does not alter CR/LF pairs */
511 File = fopen (Filename, "rb");
514 printf ("Could not open file %s\n", Filename);
518 /* Need file size to allocate a buffer */
520 Size = CmGetFileSize (File);
521 if (Size == ACPI_UINT32_MAX)
523 printf ("Could not get file size (seek) for %s\n", Filename);
527 /* Allocate a buffer for the entire file */
529 Buffer = calloc (Size, 1);
532 printf ("Could not allocate buffer of size %u\n", Size);
536 /* Read the entire file */
538 Actual = fread (Buffer, 1, Size, File);
541 printf ("Could not read the input file %s\n", Filename);
555 /******************************************************************************
557 * FUNCTION: AbDumpAmlFile
559 * DESCRIPTION: Dump a binary AML file to a text file
561 ******************************************************************************/
574 /* Get the entire AML file, validate header */
576 FileBuffer = AbGetFile (File1Path, &FileSize);
582 printf ("Input file: %s contains %u (0x%X) bytes\n",
583 File1Path, FileSize, FileSize);
585 FileOutHandle = fopen (File2Path, "wb");
588 printf ("Could not open file %s\n", File2Path);
592 if (!AbValidateHeader ((ACPI_TABLE_HEADER *) FileBuffer))
597 /* Convert binary AML to text, using common dump buffer routine */
599 AcpiGbl_DebugFile = FileOutHandle;
600 AcpiGbl_DbOutputFlags = ACPI_DB_REDIRECTABLE_OUTPUT;
602 AcpiOsPrintf ("%4.4s @ 0x%8.8X\n",
603 ((ACPI_TABLE_HEADER *) FileBuffer)->Signature, 0);
605 AcpiUtDumpBuffer ((UINT8 *) FileBuffer, FileSize, DB_BYTE_DISPLAY, 0);
607 /* Summary for the output file */
609 FileSize = CmGetFileSize (FileOutHandle);
610 printf ("Output file: %s contains %u (0x%X) bytes\n\n",
611 File2Path, FileSize, FileSize);
616 fclose (FileOutHandle);
624 /******************************************************************************
628 * DESCRIPTION: For linkage
630 ******************************************************************************/
632 ACPI_PHYSICAL_ADDRESS
633 AeLocalGetRootPointer (
648 ACPI_EXECUTE_TYPE Type,
649 ACPI_OSD_EXEC_CALLBACK Function,