[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [PCI] Per-device permissive flag (replaces global permissive flag).
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |