Re: [PULL 01/13] vfio/igd: Clear saved BDSM in legacy VBIOS ROM at load time
Cédric Le Goater <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu.stable,gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
On 7/24/26 10:33, Michael Tokarev wrote: > On 7/21/26 20:05, Cédric Le Goater wrote: >> From: Tomita Moeko <[email protected]> >> >> IGD does not come with a ROM BAR [1], the ROM BAR read by default from >> kernel is actually the host VBIOS shadow RAM region that contains host >> modifications on boot. With AI-assisted reverse engineering on VBIOS >> binaries, it is observed that VBIOS saves BDSM register value on first >> access and uses saved value if present. >> >> When the image is executed in guest, since there is already a saved HPA >> in VBIOS, it keeps using that value instead of the GPA programmed by >> SeaBIOS in BDSM register in PCI config space, causing VBIOS to program >> GTT entries with wrong address, resulting in garbled output in BIOS >> POST and the error below detected by i915 driver. >> >> i915 0000:00:02.0: [drm] *ERROR* Initial plane programming using invalid range, dma_addr=0x00000000db200000 ((null) [0x00000000baf00000-0x00000000beefffff]) >> >> The previous solution, c4c45e943e51 ("vfio/pci: Intel graphics legacy >> mode assignment"), adjusts GTT entry addresses to (addr - host BDSM + >> guest BDSM) to workaround that. But it is removed in 5aed8b0f0be2 >> ("vfio/igd: Remove GTT write quirk in IO BAR 4") due to inconsistent >> values in MMIO BAR0 and IO BAR4. >> >> Since it was a value latched into the VBIOS that breaks virtualization >> (QEMU does not map the GTT at the same address in the VM), a ROM quirk >> clearing the saved value in VBIOS image is introduced. It searches the >> BDSM accessor routine by matching a 19-byte signature anchored on the >> unique `mov $0x105e,%ax` instruction, then locates the offset of saved >> BDSM and clears it. This makes the routine fall through to the PCI >> config read on the first call inside the guest. >> >> [1] 3.5.15, 4th Generation Intel Core Processor Family Datasheet Vol. 2 >> https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/4th-gen-core-family-desktop-vol-2-datasheet.pdf >> >> Fixes: 5aed8b0f0be2 ("vfio/igd: Remove GTT write quirk in IO BAR 4") >> Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3093 >> Reported-by: K S Maan <[email protected]> >> Cc: [email protected] >> Signed-off-by: Tomita Moeko <[email protected]> >> Reviewed-by: Alex Williamson <[email protected]> >> Link: https://lore.kernel.org/qemu-devel/[email protected] >> Signed-off-by: Cédric Le Goater <[email protected]> > > >> --- >> hw/vfio/pci.h | 3 ++ >> hw/vfio/igd-stubs.c | 5 ++ >> hw/vfio/igd.c | 115 +++++++++++++++++++++++++++++++++++++++++++ >> hw/vfio/pci-quirks.c | 5 ++ >> hw/vfio/pci.c | 2 + >> hw/vfio/trace-events | 1 + >> 6 files changed, 131 insertions(+) > > I'm picking this up for currently active stable qemu series. Since this > change touches several files, including new file since last release > (hw/vfio/igd-stubs.c), I'm also picking a few other changes to the > stable series, namely, for 11.0.x: > > v11.0.0-2776-gc822ecd8066 vfio/pci: Initialize rom_read_failed in vfio_pci_load_rom() > this is a little bugfix by its own, so it's okay to pick up > > v11.0.0-3-g55e25958aa1 hw/vfio/pci-quirks.c: remove CONFIG_VFIO_IGD, > Add stubs for needed functions. This changes quite a few things, > but not much. I can adjust this change (Clear saved BDSM) for the > context before CONFIG_VFIO_IGD removal, but it feels like it would > be better to pick up CONFIG_VFIO_IGD removal too, to make the branches > more similar. > > For 10.0.x, things are a bit more complex here. In particular, 10.0.x > lacks > > v10.0.0-290-ge218ccf0c94 vfio: Rename VFIODevice related services > v10.0.0-756-g2e27becf17b vfio: consistently handle return value for helpers > v10.2.0-2365-g988499515da "hw/display: Build stubs once" > > and these are more troublesome to pick up, including "CONFIG_VFIO_IGD > removal", so I'm picking up "Initialize rom_read_failed", and adjusting > "Clear saved BDSM" for the lack of "CONFIG_VFIO_IGD removal" (it's > stright-forward, with #ifdef CONFIG_VFIO_IGD instead of empty stub). > > I'm not very comfortable with the different approach to 10.0.x and 11.0.x, > maybe I should omit "CONFIG_VFIO_IGD removal" from 11.0.x too. > > What do you think? For the stable branches, I would take the fixes only : c822ecd80661 ("vfio/pci: Initialize rom_read_failed in vfio_pci_load_rom()") 256229e8f9b9 ("vfio/igd: Clear saved BDSM in legacy VBIOS ROM at load time") and commit 55e25958aa1a ("hw/vfio/pci-quirks.c: remove CONFIG_VFIO_IGD") is not one. I would skip 55e25958aa1a and adapt the BDSM patch with #ifdef CONFIG_VFIO_IGD in 10.0.x and 11.0.x. How's that ? C.