diff options
Diffstat (limited to 'sys/contrib/dev/acpica/tbxfroot.c')
-rw-r--r-- | sys/contrib/dev/acpica/tbxfroot.c | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/sys/contrib/dev/acpica/tbxfroot.c b/sys/contrib/dev/acpica/tbxfroot.c index 1234c22..aac1503 100644 --- a/sys/contrib/dev/acpica/tbxfroot.c +++ b/sys/contrib/dev/acpica/tbxfroot.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbxfroot - Find the root ACPI table (RSDT) - * $Revision: 63 $ + * $Revision: 64 $ * *****************************************************************************/ @@ -155,9 +155,9 @@ AcpiTbFindTable ( /* Validate string lengths */ - if ((ACPI_STRLEN (Signature) > 4) || - (ACPI_STRLEN (OemId) > 6) || - (ACPI_STRLEN (OemTableId) > 8)) + if ((ACPI_STRLEN (Signature) > ACPI_NAME_SIZE) || + (ACPI_STRLEN (OemId) > sizeof (Table->OemId)) || + (ACPI_STRLEN (OemTableId) > sizeof (Table->OemTableId))) { return_ACPI_STATUS (AE_AML_STRING_LIMIT); } @@ -191,7 +191,7 @@ AcpiTbFindTable ( * PARAMETERS: Signature - Any ACPI table signature * Instance - the non zero instance of the table, allows * support for multiple tables of the same type - * Flags - 0: Physical/Virtual support + * Flags - Physical/Virtual support * RetBuffer - pointer to a structure containing a buffer to * receive the table * @@ -215,11 +215,10 @@ AcpiGetFirmwareTable ( { ACPI_POINTER RsdpAddress; ACPI_POINTER Address; - ACPI_TABLE_HEADER *RsdtPtr = NULL; - ACPI_TABLE_HEADER *TablePtr; ACPI_STATUS Status; - ACPI_SIZE RsdtSize = 0; - ACPI_SIZE TableSize; + ACPI_TABLE_HEADER Header; + ACPI_TABLE_DESC TableInfo; + ACPI_TABLE_DESC RsdtInfo; UINT32 TableCount; UINT32 i; UINT32 j; @@ -243,6 +242,8 @@ AcpiGetFirmwareTable ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + RsdtInfo.Pointer = NULL; + if (!AcpiGbl_RSDP) { /* Get the RSDP */ @@ -277,16 +278,14 @@ AcpiGetFirmwareTable ( { /* Nope, BAD Signature */ - Status = AE_BAD_SIGNATURE; - goto Cleanup; + return_ACPI_STATUS (AE_BAD_SIGNATURE); } if (AcpiTbChecksum (AcpiGbl_RSDP, ACPI_RSDP_CHECKSUM_LENGTH) != 0) { /* Nope, BAD Checksum */ - Status = AE_BAD_CHECKSUM; - goto Cleanup; + return_ACPI_STATUS (AE_BAD_CHECKSUM); } } @@ -300,13 +299,17 @@ AcpiGetFirmwareTable ( ACPI_HIDWORD (Address.Pointer.Value), ACPI_LODWORD (Address.Pointer.Value))); - Status = AcpiTbGetTablePointer (&Address, Flags, &RsdtSize, &RsdtPtr); + /* Insert ProcessorMode flags */ + + Address.PointerType |= Flags; + + Status = AcpiTbGetTable (&Address, &RsdtInfo); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - Status = AcpiTbValidateRsdt (RsdtPtr); + Status = AcpiTbValidateRsdt (RsdtInfo.Pointer); if (ACPI_FAILURE (Status)) { goto Cleanup; @@ -314,8 +317,9 @@ AcpiGetFirmwareTable ( /* Get the number of table pointers within the RSDT */ - TableCount = AcpiTbGetTableCount (AcpiGbl_RSDP, RsdtPtr); + TableCount = AcpiTbGetTableCount (AcpiGbl_RSDP, RsdtInfo.Pointer); + Address.PointerType = AcpiGbl_TableFlags | Flags; /* * Search the RSDT/XSDT for the correct instance of the @@ -323,22 +327,21 @@ AcpiGetFirmwareTable ( */ for (i = 0, j = 0; i < TableCount; i++) { - /* Get the next table pointer */ + /* Get the next table pointer, handle RSDT vs. XSDT */ - Address.PointerType = AcpiGbl_TableFlags; if (AcpiGbl_RSDP->Revision < 2) { - Address.Pointer.Value = ((RSDT_DESCRIPTOR *) RsdtPtr)->TableOffsetEntry[i]; + Address.Pointer.Value = ((RSDT_DESCRIPTOR *) RsdtInfo.Pointer)->TableOffsetEntry[i]; } else { Address.Pointer.Value = ACPI_GET_ADDRESS ( - ((XSDT_DESCRIPTOR *) RsdtPtr)->TableOffsetEntry[i]); + ((XSDT_DESCRIPTOR *) RsdtInfo.Pointer)->TableOffsetEntry[i]); } - /* Get addressibility if necessary */ + /* Get the table header */ - Status = AcpiTbGetTablePointer (&Address, Flags, &TableSize, &TablePtr); + Status = AcpiTbGetTableHeader (&Address, &Header); if (ACPI_FAILURE (Status)) { goto Cleanup; @@ -346,27 +349,25 @@ AcpiGetFirmwareTable ( /* Compare table signatures and table instance */ - if (!ACPI_STRNCMP ((char *) TablePtr, Signature, ACPI_STRLEN (Signature))) + if (!ACPI_STRNCMP (Header.Signature, Signature, ACPI_NAME_SIZE)) { /* An instance of the table was found */ j++; if (j >= Instance) { - /* Found the correct instance */ + /* Found the correct instance, get the entire table */ + + Status = AcpiTbGetTableBody (&Address, &Header, &TableInfo); + if (ACPI_FAILURE (Status)) + { + goto Cleanup; + } - *TablePointer = TablePtr; + *TablePointer = TableInfo.Pointer; goto Cleanup; } } - - /* Delete table mapping if using virtual addressing */ - - if ((TableSize) && - ((Flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING)) - { - AcpiOsUnmapMemory (TablePtr, TableSize); - } } /* Did not find the table */ @@ -375,10 +376,7 @@ AcpiGetFirmwareTable ( Cleanup: - if (RsdtSize) - { - AcpiOsUnmapMemory (RsdtPtr, RsdtSize); - } + AcpiOsUnmapMemory (RsdtInfo.Pointer, (ACPI_SIZE) RsdtInfo.Pointer->Length); return_ACPI_STATUS (Status); } |