ACPI_STATUS AcpiTbConvertTableFadt (void) { FADT_DESCRIPTOR_REV2 *LocalFadt; ACPI_TABLE_DESC *TableDesc; ACPI_FUNCTION_TRACE ("TbConvertTableFadt"); /* * AcpiGbl_FADT is valid * Allocate and zero the 2.0 FADT buffer */ LocalFadt = ACPI_MEM_CALLOCATE (sizeof (FADT_DESCRIPTOR_REV2)); if (LocalFadt == NULL) { return_ACPI_STATUS (AE_NO_MEMORY); } /* * FADT length and version validation. The table must be at least as * long as the version 1.0 FADT */ if (AcpiGbl_FADT->Header.Length < sizeof (FADT_DESCRIPTOR_REV1)) { ACPI_REPORT_ERROR (("Invalid FADT table length: 0x%X\n", AcpiGbl_FADT->Header.Length)); return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH); } if (AcpiGbl_FADT->Header.Revision >= FADT2_REVISION_ID) { if (AcpiGbl_FADT->Header.Length < sizeof (FADT_DESCRIPTOR_REV2)) { /* Length is too short to be a V2.0 table */ ACPI_REPORT_WARNING (("Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table\n", AcpiGbl_FADT->Header.Length, AcpiGbl_FADT->Header.Revision)); AcpiTbConvertFadt1 (LocalFadt, (void *) AcpiGbl_FADT); } else { /* Valid V2.0 table */ AcpiTbConvertFadt2 (LocalFadt, AcpiGbl_FADT); } } else { /* Valid V1.0 table */ AcpiTbConvertFadt1 (LocalFadt, (void *) AcpiGbl_FADT); } /* * Global FADT pointer will point to the new common V2.0 FADT */ AcpiGbl_FADT = LocalFadt; AcpiGbl_FADT->Header.Length = sizeof (FADT_DESCRIPTOR); /* Free the original table */ TableDesc = &AcpiGbl_AcpiTables[ACPI_TABLE_FADT]; AcpiTbDeleteSingleTable (TableDesc); /* Install the new table */ TableDesc->Pointer = (ACPI_TABLE_HEADER *) AcpiGbl_FADT; TableDesc->Allocation = ACPI_MEM_ALLOCATED; TableDesc->Length = sizeof (FADT_DESCRIPTOR_REV2); /* Dump the entire FADT */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Hex dump of common internal FADT, size %d (%X)\n", AcpiGbl_FADT->Header.Length, AcpiGbl_FADT->Header.Length)); ACPI_DUMP_BUFFER ((UINT8 *) (AcpiGbl_FADT), AcpiGbl_FADT->Header.Length); return_ACPI_STATUS (AE_OK); }
ACPI_STATUS AcpiTbConvertTableFadt ( void) { FADT_DESCRIPTOR *LocalFadt; ACPI_TABLE_DESC *TableDesc; ACPI_FUNCTION_TRACE (TbConvertTableFadt); /* * AcpiGbl_FADT is valid. Validate the FADT length. The table must be * at least as long as the version 1.0 FADT */ if (AcpiGbl_FADT->Length < sizeof (FADT_DESCRIPTOR_REV1)) { ACPI_ERROR ((AE_INFO, "FADT is invalid, too short: 0x%X", AcpiGbl_FADT->Length)); return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH); } /* Allocate buffer for the ACPI 2.0(+) FADT */ LocalFadt = ACPI_ALLOCATE_ZEROED (sizeof (FADT_DESCRIPTOR)); if (!LocalFadt) { return_ACPI_STATUS (AE_NO_MEMORY); } if (AcpiGbl_FADT->Revision >= FADT2_REVISION_ID) { if (AcpiGbl_FADT->Length < sizeof (FADT_DESCRIPTOR)) { /* Length is too short to be a V2.0 table */ ACPI_WARNING ((AE_INFO, "Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table", AcpiGbl_FADT->Length, AcpiGbl_FADT->Revision)); AcpiTbConvertFadt1 (LocalFadt, (void *) AcpiGbl_FADT); } else { /* Valid V2.0 table */ AcpiTbConvertFadt2 (LocalFadt, AcpiGbl_FADT); } } else { /* Valid V1.0 table */ AcpiTbConvertFadt1 (LocalFadt, (void *) AcpiGbl_FADT); } /* Global FADT pointer will point to the new common V2.0 FADT */ AcpiGbl_FADT = LocalFadt; AcpiGbl_FADT->Length = sizeof (FADT_DESCRIPTOR); /* Free the original table */ TableDesc = AcpiGbl_TableLists[ACPI_TABLE_ID_FADT].Next; AcpiTbDeleteSingleTable (TableDesc); /* Install the new table */ TableDesc->Pointer = ACPI_CAST_PTR (ACPI_TABLE_HEADER, AcpiGbl_FADT); TableDesc->Allocation = ACPI_MEM_ALLOCATED; TableDesc->Length = sizeof (FADT_DESCRIPTOR); /* Dump the entire FADT */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Hex dump of common internal FADT, size %d (%X)\n", AcpiGbl_FADT->Length, AcpiGbl_FADT->Length)); ACPI_DUMP_BUFFER (ACPI_CAST_PTR (UINT8, AcpiGbl_FADT), AcpiGbl_FADT->Length); return_ACPI_STATUS (AE_OK); }