VirtualBox

Changeset 67439 in vbox


Ignore:
Timestamp:
Jun 16, 2017 1:57:42 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116170
Message:

EFI: bugref:6784: properly consider the MCFG area

Location:
trunk/src/VBox/Devices/EFI
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/DevEFI.cpp

    r65850 r67439  
    228228    /** Uga mode vertical resolution. */
    229229    uint32_t                cyUgaResolution;
     230    /** PCI area */
     231    uint32_t                u32McfgBase;
     232    uint32_t                cbMcfgLength;
    230233
    231234
     
    11041107        case EFI_INFO_INDEX_UGA_VERTICAL_RESOLUTION:
    11051108        case EFI_INFO_INDEX_UGA_HORIZONTAL_RESOLUTION:
     1109        case EFI_INFO_INDEX_MCFG_BASE:
     1110        case EFI_INFO_INDEX_MCFG_SIZE:
    11061111            return 4;
    11071112        case EFI_INFO_INDEX_BOOT_ARGS:
     
    11911196        case EFI_INFO_INDEX_STACK_BASE:         return efiInfoNextByteU32(pThis,  VBOX_EFI_TOP_OF_STACK - _128K); /* 2M - 128 K */
    11921197        case EFI_INFO_INDEX_STACK_SIZE:         return efiInfoNextByteU32(pThis, _128K);
     1198        case EFI_INFO_INDEX_MCFG_BASE:          return efiInfoNextByteU32(pThis, pThis->u32McfgBase);
     1199        case EFI_INFO_INDEX_MCFG_SIZE:          return efiInfoNextByteU32(pThis, pThis->cbMcfgLength);
    11931200
    11941201        default:
     
    21402147                              "EfiRom\0"
    21412148                              "NumCPUs\0"
     2149                              "McfgBase\0"
     2150                              "McfgLength\0"
    21422151                              "UUID\0"
    21432152                              "IOAPIC\0"
     
    21882197    rc = CFGMR3QueryU32Def(pCfg, "NumCPUs", &pThis->cCpus, 1);
    21892198    AssertLogRelRCReturn(rc, rc);
     2199
     2200    rc = CFGMR3QueryU32Def(pCfg, "McfgBase", &pThis->u32McfgBase, 0);
     2201    if (RT_FAILURE(rc))
     2202        return PDMDEV_SET_ERROR(pDevIns, rc,
     2203                                N_("Configuration error: Querying \"\" as integer failed"));
     2204    rc = CFGMR3QueryU32Def(pCfg, "McfgLength", &pThis->cbMcfgLength, 0);
     2205    if (RT_FAILURE(rc))
     2206        return PDMDEV_SET_ERROR(pDevIns, rc,
     2207                                N_("Configuration error: Querying \"McfgLength\" as integer failed"));
    21902208
    21912209    rc = CFGMR3QueryU8Def(pCfg, "IOAPIC", &pThis->u8IOAPIC, 1);
  • trunk/src/VBox/Devices/EFI/DevEFI.h

    r62500 r67439  
    6969    EFI_INFO_INDEX_UGA_HORIZONTAL_RESOLUTION,
    7070    EFI_INFO_INDEX_UGA_VERTICAL_RESOLUTION,
     71    EFI_INFO_INDEX_MCFG_BASE,
     72    EFI_INFO_INDEX_MCFG_SIZE,
    7173    EFI_INFO_INDEX_END
    7274} EfiInfoIndex;
  • trunk/src/VBox/Devices/EFI/Firmware/OvmfPkg/PlatformPei/Platform.c

    r58459 r67439  
    4040#include "Cmos.h"
    4141
     42#ifdef VBOX
     43# define IN_RING0
     44# include "../../../../DevEFI.h"
     45#endif
     46
    4247EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
    4348  { EfiACPIMemoryNVS,       0x004 },
     
    6570BOOLEAN mS3Supported = FALSE;
    6671
     72#ifdef VBOX
     73static UINT32
     74GetVmVariable(UINT32 Variable, CHAR8 *pbBuf, UINT32 cbBuf)
     75{
     76  UINT32 cbVar, offBuf;
     77
     78  IoWrite32(EFI_INFO_PORT, Variable);
     79  cbVar = IoRead32(EFI_INFO_PORT);
     80
     81  for (offBuf = 0; offBuf < cbVar && offBuf < cbBuf; offBuf++)
     82    pbBuf[offBuf] = IoRead8(EFI_INFO_PORT);
     83
     84  return cbVar;
     85}
     86#endif
     87
    6788
    6889VOID
     
    269290    // 0xFEE00000    LAPIC                          1 MB
    270291    //
     292#ifdef VBOX
     293    UINT32 MCfgBase = 0;
     294    UINT32 MCfgSize = 0;
     295    GetVmVariable(EFI_INFO_INDEX_MCFG_BASE, (CHAR8 *)&MCfgBase, sizeof(MCfgBase));
     296    GetVmVariable(EFI_INFO_INDEX_MCFG_SIZE, (CHAR8 *)&MCfgSize, sizeof(MCfgSize));
     297    if (TopOfLowRam < BASE_2GB)
     298      TopOfLowRam = BASE_2GB;
     299    if (MCfgBase == 0)
     300      MCfgBase = TopOfLowRam;   // backward compatibilit with old DevEFI
     301    if (TopOfLowRam < MCfgBase)
     302      AddIoMemoryRangeHob (TopOfLowRam, MCfgBase);
     303    AddIoMemoryRangeHob (MCfgBase + MCfgSize, 0xFC000000);
     304#else
    271305    AddIoMemoryRangeHob (TopOfLowRam < BASE_2GB ?
    272306                         BASE_2GB : TopOfLowRam, 0xFC000000);
     307#endif
    273308    AddIoMemoryBaseSizeHob (0xFEC00000, SIZE_4KB);
    274309    AddIoMemoryBaseSizeHob (0xFED00000, SIZE_1KB);
Note: See TracChangeset for help on using the changeset viewer.

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