# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 4f6d858ea570435f75527fa7f62a02e642ffbb69
# Parent 4c97599398feb164ec25e21b6581c296ea85b719
[PCI] Per-device permissive flag (replaces global permissive flag).
Signed-off-by: Chris Bookholt <hap10@xxxxxxxxxxxxxx>
---
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c | 5 -
linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c | 68 ++++++++++++++++++
linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h | 1
3 files changed, 70 insertions(+), 4 deletions(-)
diff -r 4c97599398fe -r 4f6d858ea570
linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c Fri Jul 28
12:54:58 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/conf_space.c Fri Jul 28
12:56:10 2006 +0100
@@ -14,9 +14,6 @@
#include "pciback.h"
#include "conf_space.h"
#include "conf_space_quirks.h"
-
-static int permissive = 0;
-module_param(permissive, bool, 0644);
#define DEFINE_PCI_CONFIG(op,size,type) \
int pciback_##op##_config_##size \
@@ -258,7 +255,7 @@ int pciback_config_write(struct pci_dev
* This means that some fields may still be read-only because
* they have entries in the config_field list that intercept
* the write and do nothing. */
- if (permissive) {
+ if (dev_data->permissive) {
switch (size) {
case 1:
err = pci_write_config_byte(dev, offset,
diff -r 4c97599398fe -r 4f6d858ea570
linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c Fri Jul 28
12:54:58 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c Fri Jul 28
12:56:10 2006 +0100
@@ -739,6 +739,72 @@ static ssize_t pcistub_quirk_show(struct
DRIVER_ATTR(quirks, S_IRUSR | S_IWUSR, pcistub_quirk_show, pcistub_quirk_add);
+static ssize_t permissive_add(struct device_driver *drv, const char *buf,
+ size_t count)
+{
+ int domain, bus, slot, func;
+ int err;
+ struct pcistub_device *psdev;
+ struct pciback_dev_data *dev_data;
+ err = str_to_slot(buf, &domain, &bus, &slot, &func);
+ if (err)
+ goto out;
+ psdev = pcistub_device_find(domain, bus, slot, func);
+ if (!psdev) {
+ err = -ENODEV;
+ goto out;
+ }
+ if (!psdev->dev) {
+ err = -ENODEV;
+ goto release;
+ }
+ dev_data = pci_get_drvdata(psdev->dev);
+ /* the driver data for a device should never be null at this point */
+ if (!dev_data) {
+ err = -ENXIO;
+ goto release;
+ }
+ if (!dev_data->permissive) {
+ dev_data->permissive = 1;
+ /* Let user know that what they're doing could be unsafe */
+ dev_warn(&psdev->dev->dev,
+ "enabling permissive mode configuration space
accesses!\n");
+ dev_warn(&psdev->dev->dev,
+ "permissive mode is potentially unsafe!\n");
+ }
+ release:
+ pcistub_device_put(psdev);
+ out:
+ if (!err)
+ err = count;
+ return err;
+}
+
+static ssize_t permissive_show(struct device_driver *drv, char *buf)
+{
+ struct pcistub_device *psdev;
+ struct pciback_dev_data *dev_data;
+ size_t count = 0;
+ unsigned long flags;
+ spin_lock_irqsave(&pcistub_devices_lock, flags);
+ list_for_each_entry(psdev, &pcistub_devices, dev_list) {
+ if (count >= PAGE_SIZE)
+ break;
+ if (!psdev->dev)
+ continue;
+ dev_data = pci_get_drvdata(psdev->dev);
+ if (!dev_data || !dev_data->permissive)
+ continue;
+ count +=
+ scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
+ pci_name(psdev->dev));
+ }
+ spin_unlock_irqrestore(&pcistub_devices_lock, flags);
+ return count;
+}
+
+DRIVER_ATTR(permissive, S_IRUSR | S_IWUSR, permissive_show, permissive_add);
+
static int __init pcistub_init(void)
{
int pos = 0;
@@ -784,6 +850,7 @@ static int __init pcistub_init(void)
&driver_attr_remove_slot);
driver_create_file(&pciback_pci_driver.driver, &driver_attr_slots);
driver_create_file(&pciback_pci_driver.driver, &driver_attr_quirks);
+ driver_create_file(&pciback_pci_driver.driver, &driver_attr_permissive);
out:
return err;
@@ -834,6 +901,7 @@ static void __exit pciback_cleanup(void)
&driver_attr_remove_slot);
driver_remove_file(&pciback_pci_driver.driver, &driver_attr_slots);
driver_remove_file(&pciback_pci_driver.driver, &driver_attr_quirks);
+ driver_remove_file(&pciback_pci_driver.driver, &driver_attr_permissive);
pci_unregister_driver(&pciback_pci_driver);
}
diff -r 4c97599398fe -r 4f6d858ea570
linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h Fri Jul 28
12:54:58 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h Fri Jul 28
12:56:10 2006 +0100
@@ -44,6 +44,7 @@ struct pciback_device {
struct pciback_dev_data {
struct list_head config_fields;
+ int permissive;
int warned_on_write;
};
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|