Comment 4 for bug 897771

Revision history for this message
Andreas Gustafsson (gson) wrote :

I found the cause of the regression. As as Stefan Weil already figured,
it was caused by the following commit:

    commit d0ed8076cbdc26138a7e33fed5e45a35d019a103
    Author: Avi Kivity <email address hidden>
    Date: Sun Jul 24 17:47:18 2011 +0300

        pci_host: convert conf index and data ports to memory API

        Reviewed-by: Richard Henderson <email address hidden>
        Signed-off-by: Avi Kivity <email address hidden>

This commit incorrectly changed the emulation of the PCI configuration
register at I/O port 0xCF8. Before the commit, an outb to port 0xCFB
or an outw to port 0xCFA had no effect, but after the commit, they
change the value of the CONFIG_ADDRESS DWORD register at 0xCF8. This
is contrary to the behavior of real PC hardware, and contrary to the
PCI standard which clearly states that the only I/O space consumed by
the CONFIG_ADDRESS register is the DWORD at address 0xCF8.

Changing pci_host_config_write() to ignore writes with addr != 0 is
sufficient for qemu to again be able to boot NetBSD. For full
compliance with the PCI standard, it should also ignore writes with
size != 4, and a similar change should probably also be made to
pci_host_config_read().