Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}