* [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