Akihiko Odaki <[email protected]> writes:
> vfio determines if rombar is explicitly enabled by inspecting QDict.
> Inspecting QDict is not nice because QDict is untyped and depends on the
> details on the external interface. Add an infrastructure to determine if
> rombar is explicitly enabled to hw/pci.
>
> Signed-off-by: Akihiko Odaki <[email protected]>
> ---
> include/hw/pci/pci_device.h | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h
> index ca151325085d..c4fdc96ef50d 100644
> --- a/include/hw/pci/pci_device.h
> +++ b/include/hw/pci/pci_device.h
> @@ -205,6 +205,11 @@ static inline uint16_t pci_get_bdf(PCIDevice *dev)
> return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn);
> }
>
> +static inline bool pci_rom_bar_explicitly_enabled(PCIDevice *dev)
> +{
> + return dev->rom_bar && dev->rom_bar != -1;
Compares signed with unsigned: rom_bar is uint32_t, -1 is int.
If int is at most 32 bits, the comparison converts -1 to
(uint32_t)0xffffffff.
If int is wider, it converts dev->rom_bar to int without changing its
value. In particular, it converts the default value 0xffffffff (written
as -1 in the previous patch) to (int)0xffffffff. Oops.
Best not to mix signed and unsigned in comparisons. Easy enough to
avoid here.
Still, we don't actually test "rom_bar has not been set". We test
"rom_bar has the default value". Nothing stops a user from passing
rombar=0xffffffff to -device. See my review of the next patch.
> +}
> +
> static inline void pci_set_power(PCIDevice *pci_dev, bool state)
> {
> /*