qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] hw/pci: catch a few error cases
@ 2025-01-17 17:28 Nicholas Piggin
  2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
  2025-01-17 17:28 ` [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times Nicholas Piggin
  0 siblings, 2 replies; 8+ messages in thread
From: Nicholas Piggin @ 2025-01-17 17:28 UTC (permalink / raw)
  To: Michael S . Tsirkin; +Cc: Nicholas Piggin, Marcel Apfelbaum, qemu-devel

Hi,

These would have helped to catch a few bugs I ran into / created
recently, so they might be worth upstreaming.

Thanks,
Nick

Nicholas Piggin (2):
  hw/pci/msix: Warn on PBA writes
  hw/pci: Assert a bar is not registered multiple times

 hw/pci/msix.c | 9 +++++++++
 hw/pci/pci.c  | 1 +
 2 files changed, 10 insertions(+)

-- 
2.45.2



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

* [PATCH 1/2] hw/pci/msix: Warn on PBA writes
  2025-01-17 17:28 [PATCH 0/2] hw/pci: catch a few error cases Nicholas Piggin
@ 2025-01-17 17:28 ` Nicholas Piggin
  2025-01-18  7:38   ` Akihiko Odaki
                     ` (2 more replies)
  2025-01-17 17:28 ` [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times Nicholas Piggin
  1 sibling, 3 replies; 8+ messages in thread
From: Nicholas Piggin @ 2025-01-17 17:28 UTC (permalink / raw)
  To: Michael S . Tsirkin
  Cc: Nicholas Piggin, Marcel Apfelbaum, qemu-devel, Dmitry Fleytman,
	Akihiko Odaki, Sriram Yagnaraman

Of the MSI-X PBA pending bits, the PCI Local Bus Specification says:

  Software should never write, and should only read
  Pending Bits. If software writes to Pending Bits, the
  result is undefined.

Log a GUEST_ERROR message if the PBA is written to by software.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com>
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hw/pci/msix.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/pci/msix.c b/hw/pci/msix.c
index 57ec7084a47..66f27b9d712 100644
--- a/hw/pci/msix.c
+++ b/hw/pci/msix.c
@@ -15,6 +15,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/log.h"
 #include "hw/pci/msi.h"
 #include "hw/pci/msix.h"
 #include "hw/pci/pci.h"
@@ -260,6 +261,14 @@ static uint64_t msix_pba_mmio_read(void *opaque, hwaddr addr,
 static void msix_pba_mmio_write(void *opaque, hwaddr addr,
                                 uint64_t val, unsigned size)
 {
+    PCIDevice *dev = opaque;
+
+    qemu_log_mask(LOG_GUEST_ERROR,
+                  "PCI [%s:%02x:%02x.%x] attempt to write to MSI-X "
+                  "PBA at 0x%" FMT_PCIBUS ", ignoring.\n",
+                  pci_root_bus_path(dev), pci_dev_bus_num(dev),
+                  PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
+                  addr);
 }
 
 static const MemoryRegionOps msix_pba_mmio_ops = {
-- 
2.45.2



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

* [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times
  2025-01-17 17:28 [PATCH 0/2] hw/pci: catch a few error cases Nicholas Piggin
  2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
@ 2025-01-17 17:28 ` Nicholas Piggin
  2025-01-19 10:38   ` Phil Dennis-Jordan
  1 sibling, 1 reply; 8+ messages in thread
From: Nicholas Piggin @ 2025-01-17 17:28 UTC (permalink / raw)
  To: Michael S . Tsirkin; +Cc: Nicholas Piggin, Marcel Apfelbaum, qemu-devel

Nothing should be doing this, but it doesn't get caught by
pci_register_bar(). Add an assertion to prevent misuse.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hw/pci/pci.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 2afa423925c..b067a55c5bc 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1391,6 +1391,7 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
     assert(hdr_type != PCI_HEADER_TYPE_BRIDGE || region_num < 2);
 
     r = &pci_dev->io_regions[region_num];
+    assert(!r->size);
     r->addr = PCI_BAR_UNMAPPED;
     r->size = size;
     r->type = type;
-- 
2.45.2



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

* Re: [PATCH 1/2] hw/pci/msix: Warn on PBA writes
  2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
@ 2025-01-18  7:38   ` Akihiko Odaki
  2025-01-19 10:31   ` Phil Dennis-Jordan
  2025-01-22  7:04   ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 8+ messages in thread
From: Akihiko Odaki @ 2025-01-18  7:38 UTC (permalink / raw)
  To: Nicholas Piggin, Michael S . Tsirkin
  Cc: Marcel Apfelbaum, qemu-devel, Dmitry Fleytman, Sriram Yagnaraman

On 2025/01/18 2:28, Nicholas Piggin wrote:
> Of the MSI-X PBA pending bits, the PCI Local Bus Specification says:
> 
>    Software should never write, and should only read
>    Pending Bits. If software writes to Pending Bits, the
>    result is undefined.
> 
> Log a GUEST_ERROR message if the PBA is written to by software.
> 
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
> Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com>
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>


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

* Re: [PATCH 1/2] hw/pci/msix: Warn on PBA writes
  2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
  2025-01-18  7:38   ` Akihiko Odaki
@ 2025-01-19 10:31   ` Phil Dennis-Jordan
  2025-01-22  7:04   ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 8+ messages in thread
From: Phil Dennis-Jordan @ 2025-01-19 10:31 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: Michael S . Tsirkin, Marcel Apfelbaum, qemu-devel,
	Dmitry Fleytman, Akihiko Odaki, Sriram Yagnaraman

[-- Attachment #1: Type: text/plain, Size: 1746 bytes --]

On Fri, 17 Jan 2025 at 18:29, Nicholas Piggin <npiggin@gmail.com> wrote:

> Of the MSI-X PBA pending bits, the PCI Local Bus Specification says:
>
>   Software should never write, and should only read
>   Pending Bits. If software writes to Pending Bits, the
>   result is undefined.
>
> Log a GUEST_ERROR message if the PBA is written to by software.
>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
> Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com>
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>

Reviewed-by: Phil Dennis-Jordan <phil@philjordan.eu>


> ---
>  hw/pci/msix.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/hw/pci/msix.c b/hw/pci/msix.c
> index 57ec7084a47..66f27b9d712 100644
> --- a/hw/pci/msix.c
> +++ b/hw/pci/msix.c
> @@ -15,6 +15,7 @@
>   */
>
>  #include "qemu/osdep.h"
> +#include "qemu/log.h"
>  #include "hw/pci/msi.h"
>  #include "hw/pci/msix.h"
>  #include "hw/pci/pci.h"
> @@ -260,6 +261,14 @@ static uint64_t msix_pba_mmio_read(void *opaque,
> hwaddr addr,
>  static void msix_pba_mmio_write(void *opaque, hwaddr addr,
>                                  uint64_t val, unsigned size)
>  {
> +    PCIDevice *dev = opaque;
> +
> +    qemu_log_mask(LOG_GUEST_ERROR,
> +                  "PCI [%s:%02x:%02x.%x] attempt to write to MSI-X "
> +                  "PBA at 0x%" FMT_PCIBUS ", ignoring.\n",
> +                  pci_root_bus_path(dev), pci_dev_bus_num(dev),
> +                  PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
> +                  addr);
>  }
>
>  static const MemoryRegionOps msix_pba_mmio_ops = {
> --
> 2.45.2
>
>
>

[-- Attachment #2: Type: text/html, Size: 3007 bytes --]

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

* Re: [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times
  2025-01-17 17:28 ` [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times Nicholas Piggin
@ 2025-01-19 10:38   ` Phil Dennis-Jordan
  2025-01-21  4:41     ` Nicholas Piggin
  0 siblings, 1 reply; 8+ messages in thread
From: Phil Dennis-Jordan @ 2025-01-19 10:38 UTC (permalink / raw)
  To: Nicholas Piggin; +Cc: Michael S . Tsirkin, Marcel Apfelbaum, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1256 bytes --]

Looks good to me. There is a risk here that the assertion will fail on
existing code. (Unless you've rigorously audited all callers, which would
be quite the task.) However, I agree that this would constitute a bug in
the calling code, not an issue with this change. Since we've still got a
few months left in the 10.0 release cycle, I say go for it - hopefully such
bugs, if there are any, will be shaken out over the next few weeks.

On Fri, 17 Jan 2025 at 18:29, Nicholas Piggin <npiggin@gmail.com> wrote:

> Nothing should be doing this, but it doesn't get caught by
> pci_register_bar(). Add an assertion to prevent misuse.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>
Reviewed-by: Phil Dennis-Jordan <phil@philjordan.eu>


> ---
>  hw/pci/pci.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index 2afa423925c..b067a55c5bc 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -1391,6 +1391,7 @@ void pci_register_bar(PCIDevice *pci_dev, int
> region_num,
>      assert(hdr_type != PCI_HEADER_TYPE_BRIDGE || region_num < 2);
>
>      r = &pci_dev->io_regions[region_num];
> +    assert(!r->size);
>      r->addr = PCI_BAR_UNMAPPED;
>      r->size = size;
>      r->type = type;
> --
> 2.45.2
>
>
>

[-- Attachment #2: Type: text/html, Size: 1957 bytes --]

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

* Re: [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times
  2025-01-19 10:38   ` Phil Dennis-Jordan
@ 2025-01-21  4:41     ` Nicholas Piggin
  0 siblings, 0 replies; 8+ messages in thread
From: Nicholas Piggin @ 2025-01-21  4:41 UTC (permalink / raw)
  To: Phil Dennis-Jordan; +Cc: Michael S . Tsirkin, Marcel Apfelbaum, qemu-devel

On Sun Jan 19, 2025 at 8:38 PM AEST, Phil Dennis-Jordan wrote:
> Looks good to me. There is a risk here that the assertion will fail on
> existing code. (Unless you've rigorously audited all callers, which would
> be quite the task.) However, I agree that this would constitute a bug in
> the calling code, not an issue with this change. Since we've still got a
> few months left in the 10.0 release cycle, I say go for it - hopefully such
> bugs, if there are any, will be shaken out over the next few weeks.

You're right I didn't do an exhaustive audit or test beyond CI and some
browsing. I think it would be quite buggy already if this happens so we
should just catch and fix it quickly, but happy to change to a warning
first if anybody is concerned.

Thanks,
Nick

>
> On Fri, 17 Jan 2025 at 18:29, Nicholas Piggin <npiggin@gmail.com> wrote:
>
>> Nothing should be doing this, but it doesn't get caught by
>> pci_register_bar(). Add an assertion to prevent misuse.
>>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>>
> Reviewed-by: Phil Dennis-Jordan <phil@philjordan.eu>
>
>
>> ---
>>  hw/pci/pci.c | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
>> index 2afa423925c..b067a55c5bc 100644
>> --- a/hw/pci/pci.c
>> +++ b/hw/pci/pci.c
>> @@ -1391,6 +1391,7 @@ void pci_register_bar(PCIDevice *pci_dev, int
>> region_num,
>>      assert(hdr_type != PCI_HEADER_TYPE_BRIDGE || region_num < 2);
>>
>>      r = &pci_dev->io_regions[region_num];
>> +    assert(!r->size);
>>      r->addr = PCI_BAR_UNMAPPED;
>>      r->size = size;
>>      r->type = type;
>> --
>> 2.45.2
>>
>>
>>



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

* Re: [PATCH 1/2] hw/pci/msix: Warn on PBA writes
  2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
  2025-01-18  7:38   ` Akihiko Odaki
  2025-01-19 10:31   ` Phil Dennis-Jordan
@ 2025-01-22  7:04   ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-01-22  7:04 UTC (permalink / raw)
  To: Nicholas Piggin, Michael S . Tsirkin
  Cc: Marcel Apfelbaum, qemu-devel, Dmitry Fleytman, Akihiko Odaki,
	Sriram Yagnaraman

On 17/1/25 18:28, Nicholas Piggin wrote:
> Of the MSI-X PBA pending bits, the PCI Local Bus Specification says:
> 
>    Software should never write, and should only read
>    Pending Bits. If software writes to Pending Bits, the
>    result is undefined.
> 
> Log a GUEST_ERROR message if the PBA is written to by software.
> 
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
> Cc: Dmitry Fleytman <dmitry.fleytman@gmail.com>
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Cc: Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>   hw/pci/msix.c | 9 +++++++++
>   1 file changed, 9 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

end of thread, other threads:[~2025-01-22  7:04 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-17 17:28 [PATCH 0/2] hw/pci: catch a few error cases Nicholas Piggin
2025-01-17 17:28 ` [PATCH 1/2] hw/pci/msix: Warn on PBA writes Nicholas Piggin
2025-01-18  7:38   ` Akihiko Odaki
2025-01-19 10:31   ` Phil Dennis-Jordan
2025-01-22  7:04   ` Philippe Mathieu-Daudé
2025-01-17 17:28 ` [PATCH 2/2] hw/pci: Assert a bar is not registered multiple times Nicholas Piggin
2025-01-19 10:38   ` Phil Dennis-Jordan
2025-01-21  4:41     ` Nicholas Piggin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).