Patch confirmed to resolve my issue. Thanks Laszlo! Test performed: - Created two new VMs and installed Windows 8.1 and 10 on each respectfully. - This was using a build of OVMF supplied by Laszlo that contained his patch. - Prior to the patch, the OS install process would start normally, but graphics would freeze upon reboot due to the bug. - With the patch applied, the installation completed successfully.
Tested-by: Jonathan Panozzo <j...@lime-technology.com <mailto:j...@lime-technology.com>> > On Sep 1, 2015, at 5:17 PM, Jordan Justen <jordan.l.jus...@intel.com> wrote: > > Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com> > > On 2015-09-01 14:43:10, Laszlo Ersek wrote: >> The logic we have in place for i440fx does not work reliably on q35. For >> example, if the guest has 2GB of RAM, we allow the PCI root bridge driver >> to allocate the legacy video RAM BAR from the [2048 MB, 2816 MB] range, >> which falls strictly outside of the Q35 PCI host MMIO aperture that QEMU >> configures, and advertizes in ACPI. >> >> In turn, PCI BARs that exist outside of the PCI host aperture that is >> exposed in ACPI break Windows guests. >> >> Allocating PCI MMIO resources at or above 3GB on Q35 ensures that we stay >> within QEMU's aperture. (See the "w32.begin" assignments in >> "hw/pci-host/q35.c".) Furthermore, in pc_q35_init() (file >> "hw/i386/pc_q35.c"), QEMU ensures that the low RAM never "leaks" above >> 3GB. >> >> The i440fx logic is left unchanged. >> >> The Windows guest malfunction on Q35 was reported by Jon Panozzo of Lime >> Technology, Inc. >> >> Cc: Gerd Hoffmann <kra...@redhat.com> >> Cc: Jordan Justen <jordan.l.jus...@intel.com> >> Cc: Igor Mammedov <imamm...@redhat.com> >> Cc: Jon Panozzo <j...@lime-technology.com> >> Cc: "Gabriel L. Somlo" <so...@cmu.edu> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Laszlo Ersek <ler...@redhat.com> >> --- >> OvmfPkg/PlatformPei/Platform.c | 16 ++++++++++++++-- >> 1 file changed, 14 insertions(+), 2 deletions(-) >> >> diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c >> index 9970d14..f6e2188 100644 >> --- a/OvmfPkg/PlatformPei/Platform.c >> +++ b/OvmfPkg/PlatformPei/Platform.c >> @@ -204,7 +204,20 @@ MemMapInitialization ( >> >> if (!mXen) { >> UINT32 TopOfLowRam; >> + UINT32 PciBase; >> + >> TopOfLowRam = GetSystemMemorySizeBelow4gb (); >> + if (mHostBridgeDevId == INTEL_Q35_MCH_DEVICE_ID) { >> + // >> + // A 3GB base will always fall into Q35's 32-bit PCI host aperture, >> + // regardless of the Q35 MMCONFIG BAR. Correspondingly, QEMU never >> lets >> + // the RAM below 4 GB exceed it. >> + // >> + PciBase = BASE_2GB + BASE_1GB; >> + ASSERT (TopOfLowRam <= PciBase); >> + } else { >> + PciBase = (TopOfLowRam < BASE_2GB) ? BASE_2GB : TopOfLowRam; >> + } >> >> // >> // address purpose size >> @@ -219,8 +232,7 @@ MemMapInitialization ( >> // 0xFED20000 gap 896 KB >> // 0xFEE00000 LAPIC 1 MB >> // >> - AddIoMemoryRangeHob (TopOfLowRam < BASE_2GB ? >> - BASE_2GB : TopOfLowRam, 0xFC000000); >> + AddIoMemoryRangeHob (PciBase, 0xFC000000); >> AddIoMemoryBaseSizeHob (0xFEC00000, SIZE_4KB); >> AddIoMemoryBaseSizeHob (0xFED00000, SIZE_1KB); >> if (mHostBridgeDevId == INTEL_Q35_MCH_DEVICE_ID) { >> -- >> 1.8.3.1 >> >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.01.org >> https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel