All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
@ 2026-09-21  5:59 Clément MATHIEU--DRIF
  2026-09-21  6:54 ` Akihiko Odaki
  2026-10-28 13:14 ` Michael S. Tsirkin
  0 siblings, 2 replies; 7+ messages in thread
From: Clément MATHIEU--DRIF @ 2026-09-21  5:59 UTC (permalink / raw)
  To: qemu-devel@nongnu.org
  Cc: mst@redhat.com, odaki@rsg.ci.i.u-tokyo.ac.jp,
	Clément MATHIEU--DRIF

The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
dedicated 32-bit configuration field. Fix the reset loop to write
32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.

As a side effect of this change, update PCIESriovPF::vf_bar_type
to match the number of regions exposed by SR-IOV and rework the
associated assert statements.

Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
Signed-off-by: Clement Mathieu--Drif <clement.mathieu--drif@bull.com>
---
 hw/pci/pcie_sriov.c         | 9 +++++----
 include/hw/pci/pcie_sriov.h | 2 +-
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
index c41ac95bee..df61f281ea 100644
--- a/hw/pci/pcie_sriov.c
+++ b/hw/pci/pcie_sriov.c
@@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
 
     assert(sriov_cap > 0);
     assert(region_num >= 0);
-    assert(region_num < PCI_NUM_REGIONS);
-    assert(region_num != PCI_ROM_SLOT);
+    assert(region_num < PCI_SRIOV_NUM_BARS);
 
     wmask = ~(size - 1);
     addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
@@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
     dev->exp.sriov_pf.vf = vfs;
     dev->exp.sriov_pf.vf_user_created = true;
 
+    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
+
     for (i = 0; i < PCI_NUM_REGIONS; i++) {
         PCIIORegion *region = &vfs[0]->io_regions[i];
 
@@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
      */
     pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
 
-    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
-        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
+    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
+        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
                      dev->exp.sriov_pf.vf_bar_type[i]);
     }
 }
diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
index b0ea6a62c7..5f81e3b1bb 100644
--- a/include/hw/pci/pcie_sriov.h
+++ b/include/hw/pci/pcie_sriov.h
@@ -16,7 +16,7 @@
 #include "hw/pci/pci.h"
 
 typedef struct PCIESriovPF {
-    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
+    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
     PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
     bool vf_user_created; /* If VFs are created by user */
 } PCIESriovPF;
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-09-21  5:59 [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset Clément MATHIEU--DRIF
@ 2026-09-21  6:54 ` Akihiko Odaki
  2026-10-28 13:14 ` Michael S. Tsirkin
  1 sibling, 0 replies; 7+ messages in thread
From: Akihiko Odaki @ 2026-09-21  6:54 UTC (permalink / raw)
  To: Clément MATHIEU--DRIF, qemu-devel@nongnu.org; +Cc: mst@redhat.com

On 2026/09/21 14:59, Clément MATHIEU--DRIF wrote:
> The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> dedicated 32-bit configuration field. Fix the reset loop to write
> 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> 
> As a side effect of this change, update PCIESriovPF::vf_bar_type
> to match the number of regions exposed by SR-IOV and rework the
> associated assert statements.
> 
> Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> Signed-off-by: Clement Mathieu--Drif <clement.mathieu--drif@bull.com>

Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-09-21  5:59 [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset Clément MATHIEU--DRIF
  2026-09-21  6:54 ` Akihiko Odaki
@ 2026-10-28 13:14 ` Michael S. Tsirkin
  2026-10-28 13:40   ` Clément MATHIEU--DRIF
  1 sibling, 1 reply; 7+ messages in thread
From: Michael S. Tsirkin @ 2026-10-28 13:14 UTC (permalink / raw)
  To: Clément MATHIEU--DRIF
  Cc: qemu-devel@nongnu.org, odaki@rsg.ci.i.u-tokyo.ac.jp

On Mon, Sep 21, 2026 at 05:59:23AM +0000, Clément MATHIEU--DRIF wrote:
> The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> dedicated 32-bit configuration field. Fix the reset loop to write
> 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> 
> As a side effect of this change, update PCIESriovPF::vf_bar_type
> to match the number of regions exposed by SR-IOV and rework the
> associated assert statements.
> 
> Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> Signed-off-by: Clement Mathieu--Drif <clement.mathieu--drif@bull.com>

I queued another patch fixing this, yours will become a cleanup.
Once my pull is merged, pls rebase and report.

Thanks!

> ---
>  hw/pci/pcie_sriov.c         | 9 +++++----
>  include/hw/pci/pcie_sriov.h | 2 +-
>  2 files changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> index c41ac95bee..df61f281ea 100644
> --- a/hw/pci/pcie_sriov.c
> +++ b/hw/pci/pcie_sriov.c
> @@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
>  
>      assert(sriov_cap > 0);
>      assert(region_num >= 0);
> -    assert(region_num < PCI_NUM_REGIONS);
> -    assert(region_num != PCI_ROM_SLOT);
> +    assert(region_num < PCI_SRIOV_NUM_BARS);
>  
>      wmask = ~(size - 1);
>      addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
> @@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
>      dev->exp.sriov_pf.vf = vfs;
>      dev->exp.sriov_pf.vf_user_created = true;
>  
> +    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
> +
>      for (i = 0; i < PCI_NUM_REGIONS; i++) {
>          PCIIORegion *region = &vfs[0]->io_regions[i];
>  
> @@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
>       */
>      pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
>  
> -    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
> -        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> +    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> +        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
>                       dev->exp.sriov_pf.vf_bar_type[i]);
>      }
>  }
> diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
> index b0ea6a62c7..5f81e3b1bb 100644
> --- a/include/hw/pci/pcie_sriov.h
> +++ b/include/hw/pci/pcie_sriov.h
> @@ -16,7 +16,7 @@
>  #include "hw/pci/pci.h"
>  
>  typedef struct PCIESriovPF {
> -    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
> +    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
>      PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
>      bool vf_user_created; /* If VFs are created by user */
>  } PCIESriovPF;
> -- 
> 2.55.0



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-10-28 13:14 ` Michael S. Tsirkin
@ 2026-10-28 13:40   ` Clément MATHIEU--DRIF
  2026-10-28 13:51     ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: Clément MATHIEU--DRIF @ 2026-10-28 13:40 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel@nongnu.org, odaki@rsg.ci.i.u-tokyo.ac.jp


On Wed, 2026-10-28 at 09:14 -0400, Michael S. Tsirkin wrote:
> Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> 
> 
> On Mon, Sep 21, 2026 at 05:59:23AM +0000, Clément MATHIEU--DRIF wrote:
> 
> > The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> > dedicated 32-bit configuration field. Fix the reset loop to write
> > 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> > 
> > As a side effect of this change, update PCIESriovPF::vf_bar_type
> > to match the number of regions exposed by SR-IOV and rework the
> > associated assert statements.
> > 
> > Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> > Signed-off-by: Clement Mathieu--Drif <[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com)>
> 
> 
> I queued another patch fixing this, yours will become a cleanup.  
> Once my pull is merged, pls rebase and report.
> 
> Thanks!

Hi Michael,

Do you want version rebased on master or another ref?

cmd

> 
> 
> > ---
> >  hw/pci/pcie_sriov.c         | 9 +++++----
> >  include/hw/pci/pcie_sriov.h | 2 +-
> >  2 files changed, 6 insertions(+), 5 deletions(-)
> > 
> > diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> > index c41ac95bee..df61f281ea 100644
> > --- a/hw/pci/pcie_sriov.c
> > +++ b/hw/pci/pcie_sriov.c
> > @@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
> > 
> >      assert(sriov_cap > 0);
> >      assert(region_num >= 0);
> > -    assert(region_num < PCI_NUM_REGIONS);
> > -    assert(region_num != PCI_ROM_SLOT);
> > +    assert(region_num < PCI_SRIOV_NUM_BARS);
> > 
> >      wmask = ~(size - 1);
> >      addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
> > @@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
> >      dev->exp.sriov_pf.vf = vfs;
> >      dev->exp.sriov_pf.vf_user_created = true;
> > 
> > +    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
> > +
> >      for (i = 0; i < PCI_NUM_REGIONS; i++) {
> >          PCIIORegion *region = &vfs[0]->io_regions[i];
> > 
> > @@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
> >       */
> >      pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
> > 
> > -    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
> > -        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > +    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> > +        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> >                       dev->exp.sriov_pf.vf_bar_type[i]);
> >      }
> >  }
> > diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
> > index b0ea6a62c7..5f81e3b1bb 100644
> > --- a/include/hw/pci/pcie_sriov.h
> > +++ b/include/hw/pci/pcie_sriov.h
> > @@ -16,7 +16,7 @@
> >  #include "hw/pci/pci.h"
> > 
> >  typedef struct PCIESriovPF {
> > -    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
> > +    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
> >      PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
> >      bool vf_user_created; /* If VFs are created by user */
> >  } PCIESriovPF;
> > --
> > 2.55.0
> 
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-10-28 13:40   ` Clément MATHIEU--DRIF
@ 2026-10-28 13:51     ` Michael S. Tsirkin
  2026-10-28 14:12       ` Clément MATHIEU--DRIF
  0 siblings, 1 reply; 7+ messages in thread
From: Michael S. Tsirkin @ 2026-10-28 13:51 UTC (permalink / raw)
  To: Clément MATHIEU--DRIF
  Cc: qemu-devel@nongnu.org, odaki@rsg.ci.i.u-tokyo.ac.jp

On Wed, Oct 28, 2026 at 01:40:24PM +0000, Clément MATHIEU--DRIF wrote:
> 
> On Wed, 2026-10-28 at 09:14 -0400, Michael S. Tsirkin wrote:
> > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> > 
> > 
> > On Mon, Sep 21, 2026 at 05:59:23AM +0000, Clément MATHIEU--DRIF wrote:
> > 
> > > The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> > > dedicated 32-bit configuration field. Fix the reset loop to write
> > > 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> > > 
> > > As a side effect of this change, update PCIESriovPF::vf_bar_type
> > > to match the number of regions exposed by SR-IOV and rework the
> > > associated assert statements.
> > > 
> > > Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> > > Signed-off-by: Clement Mathieu--Drif <[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com)>
> > 
> > 
> > I queued another patch fixing this, yours will become a cleanup.  
> > Once my pull is merged, pls rebase and report.
> > 
> > Thanks!
> 
> Hi Michael,
> 
> Do you want version rebased on master or another ref?
> 
> cmd

pci branch in my tree will do

> > 
> > 
> > > ---
> > >  hw/pci/pcie_sriov.c         | 9 +++++----
> > >  include/hw/pci/pcie_sriov.h | 2 +-
> > >  2 files changed, 6 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> > > index c41ac95bee..df61f281ea 100644
> > > --- a/hw/pci/pcie_sriov.c
> > > +++ b/hw/pci/pcie_sriov.c
> > > @@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
> > > 
> > >      assert(sriov_cap > 0);
> > >      assert(region_num >= 0);
> > > -    assert(region_num < PCI_NUM_REGIONS);
> > > -    assert(region_num != PCI_ROM_SLOT);
> > > +    assert(region_num < PCI_SRIOV_NUM_BARS);
> > > 
> > >      wmask = ~(size - 1);
> > >      addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
> > > @@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
> > >      dev->exp.sriov_pf.vf = vfs;
> > >      dev->exp.sriov_pf.vf_user_created = true;
> > > 
> > > +    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
> > > +
> > >      for (i = 0; i < PCI_NUM_REGIONS; i++) {
> > >          PCIIORegion *region = &vfs[0]->io_regions[i];
> > > 
> > > @@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
> > >       */
> > >      pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
> > > 
> > > -    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
> > > -        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > > +    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> > > +        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > >                       dev->exp.sriov_pf.vf_bar_type[i]);
> > >      }
> > >  }
> > > diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
> > > index b0ea6a62c7..5f81e3b1bb 100644
> > > --- a/include/hw/pci/pcie_sriov.h
> > > +++ b/include/hw/pci/pcie_sriov.h
> > > @@ -16,7 +16,7 @@
> > >  #include "hw/pci/pci.h"
> > > 
> > >  typedef struct PCIESriovPF {
> > > -    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
> > > +    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
> > >      PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
> > >      bool vf_user_created; /* If VFs are created by user */
> > >  } PCIESriovPF;
> > > --
> > > 2.55.0
> > 
> > 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-10-28 13:51     ` Michael S. Tsirkin
@ 2026-10-28 14:12       ` Clément MATHIEU--DRIF
  2026-10-28 14:19         ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: Clément MATHIEU--DRIF @ 2026-10-28 14:12 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel@nongnu.org, odaki@rsg.ci.i.u-tokyo.ac.jp


On Wed, 2026-10-28 at 09:51 -0400, Michael S. Tsirkin wrote:
> Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> 
> 
> On Wed, Oct 28, 2026 at 01:40:24PM +0000, Clément MATHIEU--DRIF wrote:
> 
> 
> > On Wed, 2026-10-28 at 09:14 -0400, Michael S. Tsirkin wrote:
> > 
> > > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> > > 
> > > 
> > > On Mon, Sep 21, 2026 at 05:59:23AM +0000, Clément MATHIEU--DRIF wrote:
> > > 
> > > 
> > > > The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> > > > dedicated 32-bit configuration field. Fix the reset loop to write
> > > > 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> > > > 
> > > > As a side effect of this change, update PCIESriovPF::vf_bar_type
> > > > to match the number of regions exposed by SR-IOV and rework the
> > > > associated assert statements.
> > > > 
> > > > Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> > > > Signed-off-by: Clement Mathieu--Drif <[[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com)](mailto:[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com))>
> > > 
> > > 
> > > 
> > > I queued another patch fixing this, yours will become a cleanup.
> > > Once my pull is merged, pls rebase and report.
> > > 
> > > Thanks!
> > 
> > 
> > Hi Michael,
> > 
> > Do you want version rebased on master or another ref?
> > 
> > cmd
> 
> 
> pci branch in my tree will do

