⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a16find.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
 * PARAMETERS:  Root            - Root of the parse tree * * RETURN:      None * * DESCRIPTION: * *****************************************************************************/ACPI_STATUSAfGetAllTables (    UINT32                  NumberOfTables,    char                    *TablePtr){    ACPI_STATUS             Status = AE_OK;    UINT32                  Index;    ACPI_TABLE_DESC         TableInfo;    ACPI_FUNCTION_TRACE (AfGetAllTables);    if (AcpiGbl_DbOpt_verbose)    {        AcpiOsPrintf ("Number of tables: %d\n", (UINT32) NumberOfTables);    }    /*     * Loop through all table pointers found in RSDT.     * This will NOT include the FACS and DSDT - we must get     * them after the loop     */    for (Index = 0; Index < NumberOfTables; Index++)    {        /* Get the table via the RSDT */        CopyExtendedToReal (&AcpiTblHeader, ACPI_GET_ADDRESS (AcpiGbl_XSDT->TableOffsetEntry[Index]),                            sizeof (ACPI_TABLE_HEADER));        TableInfo.Pointer       = &AcpiTblHeader;        TableInfo.Length        = (ACPI_SIZE) AcpiTblHeader.Length;        TableInfo.Allocation    = ACPI_MEM_ALLOCATED;        ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Table pointer: %X\n",            (UINT32) ACPI_GET_ADDRESS (AcpiGbl_XSDT->TableOffsetEntry[Index])));        Status = AfRecognizeTable (NULL, ACPI_GET_ADDRESS (AcpiGbl_XSDT->TableOffsetEntry[Index]), &TableInfo);        if (ACPI_SUCCESS (Status))        {            AcpiTbInitTableDescriptor (TableInfo.Type, &TableInfo);        }       /* Ignore errors, just move on to next table */    }    if (!AcpiGbl_FADT)    {        AcpiOsPrintf ("FADT was not found, cannot obtain FACS and DSDT!\n");        return (AE_NO_ACPI_TABLES);    }    Status = AcpiTbConvertTableFadt ();    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Get the FACS     */    CopyExtendedToReal (&AcpiTblHeader, ACPI_GET_ADDRESS (AcpiGbl_FADT->XFirmwareCtrl),                        sizeof (ACPI_TABLE_HEADER));    AcpiGbl_FACS = ACPI_ALLOCATE (AcpiTblHeader.Length);    if (!AcpiGbl_FACS)    {        AcpiOsPrintf ("Could not allocate buffer for FADT length 0x%X\n",                        (UINT32) AcpiTblHeader.Length);        return_ACPI_STATUS (AE_NO_MEMORY);    }    CopyExtendedToReal (AcpiGbl_FACS, ACPI_GET_ADDRESS (AcpiGbl_FADT->XFirmwareCtrl), AcpiTblHeader.Length);    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "FACS at %p (Phys %8.8X) length %X FADT at%p\n",                    AcpiGbl_FACS, (UINT32) ACPI_GET_ADDRESS (AcpiGbl_FADT->XFirmwareCtrl),                    (UINT32) AcpiTblHeader.Length, AcpiGbl_FADT));    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) AcpiGbl_FADT, sizeof (ACPI_TABLE_HEADER), 0, 0);    }    TableInfo.Type          = ACPI_TABLE_FADT;    TableInfo.Pointer       = (void *) AcpiGbl_FADT;    TableInfo.Length        = (ACPI_SIZE) AcpiTblHeader.Length;    TableInfo.Allocation    = ACPI_MEM_ALLOCATED;    /* There is no checksum for the FACS, nothing to verify */    AcpiTbInitTableDescriptor (TableInfo.Type, &TableInfo);    AcpiTbBuildCommonFacs (&TableInfo);    /*     * Get the DSDT     */    CopyExtendedToReal (&AcpiTblHeader, ACPI_GET_ADDRESS (AcpiGbl_FADT->XDsdt), sizeof (ACPI_TABLE_HEADER));    AcpiGbl_DSDT = ACPI_ALLOCATE (AcpiTblHeader.Length);    if (!AcpiGbl_DSDT)    {        AcpiOsPrintf ("Could not allocate buffer for DSDT length 0x%X\n", (UINT32) AcpiTblHeader.Length);        return_ACPI_STATUS (AE_NO_MEMORY);    }    CopyExtendedToReal (AcpiGbl_DSDT, ACPI_GET_ADDRESS (AcpiGbl_FADT->XDsdt), AcpiTblHeader.Length);    AcpiOsPrintf ("DSDT at %p (Phys %8.8X) length %X FADT at %p\n",                    AcpiGbl_DSDT, (UINT32) ACPI_GET_ADDRESS (AcpiGbl_FADT->XDsdt),                    (UINT32) AcpiTblHeader.Length, AcpiGbl_FADT);    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) AcpiGbl_DSDT, sizeof (ACPI_TABLE_HEADER), 0, 0);    }    TableInfo.Type          = ACPI_TABLE_DSDT;    TableInfo.Pointer       = (void *) AcpiGbl_DSDT;    TableInfo.Length        = (ACPI_SIZE) AcpiTblHeader.Length;    TableInfo.Allocation    = ACPI_MEM_ALLOCATED;    AcpiTbInitTableDescriptor (TableInfo.Type, &TableInfo);    AcpiTbVerifyTableChecksum ((ACPI_TABLE_HEADER *) AcpiGbl_DSDT);    return_ACPI_STATUS (AE_OK);}ACPI_STATUSAfGetRsdt (void){    BOOLEAN                 Found;    UINT32                  PhysicalAddress;    UINT32                  SignatureLength;    char                    *TableSignature;    ACPI_STATUS             Status;    ACPI_TABLE_DESC         TableInfo;    ACPI_FUNCTION_TRACE (AfGetRsdt);    if (AcpiGbl_XSDT)    {        return (AE_OK);    }    Found = AfFindRsdp (&AcpiGbl_RSDP);    if (!Found)    {        AcpiOsPrintf ("Could not find RSDP in the low megabyte\n");        return (AE_NO_ACPI_TABLES);    }    /* Use XSDT if it is present */    if ((AcpiGbl_RSDP->Revision >= 2) &&        ACPI_GET_ADDRESS (AcpiGbl_RSDP->XsdtPhysicalAddress))    {        PhysicalAddress = ACPI_GET_ADDRESS (AcpiGbl_RSDP->XsdtPhysicalAddress);        TableSignature = ACPI_SIG_XSDT;        SignatureLength = sizeof (ACPI_SIG_XSDT) -1;        AcpiGbl_RootTableType = ACPI_TABLE_TYPE_XSDT;        ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found XSDT\n"));    }    else    {        /* No XSDT, use the RSDT */        PhysicalAddress = AcpiGbl_RSDP->RsdtPhysicalAddress;        TableSignature = ACPI_SIG_RSDT;        SignatureLength = sizeof (ACPI_SIG_RSDT) -1;        AcpiGbl_RootTableType = ACPI_TABLE_TYPE_RSDT;        ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found RSDT\n"));    }    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) AcpiGbl_RSDP, sizeof (RSDP_DESCRIPTOR), 0, ACPI_UINT32_MAX);    }    /* Get the RSDT/XSDT header to determine the table length */    CopyExtendedToReal (&AcpiTblHeader, PhysicalAddress, sizeof (ACPI_TABLE_HEADER));    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDT/XSDT at %8.8X\n", (UINT32) PhysicalAddress));    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) &AcpiTblHeader, sizeof (ACPI_TABLE_HEADER), 0, ACPI_UINT32_MAX);    }    /* Validate the table header */    Status = AcpiTbValidateTableHeader (&AcpiTblHeader);    if (ACPI_FAILURE (Status))    {        /* Table failed verification, map all errors to BAD_DATA */        ACPI_ERROR ((AE_INFO, "Invalid RSDT table header"));        return (AE_BAD_DATA);    }    /* Allocate a buffer for the entire table */    AcpiGbl_XSDT = (void *) malloc ((size_t) AcpiTblHeader.Length);    if (!AcpiGbl_XSDT)    {        AcpiOsPrintf ("Could not allocate buffer for RSDT length 0x%X\n",            (UINT32) AcpiTblHeader.Length);        return AE_NO_MEMORY;    }    /* Get the entire RSDT/XSDT */    CopyExtendedToReal (AcpiGbl_XSDT, PhysicalAddress, AcpiTblHeader.Length);    AcpiOsPrintf ("%s at %p (Phys %8.8X)\n",        TableSignature, AcpiGbl_XSDT, (UINT32) PhysicalAddress);    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) &AcpiTblHeader, sizeof (ACPI_TABLE_HEADER), 0, 0);    }    /* Convert to common format XSDT */    TableInfo.Pointer       = (ACPI_TABLE_HEADER *) AcpiGbl_XSDT;    TableInfo.Length        = (ACPI_SIZE) AcpiTblHeader.Length;    TableInfo.Allocation    = ACPI_MEM_ALLOCATED;    AcpiGbl_RsdtTableCount = AcpiTbGetTableCount (AcpiGbl_RSDP, TableInfo.Pointer);    Status = AcpiTbConvertToXsdt (&TableInfo);    if (ACPI_FAILURE (Status))    {        goto ErrorExit;    }    AcpiGbl_XSDT = (XSDT_DESCRIPTOR *) TableInfo.Pointer;ErrorExit:    return (Status);}voidAfDumpRsdt (void){    UINT32                  i;    UINT32                  NumTables;    UINT32                  PhysicalAddress;    ACPI_TABLE_HEADER       **Table;    ACPI_TABLE_HEADER       ThisTable;    NumTables = (AcpiGbl_XSDT->Length - sizeof (ACPI_TABLE_HEADER)) / 8;    AcpiOsPrintf ("%d Tables defined in RSDT/XSDT:\n", NumTables);    for (i = 0; i < NumTables; i++)    {        PhysicalAddress = (UINT32) AcpiGbl_XSDT->TableOffsetEntry[i].Lo;        CopyExtendedToReal (&ThisTable, PhysicalAddress, sizeof (ACPI_TABLE_HEADER));        AcpiOsPrintf ("[%4.4s] ", ThisTable.Signature);        ((char *) Table) += 8;    }    AcpiOsPrintf ("\n");}ACPI_STATUSAfGetTable (    ACPI_TABLE_HEADER       *TableHeader,    UINT32                  PhysicalAddress,    UINT8                   **TablePtr){    /* Allocate a buffer for the entire table */    *TablePtr = (void *) malloc ((size_t) TableHeader->Length);    if (!*TablePtr)    {        AcpiOsPrintf ("Could not allocate buffer for table length 0x%X\n",            (UINT32) TableHeader->Length);        return AE_NO_MEMORY;    }    /* Get the entire table */    CopyExtendedToReal (*TablePtr, PhysicalAddress, TableHeader->Length);    AcpiOsPrintf ("%4.4s at %p (Phys %8.8X)\n",        TableHeader->Signature, *TablePtr, (UINT32) PhysicalAddress);    if (AcpiGbl_DbOpt_verbose)    {        AcpiUtDumpBuffer ((char *) TableHeader, sizeof (ACPI_TABLE_HEADER), 0, 0);    }    return (AE_OK);}ACPI_STATUSAfGetTableFromXsdt (    char                    *TableName,    UINT8                   **TablePtr){    UINT32                  i;    UINT32                  NumTables;    UINT32                  PhysicalAddress;    ACPI_TABLE_HEADER       ThisTable;    NumTables = (AcpiGbl_XSDT->Length - sizeof (ACPI_TABLE_HEADER)) / 8;    for (i = 0; i < NumTables; i++)    {        PhysicalAddress = (UINT32) AcpiGbl_XSDT->TableOffsetEntry[i].Lo;        CopyExtendedToReal (&ThisTable, PhysicalAddress, sizeof (ACPI_TABLE_HEADER));        if (ACPI_COMPARE_NAME (TableName, ThisTable.Signature))        {            AfGetTable (&ThisTable, PhysicalAddress, TablePtr);            return (AE_OK);        }    }    return (AE_NOT_FOUND);}/****************************************************************************** * * FUNCTION:    AfFindTable * * PARAMETERS: * * RETURN:      Status * * DESCRIPTION: Load the DSDT from the file pointer * *****************************************************************************/ACPI_STATUSAfFindTable (    char                    *TableName,    UINT8                   **TablePtr,    UINT32                  *TableLength){    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (AfFindTable);    if (!AcpiGbl_DSDT)    {        Status = AfGetRsdt ();        if (ACPI_FAILURE (Status))        {            return (Status);        }        AfDumpRsdt ();        /* Get the rest of the required tables (DSDT, FADT) */        Status = AfGetAllTables (AcpiGbl_RsdtTableCount, NULL);        if (ACPI_FAILURE (Status))        {            goto ErrorExit;        }        ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));    }    if (ACPI_COMPARE_NAME (TableName, ACPI_SIG_DSDT))    {        *TablePtr = (UINT8 *) AcpiGbl_DSDT;        *TableLength = AcpiGbl_DSDT->Length;    }    else if (ACPI_COMPARE_NAME (TableName, ACPI_SIG_FADT))    {        *TablePtr = (UINT8 *) AcpiGbl_FADT;        *TableLength = AcpiGbl_FADT->Length;    }    else if (ACPI_COMPARE_NAME (TableName, ACPI_SIG_FACS))    {        *TablePtr = (UINT8 *) AcpiGbl_FACS;        *TableLength = AcpiGbl_FACS->Length;    }    else if (ACPI_COMPARE_NAME (TableName, ACPI_SIG_RSDT))    {        *TablePtr = (UINT8 *) AcpiGbl_XSDT;        *TableLength = AcpiGbl_XSDT->Length;    }    else if (ACPI_COMPARE_NAME (TableName, ACPI_SIG_SSDT))    {        AcpiOsPrintf ("Unsupported table signature: [%4.4s]\n", TableName);        *TablePtr = NULL;        return AE_SUPPORT;    }    else    {        Status = AfGetTableFromXsdt (TableName, TablePtr);        if (ACPI_FAILURE (Status))        {            goto ErrorExit;        }        *TableLength = (*((ACPI_TABLE_HEADER **)TablePtr))->Length;    }    return AE_OK;ErrorExit:    ACPI_EXCEPTION ((AE_INFO, Status, "During ACPI Table initialization");    return (Status);}#ifdef _HPETUINT8           Hbuf[1024];voidAfGetHpet (void){    HPET_DESCRIPTION_TABLE  *NewTable;    ACPI_TABLE_HEADER       TableHeader;    ACPI_STATUS             Status;    UINT16                  i;    UINT32                  Value;    UINT32                  Value2;    /* Get HPET  TEMP! */    ACPI_STRNCPY (TableHeader.Signature, "HPET", 4);    Status = AcpiOsTableOverride (&TableHeader, (ACPI_TABLE_HEADER **) &NewTable);    if (ACPI_FAILURE (Status))    {        return;    }    AcpiDbgLevel |= ACPI_LV_TABLES;    AcpiOsPrintf ("HPET table :\n");    AcpiUtDumpBuffer ((char *) NewTable, NewTable->Header.Length, DB_BYTE_DISPLAY, ACPI_UINT32_MAX);    for (i = 0; i < 1024; i++)    {        Hbuf[i] = (UINT8) i;    }    /* enable HPET */    CopyExtendedToReal (&Value, 0xD0, 4);    AcpiOsPrintf ("Reg 0xD0: %8.8X\n", Value);    Value = dIn32 (0xD0);    AcpiOsPrintf ("Port 0xD0: %8.8X\n", Value);    Value |= ACPI_ENABLE_HPET;    vOut32 (0xD0, Value);    Value2 = dIn32 (0xD0);    AcpiOsPrintf ("Port 0xD0: Wrote: %8.8X got %8.8X\n", Value, Value2);    AcpiOsPrintf ("HPET block(at %8.8X):\n", NewTable->BaseAddress[2]);    CopyExtendedToReal (Hbuf, NewTable->BaseAddress[2], 1024);    AcpiUtDumpBuffer ((char *) Hbuf, 1024, DB_BYTE_DISPLAY, ACPI_UINT32_MAX);}#endif /* _HPET */#endif /* IA16 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -