* [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly @ 2017-09-19 19:18 Laszlo Ersek 2017-09-19 19:18 ` [PATCH 1/3] OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard Laszlo Ersek ` (6 more replies) 0 siblings, 7 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-19 19:18 UTC (permalink / raw) To: edk2-devel-01 Cc: Aleksei Kovura, Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni Repo: https://github.com/lersek/edk2.git Branch: vbe_shim_q35_pam Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. Aleksei, can you please fetch the branch, build it, and report back with your Tested-by if it works for you? I performed my own tests as well; I'll include those in a separate email. Cc: Aleksei Kovura <alex3kov@zoho.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Thank you, Laszlo Laszlo Ersek (3): OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard OvmfPkg/QemuVideoDxe/VbeShim: rename Status to Segment0AllocationStatus OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- 6 files changed, 95 insertions(+), 60 deletions(-) -- 2.14.1.3.gb7cf6e02401b ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek @ 2017-09-19 19:18 ` Laszlo Ersek 2017-09-19 19:18 ` [PATCH 2/3] OvmfPkg/QemuVideoDxe/VbeShim: rename Status to Segment0AllocationStatus Laszlo Ersek ` (5 subsequent siblings) 6 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-19 19:18 UTC (permalink / raw) To: edk2-devel-01 Cc: Aleksei Kovura, Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni * Introduce the PIIX4_PAM* and MCH_PAM* macros under "OvmfPkg/Include/IndustryStandard". These macros capture the PAM register offsets (in PCI config space) on the respective Memory Controller B/D/F, from the respective data sheets. * Under IndustryStandard, introduce the PMC_REGISTER_PIIX4() macro for PIIX4. (For Q35, we already have DRAMC_REGISTER_Q35().) In both cases, the B/D/F is 0/0/0. * Under CsmSupportLib, replace the "PAMRegOffset" field (UINT8) in the PAM_REGISTER_VALUE structure with "PAMRegPciLibAddress" (UINTN). The new field contains the return value of the PCI_LIB_ADDRESS() macro. * Under CsmSupportLib, replace the "mRegisterValues440" elements as follows: REG_PAMx_OFFSET_440, ReadEnableData, WriteEnableData --> PMC_REGISTER_PIIX4 (PIIX4_PAMx), ReadEnableData, WriteEnableData * Under CsmSupportLib, replace the "mRegisterValuesQ35" elements as follows: REG_PAMx_OFFSET_Q35, ReadEnableData, WriteEnableData --> DRAMC_REGISTER_Q35 (MCH_PAMx), ReadEnableData, WriteEnableData * Under CsmSupportLib, update the register address calculations as follows (for all of PciOr8(), PciAnd8() and PciRead8()): PCI_LIB_ADDRESS ( PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset ) --> mRegisterValues[Index].PAMRegPciLibAddress * Under CsmSupportLib, remove the PAM_PCI_* and REG_PAM*_OFFSET_* macros. Technically speaking, these changes could be split into three patches (IndustryStandard macro additions, CsmSupportLib code updates, CsmSupportLib macro removals). However, the patch is not big, and in this case it is actually helpful to present the code movement / refactoring in one step, for easier verification. Cc: Aleksei Kovura <alex3kov@zoho.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Ref: https://bugs.launchpad.net/qemu/+bug/1715700 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> --- OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- 4 files changed, 53 insertions(+), 52 deletions(-) diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h index f755a2a359e5..01d3109a7d7d 100644 --- a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h +++ b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h @@ -30,26 +30,6 @@ #include <Library/MemoryAllocationLib.h> #include <Library/UefiBootServicesTableLib.h> -#define PAM_PCI_BUS 0 -#define PAM_PCI_DEV 0 -#define PAM_PCI_FUNC 0 - -#define REG_PAM0_OFFSET_440 0x59 // Programmable Attribute Map 0 -#define REG_PAM1_OFFSET_440 0x5a // Programmable Attribute Map 1 -#define REG_PAM2_OFFSET_440 0x5b // Programmable Attribute Map 2 -#define REG_PAM3_OFFSET_440 0x5c // Programmable Attribute Map 3 -#define REG_PAM4_OFFSET_440 0x5d // Programmable Attribute Map 4 -#define REG_PAM5_OFFSET_440 0x5e // Programmable Attribute Map 5 -#define REG_PAM6_OFFSET_440 0x5f // Programmable Attribute Map 6 - -#define REG_PAM0_OFFSET_Q35 0x90 // Programmable Attribute Map 0 -#define REG_PAM1_OFFSET_Q35 0x91 // Programmable Attribute Map 1 -#define REG_PAM2_OFFSET_Q35 0x92 // Programmable Attribute Map 2 -#define REG_PAM3_OFFSET_Q35 0x93 // Programmable Attribute Map 3 -#define REG_PAM4_OFFSET_Q35 0x94 // Programmable Attribute Map 4 -#define REG_PAM5_OFFSET_Q35 0x95 // Programmable Attribute Map 5 -#define REG_PAM6_OFFSET_Q35 0x96 // Programmable Attribute Map 6 - #define PAM_BASE_ADDRESS 0xc0000 #define PAM_LIMIT_ADDRESS BASE_1MB @@ -67,7 +47,7 @@ typedef struct { // Provides a map of the PAM registers and bits used to set Read/Write access. // typedef struct { - UINT8 PAMRegOffset; + UINTN PAMRegPciLibAddress; UINT8 ReadEnableData; UINT8 WriteEnableData; } PAM_REGISTER_VALUE; diff --git a/OvmfPkg/Include/IndustryStandard/I440FxPiix4.h b/OvmfPkg/Include/IndustryStandard/I440FxPiix4.h index baa4c063f16a..efe6e5c27834 100644 --- a/OvmfPkg/Include/IndustryStandard/I440FxPiix4.h +++ b/OvmfPkg/Include/IndustryStandard/I440FxPiix4.h @@ -27,6 +27,19 @@ // #define INTEL_82441_DEVICE_ID 0x1237 +// +// B/D/F/Type: 0/0/0/PCI +// +#define PMC_REGISTER_PIIX4(Offset) PCI_LIB_ADDRESS (0, 0, 0, (Offset)) + +#define PIIX4_PAM0 0x59 +#define PIIX4_PAM1 0x5A +#define PIIX4_PAM2 0x5B +#define PIIX4_PAM3 0x5C +#define PIIX4_PAM4 0x5D +#define PIIX4_PAM5 0x5E +#define PIIX4_PAM6 0x5F + // // B/D/F/Type: 0/1/3/PCI // diff --git a/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h b/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h index 68485bec71f7..193a262e5b54 100644 --- a/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h +++ b/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h @@ -47,6 +47,14 @@ #define MCH_PCIEXBAR_HIGH 0x64 #define MCH_PCIEXBAR_HIGHMASK 0xFFFFFFF0 +#define MCH_PAM0 0x90 +#define MCH_PAM1 0x91 +#define MCH_PAM2 0x92 +#define MCH_PAM3 0x93 +#define MCH_PAM4 0x94 +#define MCH_PAM5 0x95 +#define MCH_PAM6 0x96 + #define MCH_SMRAM 0x9D #define MCH_SMRAM_D_LCK BIT4 #define MCH_SMRAM_G_SMRAME BIT3 diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c index 8d5d2e58a994..c13d4bb88f47 100644 --- a/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c +++ b/OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c @@ -52,35 +52,35 @@ STATIC LEGACY_MEMORY_SECTION_INFO mSectionArray[] = { }; STATIC PAM_REGISTER_VALUE mRegisterValues440[] = { - {REG_PAM1_OFFSET_440, 0x01, 0x02}, - {REG_PAM1_OFFSET_440, 0x10, 0x20}, - {REG_PAM2_OFFSET_440, 0x01, 0x02}, - {REG_PAM2_OFFSET_440, 0x10, 0x20}, - {REG_PAM3_OFFSET_440, 0x01, 0x02}, - {REG_PAM3_OFFSET_440, 0x10, 0x20}, - {REG_PAM4_OFFSET_440, 0x01, 0x02}, - {REG_PAM4_OFFSET_440, 0x10, 0x20}, - {REG_PAM5_OFFSET_440, 0x01, 0x02}, - {REG_PAM5_OFFSET_440, 0x10, 0x20}, - {REG_PAM6_OFFSET_440, 0x01, 0x02}, - {REG_PAM6_OFFSET_440, 0x10, 0x20}, - {REG_PAM0_OFFSET_440, 0x10, 0x20} + {PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x01, 0x02}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x10, 0x20}, + {PMC_REGISTER_PIIX4 (PIIX4_PAM0), 0x10, 0x20} }; STATIC PAM_REGISTER_VALUE mRegisterValuesQ35[] = { - {REG_PAM1_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM1_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM2_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM2_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM3_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM3_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM4_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM4_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM5_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM5_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM6_OFFSET_Q35, 0x01, 0x02}, - {REG_PAM6_OFFSET_Q35, 0x10, 0x20}, - {REG_PAM0_OFFSET_Q35, 0x10, 0x20} + {DRAMC_REGISTER_Q35 (MCH_PAM1), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM1), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM2), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM2), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM3), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM3), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM4), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM4), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM5), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM5), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM6), 0x01, 0x02}, + {DRAMC_REGISTER_Q35 (MCH_PAM6), 0x10, 0x20}, + {DRAMC_REGISTER_Q35 (MCH_PAM0), 0x10, 0x20} }; STATIC PAM_REGISTER_VALUE *mRegisterValues; @@ -145,12 +145,12 @@ LegacyRegionManipulationInternal ( if (ReadEnable != NULL) { if (*ReadEnable) { PciOr8 ( - PCI_LIB_ADDRESS(PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset), + mRegisterValues[Index].PAMRegPciLibAddress, mRegisterValues[Index].ReadEnableData ); } else { PciAnd8 ( - PCI_LIB_ADDRESS(PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset), + mRegisterValues[Index].PAMRegPciLibAddress, (UINT8) (~mRegisterValues[Index].ReadEnableData) ); } @@ -158,12 +158,12 @@ LegacyRegionManipulationInternal ( if (WriteEnable != NULL) { if (*WriteEnable) { PciOr8 ( - PCI_LIB_ADDRESS(PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset), + mRegisterValues[Index].PAMRegPciLibAddress, mRegisterValues[Index].WriteEnableData ); } else { PciAnd8 ( - PCI_LIB_ADDRESS(PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset), + mRegisterValues[Index].PAMRegPciLibAddress, (UINT8) (~mRegisterValues[Index].WriteEnableData) ); } @@ -204,7 +204,7 @@ LegacyRegionGetInfoInternal ( // *DescriptorCount = sizeof(mSectionArray) / sizeof (mSectionArray[0]); for (Index = 0; Index < *DescriptorCount; Index++) { - PamValue = PciRead8 (PCI_LIB_ADDRESS(PAM_PCI_BUS, PAM_PCI_DEV, PAM_PCI_FUNC, mRegisterValues[Index].PAMRegOffset)); + PamValue = PciRead8 (mRegisterValues[Index].PAMRegPciLibAddress); mSectionArray[Index].ReadEnabled = FALSE; if ((PamValue & mRegisterValues[Index].ReadEnableData) != 0) { mSectionArray[Index].ReadEnabled = TRUE; -- 2.14.1.3.gb7cf6e02401b ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] OvmfPkg/QemuVideoDxe/VbeShim: rename Status to Segment0AllocationStatus 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek 2017-09-19 19:18 ` [PATCH 1/3] OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard Laszlo Ersek @ 2017-09-19 19:18 ` Laszlo Ersek 2017-09-19 19:18 ` [PATCH 3/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek ` (4 subsequent siblings) 6 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-19 19:18 UTC (permalink / raw) To: edk2-devel-01 Cc: Aleksei Kovura, Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni This clarifies the purpose of the local variable in InstallVbeShim(). Cc: Aleksei Kovura <alex3kov@zoho.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Ref: https://bugs.launchpad.net/qemu/+bug/1715700 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> --- OvmfPkg/QemuVideoDxe/VbeShim.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/QemuVideoDxe/VbeShim.c b/OvmfPkg/QemuVideoDxe/VbeShim.c index 4c4517e9da27..bc90e067266d 100644 --- a/OvmfPkg/QemuVideoDxe/VbeShim.c +++ b/OvmfPkg/QemuVideoDxe/VbeShim.c @@ -63,7 +63,7 @@ InstallVbeShim ( EFI_PHYSICAL_ADDRESS Segment0, SegmentC, SegmentF; UINTN Segment0Pages; IVT_ENTRY *Int0x10; - EFI_STATUS Status; + EFI_STATUS Segment0AllocationStatus; UINTN Pam1Address; UINT8 Pam1; UINTN SegmentCPages; @@ -87,10 +87,14 @@ InstallVbeShim ( // Segment0Pages = 1; Int0x10 = (IVT_ENTRY *)(UINTN)Segment0 + 0x10; - Status = gBS->AllocatePages (AllocateAddress, EfiBootServicesCode, - Segment0Pages, &Segment0); + Segment0AllocationStatus = gBS->AllocatePages ( + AllocateAddress, + EfiBootServicesCode, + Segment0Pages, + &Segment0 + ); - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Segment0AllocationStatus)) { EFI_PHYSICAL_ADDRESS Handler; // @@ -109,8 +113,12 @@ InstallVbeShim ( // Otherwise we'll overwrite the Int10h vector, even though we may not own // the page at zero. // - DEBUG ((EFI_D_INFO, "%a: failed to allocate page at zero: %r\n", - __FUNCTION__, Status)); + DEBUG (( + DEBUG_INFO, + "%a: failed to allocate page at zero: %r\n", + __FUNCTION__, + Segment0AllocationStatus + )); } else { // // We managed to allocate the page at zero. SVN r14218 guarantees that it -- 2.14.1.3.gb7cf6e02401b ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek 2017-09-19 19:18 ` [PATCH 1/3] OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard Laszlo Ersek 2017-09-19 19:18 ` [PATCH 2/3] OvmfPkg/QemuVideoDxe/VbeShim: rename Status to Segment0AllocationStatus Laszlo Ersek @ 2017-09-19 19:18 ` Laszlo Ersek 2017-09-19 19:36 ` [PATCH 0/3] " Laszlo Ersek ` (3 subsequent siblings) 6 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-19 19:18 UTC (permalink / raw) To: edk2-devel-01 Cc: Aleksei Kovura, Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni In commit db27e9f3d8f0 ("OvmfPkg/LegacyRegion: Support legacy region manipulation of Q35", 2016-03-15), Ray extended the OvmfPkg/Csm/CsmSupportLib PAM register manipulation to Q35. However, we missed that the same should be done to the QemuVideoDxe VBE Shim as well. The omission has caused no problems in practice on Q35, because QEMU has let us write to the ROM area, regardless of the PAM1 setting, all this time. This has now changed with recent QEMU commit 208fa0e43645 ("pc: make 'pc.rom' readonly when machine has PCI enabled", 2017-07-28). The QEMU commit exposes the OVMF bug when Windows 7 is started on Q35, using QEMU 2.10 -- the VBE Shim is no longer put in place and Windows 7 cannot find it. To remedy this, assign the "Pam1Address" local variable a PciLib address that matches the board type (i440fx vs. q35). Regarding the PcdLib dependency: QemuVideoDxe already uses PcdLib, both directly (see "PcdDriverSupportedEfiVersion") and indirectly (e.g. via the DxePciLibI440FxQ35 PciLib instance). Add PcdLib to [LibraryClasses] for completeness. Cc: Aleksei Kovura <alex3kov@zoho.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Ref: https://bugs.launchpad.net/qemu/+bug/1715700 Reported-by: Aleksei Kovura <alex3kov@zoho.com> Special-thanks-to: Gerd Hoffmann <kraxel@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> --- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 ++- OvmfPkg/QemuVideoDxe/VbeShim.c | 27 +++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf index 7c7d429bca27..577e07b0a8bf 100644 --- a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf +++ b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf @@ -60,6 +60,7 @@ [LibraryClasses] DebugLib DevicePathLib MemoryAllocationLib + PcdLib PciLib PrintLib TimerLib @@ -75,4 +76,4 @@ [Protocols] [Pcd] gOptionRomPkgTokenSpaceGuid.PcdDriverSupportedEfiVersion - + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId diff --git a/OvmfPkg/QemuVideoDxe/VbeShim.c b/OvmfPkg/QemuVideoDxe/VbeShim.c index bc90e067266d..e45a08e8873f 100644 --- a/OvmfPkg/QemuVideoDxe/VbeShim.c +++ b/OvmfPkg/QemuVideoDxe/VbeShim.c @@ -25,6 +25,7 @@ #include <Library/DebugLib.h> #include <Library/PciLib.h> #include <Library/PrintLib.h> +#include <OvmfPlatforms.h> #include "Qemu.h" #include "VbeShim.h" @@ -64,6 +65,7 @@ InstallVbeShim ( UINTN Segment0Pages; IVT_ENTRY *Int0x10; EFI_STATUS Segment0AllocationStatus; + UINT16 HostBridgeDevId; UINTN Pam1Address; UINT8 Pam1; UINTN SegmentCPages; @@ -131,7 +133,30 @@ InstallVbeShim ( // // Put the shim in place first. // - Pam1Address = PCI_LIB_ADDRESS (0, 0, 0, 0x5A); + // Start by determining the address of the PAM1 register. + // + HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId); + switch (HostBridgeDevId) { + case INTEL_82441_DEVICE_ID: + Pam1Address = PMC_REGISTER_PIIX4 (PIIX4_PAM1); + break; + case INTEL_Q35_MCH_DEVICE_ID: + Pam1Address = DRAMC_REGISTER_Q35 (MCH_PAM1); + break; + default: + DEBUG (( + DEBUG_ERROR, + "%a: unknown host bridge device ID: 0x%04x\n", + __FUNCTION__, + HostBridgeDevId + )); + ASSERT (FALSE); + + if (!EFI_ERROR (Segment0AllocationStatus)) { + gBS->FreePages (Segment0, Segment0Pages); + } + return; + } // // low nibble covers 0xC0000 to 0xC3FFF // high nibble covers 0xC4000 to 0xC7FFF -- 2.14.1.3.gb7cf6e02401b ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek ` (2 preceding siblings ...) 2017-09-19 19:18 ` [PATCH 3/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek @ 2017-09-19 19:36 ` Laszlo Ersek 2017-09-20 7:05 ` Aleksei ` (2 subsequent siblings) 6 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-19 19:36 UTC (permalink / raw) To: edk2-devel-01 Cc: Ruiyu Ni, Aleksei Kovura, Jordan Justen, Gerd Hoffmann, Igor Mammedov On 09/19/17 21:18, Laszlo Ersek wrote: > Repo: https://github.com/lersek/edk2.git > Branch: vbe_shim_q35_pam > > Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, > and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. > > Aleksei, can you please fetch the branch, build it, and report back > with your Tested-by if it works for you? > > I performed my own tests as well; I'll include those in a separate > email. Testing: - QEMU version: v2.10.0-611-g11e06ce1ed28. - Edk2 basis: a3a473705101. - ISO image used for testing: en_windows_server_2008_r2_with_sp1_x64_dvd_617601.iso Test CSM included Machine type (2.10) Boot Mode Patch applied Result ---- ------------ ------------------- --------- ------------- ------ 01 no i440fx UEFI no pass 03 no i440fx UEFI yes pass 02 no q35 UEFI no fail 04 no q35 UEFI yes pass 05 yes i440fx UEFI no pass 09 yes i440fx UEFI yes pass 06 yes i440fx legacy no fail 10 yes i440fx legacy yes n/a 07 yes q35 UEFI no pass 11 yes q35 UEFI yes pass 08 yes q35 legacy no n/a 12 yes q35 legacy yes n/a (Please excuse the strange ordering of the test numbers; the reason is that testing all the cases is much faster in a different order, while presenting the results is best in this order. The test case numbering reflects the order in which I performed the tests.) Test cases 01 and 03 explain that there is no regression due to the patches, on i440fx and in UEFI boot mode. Test cases 02 and 04 show that the patches fix the bug reported by Aleksei. The remaining cases cover a build when the SeaBIOS CSM is included in OVMF. For this I used current SeaBIOS master (at commit ec6cb17f8949), plus a minimal patch that removes the runningOnQEMU() requirement from qemu_debug_putc() -- because this check used to fail when running SeaBIOS as an OVMF CSM, preventing SeaBIOS debug messages from reaching the QEMU debug port. Furthermore, I built the SeaBIOS QXL option ROM from the same SeaBIOS tree. Test cases 05 and 09 explain that there is no regression due to the patches, on i440fx and in UEFI boot mode. Test case 06 shows that legacy boot stopped working at an unspecified point in the past. I emphasize that this boot failure was *without* the present patch set. I'm going to attach the OVMF debug logs for all cases, which include the SeaBIOS and VGABIOS output as well. If someone is interested in getting the CSM build to work again (for legacy OS boot), please feel free to go ahead. (Personally I'd suggest to stick with pure SeaBIOS if you have a legacy guest OS.) Due to the failure of test case 06, I didn't check the behavior with the current series applied on top (that is, in case 10). Test cases 07 and 11 demonstrate that there is no regression due to the patches, on q35 and in UEFI boot mode. As a side note, test case 07 also demonstrates that the bug reported by Aleksei is specific to the VBE Shim; it does not hit when the VBE Shim is unused due to CSM presence. This is consistent with Gerd's result in <https://bugs.launchpad.net/qemu/+bug/1715700/comments/24>. Test cases 08 and 12 are not possible to test (i.e., the current series makes no difference). This is because Q35 has an AHCI/SATA controller (with six ports), not a traditional IDE controller (with primary/secondary and master/slave), therefore edk2's UefiBootManagerLib and/or BdsDxe do not generate BBS (= legacy BIOS) boot options for the CD-ROM. (I used an "ide-cd" device in all cases.) Given my earlier experience that the edk2-devel list software does not reflect attachments, and does not include them in the mailing list archive, I'm manually including a base-64 encoded tarball below, with the debug logs. The SHA256 sum is ad196c202cf300e2028ac67256c6966b1ce7a13042e47351d19d8408bb0b32ab. Thanks, Laszlo begin-base64 600 vbe_shim_q35_pam_results.tar.xz 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 ==== ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek ` (3 preceding siblings ...) 2017-09-19 19:36 ` [PATCH 0/3] " Laszlo Ersek @ 2017-09-20 7:05 ` Aleksei 2017-09-20 11:43 ` Laszlo Ersek 2017-09-20 14:36 ` Aleksei 2017-09-20 18:11 ` Jordan Justen 6 siblings, 1 reply; 10+ messages in thread From: Aleksei @ 2017-09-20 7:05 UTC (permalink / raw) To: Laszlo Ersek, edk2-devel-01 Cc: Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni Hi Laszlo, I've built it (despite edk2/ovmf build process being as convoluted as ever) and am trying to run it with qemu 2.10.0 - it's not booting at all, stuck at "Guest has not initialized the display (yet)." Maybe the problem is gcc version? I have 7.2.0 while edk2 instructions mention gcc5. On 19/09/17 22:18, Laszlo Ersek wrote: > Repo: https://github.com/lersek/edk2.git > Branch: vbe_shim_q35_pam > > Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, > and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. > > Aleksei, can you please fetch the branch, build it, and report back with > your Tested-by if it works for you? > > I performed my own tests as well; I'll include those in a separate > email. > > Cc: Aleksei Kovura <alex3kov@zoho.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > > Thank you, > Laszlo > > Laszlo Ersek (3): > OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard > OvmfPkg/QemuVideoDxe/VbeShim: rename Status to > Segment0AllocationStatus > OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly > > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ > OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ > OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ > OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- > OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- > 6 files changed, 95 insertions(+), 60 deletions(-) > -- /--Regards, Aleksei/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-20 7:05 ` Aleksei @ 2017-09-20 11:43 ` Laszlo Ersek 0 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-20 11:43 UTC (permalink / raw) To: Aleksei, edk2-devel-01 Cc: Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni On 09/20/17 09:05, Aleksei wrote: > Hi Laszlo, > > I've built it (despite edk2/ovmf build process being as convoluted as > ever) Criticism well deserved :) , but at least we have excuses (multi-platform, multi-compiler build system, and freestanding (i.e., not hosted) codebase). > and am trying to run it with qemu 2.10.0 - it's not booting at > all, stuck at "Guest has not initialized the display (yet)." > > Maybe the problem is gcc version? I have 7.2.0 while edk2 instructions > mention gcc5. Hm, my prime suspect isn't gcc-7.2 (it should work with the GCC5 toolchain, but just to be sure you can try the GCC49 toolchain as well with it). My prime suspect is that you've been using a 2MB firmware image (speaking in unified image terms) from Gerd's firmware repo, but the upstream default is now 4MB. You can't mix and match (a) firmware binary and (b) variable store between different unified sizes; that is, if your previous firmware was 2MB in size (unified), you have to pass the following switch to your new build too: -D FD_SIZE_2MB Are you on IRC? I'll hop on #edk2 on OFTC for a while now (nick is "lersek"). Thanks, Laszlo > > On 19/09/17 22:18, Laszlo Ersek wrote: >> Repo: https://github.com/lersek/edk2.git >> Branch: vbe_shim_q35_pam >> >> Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, >> and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. >> >> Aleksei, can you please fetch the branch, build it, and report back with >> your Tested-by if it works for you? >> >> I performed my own tests as well; I'll include those in a separate >> email. >> >> Cc: Aleksei Kovura <alex3kov@zoho.com> >> Cc: Gerd Hoffmann <kraxel@redhat.com> >> Cc: Igor Mammedov <imammedo@redhat.com> >> Cc: Jordan Justen <jordan.l.justen@intel.com> >> Cc: Ruiyu Ni <ruiyu.ni@intel.com> >> >> Thank you, >> Laszlo >> >> Laszlo Ersek (3): >> OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard >> OvmfPkg/QemuVideoDxe/VbeShim: rename Status to >> Segment0AllocationStatus >> OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly >> >> OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 >> ++++++++++---------- >> OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ >> OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ >> OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ >> OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- >> OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- >> 6 files changed, 95 insertions(+), 60 deletions(-) >> > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek ` (4 preceding siblings ...) 2017-09-20 7:05 ` Aleksei @ 2017-09-20 14:36 ` Aleksei 2017-09-20 18:11 ` Jordan Justen 6 siblings, 0 replies; 10+ messages in thread From: Aleksei @ 2017-09-20 14:36 UTC (permalink / raw) To: Laszlo Ersek, edk2-devel-01 Cc: Gerd Hoffmann, Igor Mammedov, Jordan Justen, Ruiyu Ni Tested-by: Aleksei Kovura Works for me with Qemu 2.10.0. On 19/09/17 22:18, Laszlo Ersek wrote: > Repo: https://github.com/lersek/edk2.git > Branch: vbe_shim_q35_pam > > Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, > and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. > > Aleksei, can you please fetch the branch, build it, and report back with > your Tested-by if it works for you? > > I performed my own tests as well; I'll include those in a separate > email. > > Cc: Aleksei Kovura <alex3kov@zoho.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > > Thank you, > Laszlo > > Laszlo Ersek (3): > OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard > OvmfPkg/QemuVideoDxe/VbeShim: rename Status to > Segment0AllocationStatus > OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly > > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ > OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ > OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ > OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- > OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- > 6 files changed, 95 insertions(+), 60 deletions(-) > -- /--Regards, Aleksei/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek ` (5 preceding siblings ...) 2017-09-20 14:36 ` Aleksei @ 2017-09-20 18:11 ` Jordan Justen 2017-09-20 18:28 ` Laszlo Ersek 6 siblings, 1 reply; 10+ messages in thread From: Jordan Justen @ 2017-09-20 18:11 UTC (permalink / raw) To: Laszlo Ersek, edk2-devel-01 Cc: Aleksei Kovura, Gerd Hoffmann, Igor Mammedov, Ruiyu Ni Series Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> On 2017-09-19 12:18:12, Laszlo Ersek wrote: > Repo: https://github.com/lersek/edk2.git > Branch: vbe_shim_q35_pam > > Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, > and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. > > Aleksei, can you please fetch the branch, build it, and report back with > your Tested-by if it works for you? > > I performed my own tests as well; I'll include those in a separate > email. > > Cc: Aleksei Kovura <alex3kov@zoho.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > > Thank you, > Laszlo > > Laszlo Ersek (3): > OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard > OvmfPkg/QemuVideoDxe/VbeShim: rename Status to > Segment0AllocationStatus > OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly > > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- > OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ > OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ > OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ > OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- > OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- > 6 files changed, 95 insertions(+), 60 deletions(-) > > -- > 2.14.1.3.gb7cf6e02401b > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly 2017-09-20 18:11 ` Jordan Justen @ 2017-09-20 18:28 ` Laszlo Ersek 0 siblings, 0 replies; 10+ messages in thread From: Laszlo Ersek @ 2017-09-20 18:28 UTC (permalink / raw) To: Jordan Justen, Aleksei Kovura Cc: edk2-devel-01, Gerd Hoffmann, Igor Mammedov, Ruiyu Ni On 09/20/17 20:11, Jordan Justen wrote: > Series Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Much appreciated! :) Aleksei, thank you for the LaunchPad bug report (complete with bisection) and the testing. Pushed: b68c793144e8..947f3737abf6. Cheers, Laszlo > On 2017-09-19 12:18:12, Laszlo Ersek wrote: >> Repo: https://github.com/lersek/edk2.git >> Branch: vbe_shim_q35_pam >> >> Fix the long-standing OVMF/Q35 bug recently exposed by a QEMU change, >> and reported under <https://bugs.launchpad.net/qemu/+bug/1715700>. >> >> Aleksei, can you please fetch the branch, build it, and report back with >> your Tested-by if it works for you? >> >> I performed my own tests as well; I'll include those in a separate >> email. >> >> Cc: Aleksei Kovura <alex3kov@zoho.com> >> Cc: Gerd Hoffmann <kraxel@redhat.com> >> Cc: Igor Mammedov <imammedo@redhat.com> >> Cc: Jordan Justen <jordan.l.justen@intel.com> >> Cc: Ruiyu Ni <ruiyu.ni@intel.com> >> >> Thank you, >> Laszlo >> >> Laszlo Ersek (3): >> OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard >> OvmfPkg/QemuVideoDxe/VbeShim: rename Status to >> Segment0AllocationStatus >> OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly >> >> OvmfPkg/Csm/CsmSupportLib/LegacyRegion.c | 62 ++++++++++---------- >> OvmfPkg/Csm/CsmSupportLib/LegacyRegion.h | 22 +------ >> OvmfPkg/Include/IndustryStandard/I440FxPiix4.h | 13 ++++ >> OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 8 +++ >> OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 3 +- >> OvmfPkg/QemuVideoDxe/VbeShim.c | 47 ++++++++++++--- >> 6 files changed, 95 insertions(+), 60 deletions(-) >> >> -- >> 2.14.1.3.gb7cf6e02401b >> ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-09-20 18:26 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-09-19 19:18 [PATCH 0/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek 2017-09-19 19:18 ` [PATCH 1/3] OvmfPkg/CsmSupportLib: move PAM register addresses to IndustryStandard Laszlo Ersek 2017-09-19 19:18 ` [PATCH 2/3] OvmfPkg/QemuVideoDxe/VbeShim: rename Status to Segment0AllocationStatus Laszlo Ersek 2017-09-19 19:18 ` [PATCH 3/3] OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly Laszlo Ersek 2017-09-19 19:36 ` [PATCH 0/3] " Laszlo Ersek 2017-09-20 7:05 ` Aleksei 2017-09-20 11:43 ` Laszlo Ersek 2017-09-20 14:36 ` Aleksei 2017-09-20 18:11 ` Jordan Justen 2017-09-20 18:28 ` Laszlo Ersek
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox