[SeaBIOS] [PATCH] pci: fix 'io hints' capability for RedHat PCI bridges

Michael S. Tsirkin mst at redhat.com
Thu Jan 11 21:50:07 CET 2018


On Thu, Jan 11, 2018 at 10:15:12PM +0200, Marcel Apfelbaum wrote:
> Commit ec6cb17f (pci: enable RedHat PCI bridges to reserve additional
>                  resources on PCI init)
> added a new vendor specific PCI capability for RedHat PCI bridges
> allowing them to reserve additional buses and/or IO/MEM space.
> 
> When adding the IO hints PCI capability to the pcie-root-port
> without specifying a value for bus reservation, the subordinate bus
> computation is wrong and the guest kernel gets messed up.
> 
> Fix it by returning to prev code if the value for bus
> reservation is not set.
> 
> Removed also a wrong debug print "PCI: invalid QEMU resource reserve
> cap offset" which appears if the 'IO hints' capability is not present.
> 
> Signed-off-by: Marcel Apfelbaum <marcel at redhat.com>

Acked-by: Michael S. Tsirkin <mst at redhat.com>

> ---
>  src/fw/pciinit.c | 14 +++++---------
>  1 file changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
> index 7f0e439..3a2f747 100644
> --- a/src/fw/pciinit.c
> +++ b/src/fw/pciinit.c
> @@ -540,8 +540,6 @@ static u8 pci_find_resource_reserve_capability(u16 bdf)
>                  dprintf(1, "PCI: QEMU resource reserve cap length %d is invalid\n",
>                          cap_len);
>              }
> -        } else {
> -            dprintf(1, "PCI: invalid QEMU resource reserve cap offset\n");
>          }
>          return cap;
>      } else {
> @@ -619,13 +617,11 @@ pci_bios_init_bus_rec(int bus, u8 *pci_bus)
>                                  res_bus);
>                          res_bus = 0;
>                      }
> -                }
> -                if (secbus + res_bus > *pci_bus) {
> -                    dprintf(1, "PCI: QEMU resource reserve cap: bus = %u\n",
> -                            res_bus);
> -                    res_bus = secbus + res_bus;
> -                } else {
> -                    res_bus = *pci_bus;
> +                    if (secbus + res_bus > *pci_bus) {
> +                        dprintf(1, "PCI: QEMU resource reserve cap: bus = %u\n",
> +                                res_bus);
> +                        res_bus = secbus + res_bus;
> +                    }
>                  }
>              }
>              dprintf(1, "PCI: subordinate bus = 0x%x -> 0x%x\n",
> -- 
> 2.13.5



More information about the SeaBIOS mailing list