From: Alex Williamson <alex.williamson@redhat.com>
To: qemu-devel@nongnu.org
Cc: alex.williamson@redhat.com, ddutile@redhat.com, gleb@redhat.com,
mst@redhat.com
Subject: [Qemu-devel] [PATCH 3/6] pci: Add notifier for device probing
Date: Tue, 06 Mar 2012 17:14:33 -0700 [thread overview]
Message-ID: <20120307001419.3079.96413.stgit@bling.home> (raw)
In-Reply-To: <20120307000340.3079.87515.stgit@bling.home>
It's sometimes useful to know when the guest probes a device. For
example, during PCI hotplug once the guest accesses the device, we
can no longer remove it without guest permission. Add a notifier
list that gets called when the vendor ID of a device is read. The
PCI spec mandates that configuration software must read this
register when probing the slot. Ideally we'd notify only on the
first vendor ID read, but this requires state, which has migration
implications. For now, notify on every read of the vendor ID.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
hw/pci_host.c | 19 +++++++++++++++++++
hw/pci_host.h | 2 ++
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/hw/pci_host.c b/hw/pci_host.c
index 44c6c20..7eb1eca 100644
--- a/hw/pci_host.c
+++ b/hw/pci_host.c
@@ -20,6 +20,7 @@
#include "pci.h"
#include "pci_host.h"
+#include "notify.h"
/* debug PCI */
//#define DEBUG_PCI
@@ -31,6 +32,19 @@ do { printf("pci_host_data: " fmt , ## __VA_ARGS__); } while (0)
#define PCI_DPRINTF(fmt, ...)
#endif
+static NotifierList pci_host_dev_probe_notifiers =
+ NOTIFIER_LIST_INITIALIZER(pci_host_dev_probe_notifiers);
+
+void pci_host_add_dev_probe_notifier(Notifier *notify)
+{
+ notifier_list_add(&pci_host_dev_probe_notifiers, notify);
+}
+
+void pci_host_remove_dev_probe_notifier(Notifier *notify)
+{
+ notifier_list_remove(&pci_host_dev_probe_notifiers, notify);
+}
+
/*
* PCI address
* bit 16 - 24: bus number
@@ -58,6 +72,11 @@ uint32_t pci_host_config_read_common(PCIDevice *pci_dev, uint32_t addr,
uint32_t limit, uint32_t len)
{
assert(len <= 4);
+
+ if (addr == PCI_VENDOR_ID) {
+ notifier_list_notify(&pci_host_dev_probe_notifiers, pci_dev);
+ }
+
return pci_dev->config_read(pci_dev, addr, MIN(len, limit - addr));
}
diff --git a/hw/pci_host.h b/hw/pci_host.h
index 359e38f..c5491ca 100644
--- a/hw/pci_host.h
+++ b/hw/pci_host.h
@@ -45,6 +45,8 @@ void pci_host_config_write_common(PCIDevice *pci_dev, uint32_t addr,
uint32_t limit, uint32_t val, uint32_t len);
uint32_t pci_host_config_read_common(PCIDevice *pci_dev, uint32_t addr,
uint32_t limit, uint32_t len);
+void pci_host_add_dev_probe_notifier(Notifier *notify);
+void pci_host_remove_dev_probe_notifier(Notifier *notify);
void pci_data_write(PCIBus *s, uint32_t addr, uint32_t val, int len);
uint32_t pci_data_read(PCIBus *s, uint32_t addr, int len);
next prev parent reply other threads:[~2012-03-07 0:14 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-07 0:13 [Qemu-devel] [PATCH 0/6] PCI hotplug improvements Alex Williamson
2012-03-07 0:13 ` [Qemu-devel] [PATCH 1/6] acpi_piix4: Disallow write to up/down PCI hotplug registers Alex Williamson
2012-03-07 0:14 ` [Qemu-devel] [PATCH 2/6] acpi_piix4: Only allow writes to PCI hotplug eject register Alex Williamson
2012-03-07 0:14 ` Alex Williamson [this message]
2012-03-07 9:19 ` [Qemu-devel] [PATCH 3/6] pci: Add notifier for device probing Paolo Bonzini
2012-03-07 20:12 ` Alex Williamson
2012-03-07 0:14 ` [Qemu-devel] [PATCH 4/6] acpi_piix4: Track PCI hotplug status and allow non-ACPI remove path Alex Williamson
2012-03-11 21:57 ` Michael S. Tsirkin
2012-03-07 0:15 ` [Qemu-devel] [PATCH 5/6] acpi_piix4: Use pci_get/set_byte Alex Williamson
2012-03-07 0:15 ` [Qemu-devel] [PATCH 6/6] api_piix4: Remove PCI_RMV_BASE write code Alex Williamson
2012-03-07 12:43 ` [Qemu-devel] [PATCH 0/6] PCI hotplug improvements Gleb Natapov
2012-03-07 17:20 ` Alex Williamson
2012-03-07 18:59 ` Gleb Natapov
2012-03-07 19:51 ` Alex Williamson
2012-03-07 21:00 ` Gleb Natapov
2012-03-07 21:44 ` Alex Williamson
2012-03-07 22:17 ` Gleb Natapov
2012-03-07 22:46 ` Alex Williamson
2012-03-08 12:39 ` Gleb Natapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120307001419.3079.96413.stgit@bling.home \
--to=alex.williamson@redhat.com \
--cc=ddutile@redhat.com \
--cc=gleb@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).