You already put the patch in the branch.

I'm ok with the remaining changes if we update the commit message to:

```
pcie_sriov: Rework the assert statements checking region numbers  

pcie_sriov_pf_init_vf_bar: PCI_ROM_SLOT is already out of the SR-IOV regions.  
pcie_sriov_pf_init_from_user_created_vfs: ROM region must never have a non-zero size.
```

> 
> 
> 
> > > 
> > > 
> > > 
> > > > ---
> > > >  hw/pci/pcie_sriov.c         | 9 +++++----
> > > >  include/hw/pci/pcie_sriov.h | 2 +-
> > > >  2 files changed, 6 insertions(+), 5 deletions(-)
> > > > 
> > > > diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> > > > index c41ac95bee..df61f281ea 100644
> > > > --- a/hw/pci/pcie_sriov.c
> > > > +++ b/hw/pci/pcie_sriov.c
> > > > @@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
> > > > 
> > > >      assert(sriov_cap > 0);
> > > >      assert(region_num >= 0);
> > > > -    assert(region_num < PCI_NUM_REGIONS);
> > > > -    assert(region_num != PCI_ROM_SLOT);
> > > > +    assert(region_num < PCI_SRIOV_NUM_BARS);
> > > > 
> > > >      wmask = ~(size - 1);
> > > >      addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
> > > > @@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
> > > >      dev->exp.sriov_pf.vf = vfs;
> > > >      dev->exp.sriov_pf.vf_user_created = true;
> > > > 
> > > > +    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
> > > > +
> > > >      for (i = 0; i < PCI_NUM_REGIONS; i++) {
> > > >          PCIIORegion *region = &vfs[0]->io_regions[i];
> > > > 
> > > > @@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
> > > >       */
> > > >      pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
> > > > 
> > > > -    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
> > > > -        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > > > +    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> > > > +        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > > >                       dev->exp.sriov_pf.vf_bar_type[i]);
> > > >      }
> > > >  }
> > > > diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
> > > > index b0ea6a62c7..5f81e3b1bb 100644
> > > > --- a/include/hw/pci/pcie_sriov.h
> > > > +++ b/include/hw/pci/pcie_sriov.h
> > > > @@ -16,7 +16,7 @@
> > > >  #include "hw/pci/pci.h"
> > > > 
> > > >  typedef struct PCIESriovPF {
> > > > -    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
> > > > +    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
> > > >      PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
> > > >      bool vf_user_created; /* If VFs are created by user */
> > > >  } PCIESriovPF;
> > > > --
> > > > 2.55.0
> > > 
> > > 
> > > 
> >
> 
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset
  2026-10-28 14:12       ` Clément MATHIEU--DRIF
@ 2026-10-28 14:19         ` Michael S. Tsirkin
  0 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2026-10-28 14:19 UTC (permalink / raw)
  To: Clément MATHIEU--DRIF
  Cc: qemu-devel@nongnu.org, odaki@rsg.ci.i.u-tokyo.ac.jp

