VirtualBox

Ignore:
Timestamp:
Aug 26, 2021 10:17:06 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146543
Message:

EFI/Firmware: Don't just install a static selection of ACPI tables but use the XSDT to install all pre existing ones (like for the upcoming TPM and IOMMU support or custom tables added by the user), bugref:4643 bugref:10075 bugref:9967 bugref:9654

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatform.c

    r80721 r90907  
    150150#ifdef VBOX
    151151
     152/* Disables the old code only copying a selection of tables, missing out a bunch of things available in the XSDT/RSDT. */
     153# define ACPI_NO_STATIC_TABLES_SELECTION 1
     154
    152155# define ACPI_RSD_PTR       SIGNATURE_64('R', 'S', 'D', ' ', 'P', 'T', 'R', ' ')
    153156# define EBDA_BASE          (0x9FC0 << 4)
     
    180183}
    181184
     185#ifndef ACPI_NO_STATIC_TABLES_SELECTION
    182186VOID *FindSignature(VOID* Start, UINT32 Signature, BOOLEAN NoChecksum)
    183187{
     
    198202  return NULL;
    199203}
     204#endif
    200205
    201206VOID
     
    204209    UINT32 Table = 0;
    205210    EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdPtr;
     211#ifndef ACPI_NO_STATIC_TABLES_SELECTION
    206212    VOID *TablesPage;
     213#else
     214    EFI_ACPI_DESCRIPTION_HEADER *RsdtTbl;
     215#endif
     216    UINT64 *PtrTbl;
     217    UINT32 Index;
     218
     219    RsdPtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)FindAcpiRsdPtr();
     220    ASSERT(RsdPtr != NULL);
     221
     222#ifndef ACPI_NO_STATIC_TABLES_SELECTION
    207223#define FLAG_OPTIONAL    1<<0
    208224#define FLAG_NO_CHECKSUM 1<<1
     
    227243        { SIGNATURE_32('M', 'C', 'F', 'G'), FLAG_OPTIONAL, "MCFG"}
    228244    };
    229     UINT32 Index;
    230 
    231     RsdPtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)FindAcpiRsdPtr();
    232     ASSERT(RsdPtr != NULL);
    233     TablesPage = (VOID*)(UINTN)((RsdPtr->RsdtAddress) & ~0xfff);
     245
     246    TablesPage = (VOID *)(UINTN)((RsdPtr->RsdtAddress) & ~0xfff);
    234247    DEBUG((DEBUG_INFO, "TablesPage:%p\n", TablesPage));
    235248
     
    253266           Tables[Table++] = Ptr;
    254267    }
     268#else
     269    RsdtTbl = (EFI_ACPI_DESCRIPTION_HEADER*)(UINTN)RsdPtr->XsdtAddress;
     270    DEBUG((DEBUG_INFO, "RsdtTbl:%p\n", RsdtTbl));
     271
     272    PtrTbl = (UINT64 *)(RsdtTbl + 1);
     273    for (Index = 0; Index < (RsdtTbl->Length - sizeof(*RsdtTbl)) / sizeof(UINT64); Index++)
     274    {
     275        EFI_ACPI_DESCRIPTION_HEADER *Header = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)*PtrTbl++;
     276        DEBUG ((DEBUG_VERBOSE, "Table %p found \"%-4.4a\" size 0x%x\n", Header, (CONST CHAR8 *)&Header->Signature, Header->Length));
     277
     278        if (Header->Signature == SIGNATURE_32('F', 'A', 'C', 'P'))
     279        {
     280            /* Add the DSDT pointer from there. */
     281            EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)Header;
     282            DEBUG((DEBUG_INFO, "Found FACP: DSDT 0x%x FACS 0x%x XDsdt %p XFacs %p\n", Fadt->Dsdt, Fadt->FirmwareCtrl, Fadt->XDsdt, Fadt->XFirmwareCtrl));
     283            Tables[Table++] = (VOID *)(UINTN)Fadt->FirmwareCtrl;
     284            Tables[Table++] = (VOID *)(UINTN)Fadt->Dsdt;
     285        }
     286
     287        Tables[Table++] = Header;
     288    }
     289#endif
    255290
    256291#if 0
     
    270305#endif
    271306
    272     DEBUG((DEBUG_INFO, "We found %d tables from %d\n", Table, TablesSize));
     307    DEBUG((DEBUG_INFO, "We found %d tables (max allowed %d)\n", Table, TablesSize));
    273308    Tables[Table] = NULL;
    274309}
     
    298333  EFI_ACPI_TABLE_PROTOCOL        *AcpiTable;
    299334#ifdef VBOX
     335# ifndef ACPI_NO_STATIC_TABLES_SELECTION
    300336  VOID                           *VBoxTables[10];
     337# else
     338  VOID                           *VBoxTables[128];
     339# endif
    301340#else
    302341  EFI_FIRMWARE_VOLUME2_PROTOCOL  *FwVol;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette