ACPI_TABLE_HEADER * AcpiTbTableOverride ( ACPI_TABLE_HEADER *TableHeader, ACPI_TABLE_DESC *TableDesc) { ACPI_STATUS Status; ACPI_TABLE_HEADER *NewTable = NULL; ACPI_PHYSICAL_ADDRESS NewAddress = 0; UINT32 NewTableLength = 0; UINT8 NewFlags; char *OverrideType; /* (1) Attempt logical override (returns a logical address) */ Status = AcpiOsTableOverride (TableHeader, &NewTable); if (ACPI_SUCCESS (Status) && NewTable) { NewAddress = ACPI_PTR_TO_PHYSADDR (NewTable); NewTableLength = NewTable->Length; NewFlags = ACPI_TABLE_ORIGIN_OVERRIDE; OverrideType = "Logical"; goto FinishOverride; } /* (2) Attempt physical override (returns a physical address) */ Status = AcpiOsPhysicalTableOverride (TableHeader, &NewAddress, &NewTableLength); if (ACPI_SUCCESS (Status) && NewAddress && NewTableLength) { /* Map the entire new table */ NewTable = AcpiOsMapMemory (NewAddress, NewTableLength); if (!NewTable) { ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY, "%4.4s %p Attempted physical table override failed", TableHeader->Signature, ACPI_CAST_PTR (void, TableDesc->Address))); return (NULL); }
void AcpiTbOverrideTable ( ACPI_TABLE_DESC *OldTableDesc) { ACPI_STATUS Status; char *OverrideType; ACPI_TABLE_DESC NewTableDesc; ACPI_TABLE_HEADER *Table; ACPI_PHYSICAL_ADDRESS Address; UINT32 Length; /* (1) Attempt logical override (returns a logical address) */ Status = AcpiOsTableOverride (OldTableDesc->Pointer, &Table); if (ACPI_SUCCESS (Status) && Table) { AcpiTbAcquireTempTable (&NewTableDesc, ACPI_PTR_TO_PHYSADDR (Table), ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL); OverrideType = "Logical"; goto FinishOverride; } /* (2) Attempt physical override (returns a physical address) */ Status = AcpiOsPhysicalTableOverride (OldTableDesc->Pointer, &Address, &Length); if (ACPI_SUCCESS (Status) && Address && Length) { AcpiTbAcquireTempTable (&NewTableDesc, Address, ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL); OverrideType = "Physical"; goto FinishOverride; } return; /* There was no override */ FinishOverride: /* Validate and verify a table before overriding */ Status = AcpiTbVerifyTempTable (&NewTableDesc, NULL); if (ACPI_FAILURE (Status)) { return; } ACPI_INFO ((AE_INFO, "%4.4s 0x%8.8X%8.8X" " %s table override, new table: 0x%8.8X%8.8X", OldTableDesc->Signature.Ascii, ACPI_FORMAT_UINT64 (OldTableDesc->Address), OverrideType, ACPI_FORMAT_UINT64 (NewTableDesc.Address))); /* We can now uninstall the original table */ AcpiTbUninstallTable (OldTableDesc); /* * Replace the original table descriptor and keep its state as * "VALIDATED". */ AcpiTbInitTableDescriptor (OldTableDesc, NewTableDesc.Address, NewTableDesc.Flags, NewTableDesc.Pointer); AcpiTbValidateTempTable (OldTableDesc); /* Release the temporary table descriptor */ AcpiTbReleaseTempTable (&NewTableDesc); }