On Wed, Oct 28, 2026 at 02:12:43PM +0000, Clément MATHIEU--DRIF wrote:
> 
> On Wed, 2026-10-28 at 09:51 -0400, Michael S. Tsirkin wrote:
> > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> > 
> > 
> > On Wed, Oct 28, 2026 at 01:40:24PM +0000, Clément MATHIEU--DRIF wrote:
> > 
> > 
> > > On Wed, 2026-10-28 at 09:14 -0400, Michael S. Tsirkin wrote:
> > > 
> > > > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe.
> > > > 
> > > > 
> > > > On Mon, Sep 21, 2026 at 05:59:23AM +0000, Clément MATHIEU--DRIF wrote:
> > > > 
> > > > 
> > > > > The SR-IOV PCIe capability exposes 6 regions (no ROM), each with a
> > > > > dedicated 32-bit configuration field. Fix the reset loop to write
> > > > > 32 bits instead of 64 bits and stop after PCI_SRIOV_NUM_BARS iterations.
> > > > > 
> > > > > As a side effect of this change, update PCIESriovPF::vf_bar_type
> > > > > to match the number of regions exposed by SR-IOV and rework the
> > > > > associated assert statements.
> > > > > 
> > > > > Fixes: c8bc4db403e1 ("pcie_sriov: Reset SR-IOV extended capability")
> > > > > Signed-off-by: Clement Mathieu--Drif <[[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com)](mailto:[clement.mathieu--drif@bull.com](mailto:clement.mathieu--drif@bull.com))>
> > > > 
> > > > 
> > > > 
> > > > I queued another patch fixing this, yours will become a cleanup.
> > > > Once my pull is merged, pls rebase and report.
> > > > 
> > > > Thanks!
> > > 
> > > 
> > > Hi Michael,
> > > 
> > > Do you want version rebased on master or another ref?
> > > 
> > > cmd
> > 
> > 
> > pci branch in my tree will do
> 
> You already put the patch in the branch.
> 
> I'm ok with the remaining changes if we update the commit message to:
> 
> ```
> pcie_sriov: Rework the assert statements checking region numbers  
> 
> pcie_sriov_pf_init_vf_bar: PCI_ROM_SLOT is already out of the SR-IOV regions.  
> pcie_sriov_pf_init_from_user_created_vfs: ROM region must never have a non-zero size.
> ```

