diff options
Diffstat (limited to 'source/tools/acpibin/abcompare.c')
| -rw-r--r-- | source/tools/acpibin/abcompare.c | 361 |
1 files changed, 84 insertions, 277 deletions
diff --git a/source/tools/acpibin/abcompare.c b/source/tools/acpibin/abcompare.c index 6bf5f9638cd81..d843400ffb959 100644 --- a/source/tools/acpibin/abcompare.c +++ b/source/tools/acpibin/abcompare.c @@ -42,10 +42,9 @@ */ #include "acpibin.h" +#include "acapps.h" -FILE *File1; -FILE *File2; ACPI_TABLE_HEADER Header1; ACPI_TABLE_HEADER Header2; @@ -69,10 +68,6 @@ AbGetFile ( char *Filename, UINT32 *FileSize); -static UINT32 -AbGetFileSize ( - FILE *File); - static void AbPrintHeaderInfo ( ACPI_TABLE_HEADER *Header); @@ -87,68 +82,6 @@ AeLocalGetRootPointer ( void); -/******************************************************************************* - * - * FUNCTION: UtHexCharToValue - * - * PARAMETERS: HexChar - Hex character in Ascii - * - * RETURN: The binary value of the hex character - * - * DESCRIPTION: Perform ascii-to-hex translation - * - ******************************************************************************/ - -static UINT8 -UtHexCharToValue ( - int HexChar, - UINT8 *OutBinary) -{ - - if (HexChar >= 0x30 && HexChar <= 0x39) - { - *OutBinary = (UINT8) (HexChar - 0x30); - return (1); - } - - else if (HexChar >= 0x41 && HexChar <= 0x46) - { - *OutBinary = (UINT8) (HexChar - 0x37); - return (1); - } - - else if (HexChar >= 0x61 && HexChar <= 0x66) - { - *OutBinary = (UINT8) (HexChar - 0x57); - return (1); - } - return (0); -} - -static UINT8 -AbHexByteToBinary ( - char *HexString, - char *OutBinary) -{ - UINT8 Local1; - UINT8 Local2; - - - if (!UtHexCharToValue (HexString[0], &Local1)) - { - return (0); - } - if (!UtHexCharToValue (HexString[1], &Local2)) - { - return (0); - } - - *OutBinary = (UINT8) ((Local1 << 4) | Local2); - return (2); - -} - - /****************************************************************************** * * FUNCTION: AbValidateHeader @@ -190,23 +123,24 @@ AcpiTbSumTable ( void *Buffer, UINT32 Length) { - const UINT8 *limit; - const UINT8 *rover; - UINT8 sum = 0; + const UINT8 *Limit; + const UINT8 *Rover; + UINT8 Sum = 0; if (Buffer && Length) { /* Buffer and Length are valid */ - limit = (UINT8 *) Buffer + Length; + Limit = (UINT8 *) Buffer + Length; - for (rover = Buffer; rover < limit; rover++) + for (Rover = Buffer; Rover < Limit; Rover++) { - sum = (UINT8) (sum + *rover); + Sum = (UINT8) (Sum + *Rover); } } - return (sum); + + return (Sum); } @@ -233,10 +167,10 @@ AbPrintHeaderInfo ( printf ("Length : %8.8X\n", Header->Length); printf ("Revision : %2.2X\n", Header->Revision); printf ("Checksum : %2.2X\n", Header->Checksum); - printf ("OEM ID : %6.6s\n", Header->OemId); - printf ("OEM Table ID : %8.8s\n", Header->OemTableId); + printf ("OEM ID : %.6s\n", Header->OemId); + printf ("OEM Table ID : %.8s\n", Header->OemTableId); printf ("OEM Revision : %8.8X\n", Header->OemRevision); - printf ("ASL Compiler ID : %4.4s\n", Header->AslCompilerId); + printf ("ASL Compiler ID : %.4s\n", Header->AslCompilerId); printf ("Compiler Revision : %8.8X\n", Header->AslCompilerRevision); printf ("\n"); } @@ -253,10 +187,10 @@ AbPrintHeadersInfo ( printf ("Length %8.8X : %8.8X\n", Header->Length, Header2->Length); printf ("Revision %8.2X : %2.2X\n", Header->Revision, Header2->Revision); printf ("Checksum %8.2X : %2.2X\n", Header->Checksum, Header2->Checksum); - printf ("OEM ID %8.6s : %6.6s\n", Header->OemId, Header2->OemId); - printf ("OEM Table ID %8.8s : %8.8s\n", Header->OemTableId, Header2->OemTableId); + printf ("OEM ID %8.6s : %.6s\n", Header->OemId, Header2->OemId); + printf ("OEM Table ID %8.8s : %.8s\n", Header->OemTableId, Header2->OemTableId); printf ("OEM Revision %8.8X : %8.8X\n", Header->OemRevision, Header2->OemRevision); - printf ("ASL Compiler ID %8.4s : %4.4s\n", Header->AslCompilerId, Header2->AslCompilerId); + printf ("ASL Compiler ID %8.4s : %.4s\n", Header->AslCompilerId, Header2->AslCompilerId); printf ("Compiler Revision %8.8X : %8.8X\n", Header->AslCompilerRevision, Header2->AslCompilerRevision); printf ("\n"); } @@ -272,22 +206,25 @@ AbPrintHeadersInfo ( void AbDisplayHeader ( - char *File1Path) + char *FilePath) { UINT32 Actual; + FILE *File; - File1 = fopen (File1Path, "rb"); - if (!File1) + File = fopen (FilePath, "rb"); + if (!File) { - printf ("Could not open file %s\n", File1Path); + printf ("Could not open file %s\n", FilePath); return; } - Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File1); + Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); + fclose (File); + if (Actual != sizeof (ACPI_TABLE_HEADER)) { - printf ("File %s does not contain an ACPI table header\n", File1Path); + printf ("File %s does not contain a valid ACPI table header\n", FilePath); return; } @@ -310,30 +247,31 @@ AbDisplayHeader ( void AbComputeChecksum ( - char *File1Path) + char *FilePath) { UINT32 Actual; ACPI_TABLE_HEADER *Table; UINT8 Checksum; + FILE *File; - File1 = fopen (File1Path, "rb"); - if (!File1) + File = fopen (FilePath, "rb"); + if (!File) { - printf ("Could not open file %s\n", File1Path); + printf ("Could not open file %s\n", FilePath); return; } - Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File1); + Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); if (Actual < sizeof (ACPI_TABLE_HEADER)) { - printf ("File %s does not contain an ACPI table header\n", File1Path); - return; + printf ("File %s does not contain a valid ACPI table header\n", FilePath); + goto Exit1; } if (!AbValidateHeader (&Header1)) { - return; + goto Exit1; } if (!Gbl_TerseMode) @@ -346,18 +284,18 @@ AbComputeChecksum ( Table = AcpiOsAllocate (Header1.Length); if (!Table) { - printf ("could not allocate\n"); - return; + printf ("Could not allocate buffer for table\n"); + goto Exit1; } /* Read the entire table, including header */ - fseek (File1, 0, SEEK_SET); - Actual = fread (Table, 1, Header1.Length, File1); + fseek (File, 0, SEEK_SET); + Actual = fread (Table, 1, Header1.Length, File); if (Actual != Header1.Length) { - printf ("could not read table, length %u\n", Header1.Length); - return; + printf ("Could not read table, length %u\n", Header1.Length); + goto Exit2; } /* Compute the checksum for the table */ @@ -369,32 +307,41 @@ AbComputeChecksum ( if (Header1.Checksum == Checksum) { - printf ("Checksum ok in AML file, not updating\n"); - return; + printf ("Checksum OK in AML file, not updating\n"); + goto Exit2; } /* Open the target file for writing, to update checksum */ - fclose (File1); - File1 = fopen (File1Path, "r+b"); - if (!File1) + fclose (File); + File = fopen (FilePath, "r+b"); + if (!File) { - printf ("Could not open file %s for writing\n", File1Path); - return; + printf ("Could not open file %s for writing\n", FilePath); + goto Exit2; } /* Set the checksum, write the new header */ Header1.Checksum = Checksum; - Actual = fwrite (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File1); + Actual = fwrite (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); if (Actual != sizeof (ACPI_TABLE_HEADER)) { printf ("Could not write updated table header\n"); - return; + goto Exit2; } printf ("Wrote new checksum\n"); + +Exit2: + AcpiOsFree (Table); + +Exit1: + if (File) + { + fclose (File); + } return; } @@ -419,6 +366,9 @@ AbCompareAmlFiles ( UINT8 Char2; UINT8 Mismatches = 0; BOOLEAN HeaderMismatch = FALSE; + FILE *File1; + FILE *File2; + int Status = -1; File1 = fopen (File1Path, "rb"); @@ -432,7 +382,7 @@ AbCompareAmlFiles ( if (!File2) { printf ("Could not open file %s\n", File2Path); - return (-1); + goto Exit1; } /* Read the ACPI header from each file */ @@ -441,20 +391,20 @@ AbCompareAmlFiles ( if (Actual1 != sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain an ACPI table header\n", File1Path); - return (-1); + goto Exit2; } Actual2 = fread (&Header2, 1, sizeof (ACPI_TABLE_HEADER), File2); if (Actual2 != sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain an ACPI table header\n", File2Path); - return (-1); + goto Exit2; } if ((!AbValidateHeader (&Header1)) || (!AbValidateHeader (&Header2))) { - return (-1); + goto Exit2; } /* Table signatures must match */ @@ -462,7 +412,7 @@ AbCompareAmlFiles ( if (*((UINT32 *) Header1.Signature) != *((UINT32 *) Header2.Signature)) { printf ("Table signatures do not match\n"); - return (-1); + goto Exit2; } if (!Gbl_TerseMode) @@ -494,7 +444,7 @@ AbCompareAmlFiles ( if (Mismatches > 100) { printf ("100 Mismatches: Too many mismatches\n"); - return (-1); + goto Exit2; } } @@ -526,43 +476,14 @@ AbCompareAmlFiles ( } printf ("%u Mismatches found\n", Mismatches); - return (0); -} + Status = 0; +Exit2: + fclose (File2); -/****************************************************************************** - * - * FUNCTION: AbGetFileSize - * - * DESCRIPTION: Get the size of an open file - * - ******************************************************************************/ - -static UINT32 -AbGetFileSize ( - FILE *File) -{ - UINT32 FileSize; - long Offset; - - - Offset = ftell (File); - - if (fseek (File, 0, SEEK_END)) - { - return (0); - } - - FileSize = (UINT32) ftell (File); - - /* Restore file pointer */ - - if (fseek (File, Offset, SEEK_SET)) - { - return (0); - } - - return (FileSize); +Exit1: + fclose (File1); + return (Status); } @@ -596,8 +517,8 @@ AbGetFile ( /* Need file size to allocate a buffer */ - Size = AbGetFileSize (File); - if (!Size) + Size = CmGetFileSize (File); + if (Size == ACPI_UINT32_MAX) { printf ("Could not get file size (seek) for %s\n", Filename); goto ErrorExit; @@ -647,6 +568,7 @@ AbDumpAmlFile ( char *FileBuffer; FILE *FileOutHandle; UINT32 FileSize = 0; + int Status = -1; /* Get the entire AML file, validate header */ @@ -664,12 +586,12 @@ AbDumpAmlFile ( if (!FileOutHandle) { printf ("Could not open file %s\n", File2Path); - return (-1); + goto Exit1; } if (!AbValidateHeader ((ACPI_TABLE_HEADER *) FileBuffer)) { - return (-1); + goto Exit2; } /* Convert binary AML to text, using common dump buffer routine */ @@ -684,133 +606,18 @@ AbDumpAmlFile ( /* Summary for the output file */ - FileSize = AbGetFileSize (FileOutHandle); + FileSize = CmGetFileSize (FileOutHandle); printf ("Output file: %s contains %u (0x%X) bytes\n\n", File2Path, FileSize, FileSize); - return (0); -} - - -/****************************************************************************** - * - * FUNCTION: AbExtractAmlFile - * - * DESCRIPTION: Extract a binary AML file from a text file (as produced by the - * DumpAmlFile procedure or the "acpidump" table utility. - * - ******************************************************************************/ - -int -AbExtractAmlFile ( - char *TableSig, - char *File1Path, - char *File2Path) -{ - char *Table; - char Value; - UINT32 i; - FILE *FileHandle; - FILE *FileOutHandle; - UINT32 Count = 0; - int Scanned; - - - /* Open in/out files. input is in text mode, output is in binary mode */ - - FileHandle = fopen (File1Path, "rt"); - if (!FileHandle) - { - printf ("Could not open file %s\n", File1Path); - return (-1); - } - - FileOutHandle = fopen (File2Path, "w+b"); - if (!FileOutHandle) - { - printf ("Could not open file %s\n", File2Path); - return (-1); - } - - /* Force input table sig to uppercase */ - - AcpiUtStrupr (TableSig); - - - /* TBD: examine input for ASCII */ - - - /* We have an ascii file, grab one line at a time */ - - while (fgets (Buffer, BUFFER_SIZE, FileHandle)) - { - /* The 4-char ACPI signature appears at the beginning of a line */ + Status = 0; - if (ACPI_COMPARE_NAME (Buffer, TableSig)) - { - printf ("Found table [%4.4s]\n", TableSig); - - /* - * Eat all lines in the table, of the form: - * <offset>: <16 bytes of hex data, separated by spaces> <ASCII representation> <newline> - * - * Example: - * - * 02C0: 5F 53 42 5F 4C 4E 4B 44 00 12 13 04 0C FF FF 08 _SB_LNKD........ - * - */ - while (fgets (Buffer, BUFFER_SIZE, FileHandle)) - { - /* Get past the offset, terminated by a colon */ - - Table = strchr (Buffer, ':'); - if (!Table) - { - /* No colon, all done */ - goto Exit; - } - - Table += 2; /* Eat the colon + space */ - - for (i = 0; i < 16; i++) - { - Scanned = AbHexByteToBinary (Table, &Value); - if (!Scanned) - { - goto Exit; - } - - Table += 3; /* Go past this hex byte and space */ - - /* Write the converted (binary) byte */ - - if (fwrite (&Value, 1, 1, FileOutHandle) != 1) - { - printf ("Error writing byte %u to output file: %s\n", - Count, File2Path); - goto Exit; - } - Count++; - } - } - - /* No more lines, EOF, all done */ - - goto Exit; - } - } - - /* Searched entire file, no match to table signature */ - - printf ("Could not match table signature\n"); - fclose (FileHandle); - return (-1); - -Exit: - printf ("%u (0x%X) bytes written to %s\n", Count, Count, File2Path); - fclose (FileHandle); +Exit2: fclose (FileOutHandle); - return (0); + +Exit1: + free (FileBuffer); + return (Status); } |