Pls revert and post the corrected version, I will replace mine with that
one.

> > 
> > 
> > 
> > > > 
> > > > 
> > > > 
> > > > > ---
> > > > >  hw/pci/pcie_sriov.c         | 9 +++++----
> > > > >  include/hw/pci/pcie_sriov.h | 2 +-
> > > > >  2 files changed, 6 insertions(+), 5 deletions(-)
> > > > > 
> > > > > diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
> > > > > index c41ac95bee..df61f281ea 100644
> > > > > --- a/hw/pci/pcie_sriov.c
> > > > > +++ b/hw/pci/pcie_sriov.c
> > > > > @@ -229,8 +229,7 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
> > > > > 
> > > > >      assert(sriov_cap > 0);
> > > > >      assert(region_num >= 0);
> > > > > -    assert(region_num < PCI_NUM_REGIONS);
> > > > > -    assert(region_num != PCI_ROM_SLOT);
> > > > > +    assert(region_num < PCI_SRIOV_NUM_BARS);
> > > > > 
> > > > >      wmask = ~(size - 1);
> > > > >      addr = sriov_cap + PCI_SRIOV_BAR + region_num * 4;
> > > > > @@ -344,6 +343,8 @@ int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
> > > > >      dev->exp.sriov_pf.vf = vfs;
> > > > >      dev->exp.sriov_pf.vf_user_created = true;
> > > > > 
> > > > > +    assert(vfs[0]->io_regions[PCI_ROM_SLOT].size == 0);
> > > > > +
> > > > >      for (i = 0; i < PCI_NUM_REGIONS; i++) {
> > > > >          PCIIORegion *region = &vfs[0]->io_regions[i];
> > > > > 
> > > > > @@ -463,8 +464,8 @@ void pcie_sriov_pf_reset(PCIDevice *dev)
> > > > >       */
> > > > >      pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1);
> > > > > 
> > > > > -    for (uint16_t i = 0; i < PCI_NUM_REGIONS; i++) {
> > > > > -        pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > > > > +    for (uint16_t i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> > > > > +        pci_set_long(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4,
> > > > >                       dev->exp.sriov_pf.vf_bar_type[i]);
> > > > >      }
> > > > >  }
> > > > > diff --git a/include/hw/pci/pcie_sriov.h b/include/hw/pci/pcie_sriov.h
> > > > > index b0ea6a62c7..5f81e3b1bb 100644
> > > > > --- a/include/hw/pci/pcie_sriov.h
> > > > > +++ b/include/hw/pci/pcie_sriov.h
> > > > > @@ -16,7 +16,7 @@
> > > > >  #include "hw/pci/pci.h"
> > > > > 
> > > > >  typedef struct PCIESriovPF {
> > > > > -    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
> > > > > +    uint8_t vf_bar_type[PCI_SRIOV_NUM_BARS];   /* Store type for each VF bar */
> > > > >      PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
> > > > >      bool vf_user_created; /* If VFs are created by user */
> > > > >  } PCIESriovPF;
> > > > > --
> > > > > 2.55.0
> > > > 
> > > > 
> > > > 
> > >
> > 
> > 



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-10-28 14:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-21  5:59 [PATCH] pcie_sriov: Avoid capability structure overflow in PF reset Clément MATHIEU--DRIF
2026-09-21  6:54 ` Akihiko Odaki
2026-10-28 13:14 ` Michael S. Tsirkin
2026-10-28 13:40   ` Clément MATHIEU--DRIF
2026-10-28 13:51     ` Michael S. Tsirkin
2026-10-28 14:12       ` Clément MATHIEU--DRIF
2026-10-28 14:19         ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.