passthrough.c (494ef20db6ea2e2ab1c3a45a1461e6e717fdcf48) | passthrough.c (a92336a1176b2119eaa990a1e8bf3109665fdbc6) |
---|---|
1/* 2 * PCI Backend - Provides restricted access to the real PCI bus topology 3 * to the frontend 4 * 5 * Author: Ryan Wilson <hap9@epoch.ncsc.mil> 6 */ 7 8#include <linux/list.h> 9#include <linux/pci.h> 10#include <linux/spinlock.h> 11#include "pciback.h" 12 13struct passthrough_dev_data { 14 /* Access to dev_list must be protected by lock */ 15 struct list_head dev_list; 16 spinlock_t lock; 17}; 18 | 1/* 2 * PCI Backend - Provides restricted access to the real PCI bus topology 3 * to the frontend 4 * 5 * Author: Ryan Wilson <hap9@epoch.ncsc.mil> 6 */ 7 8#include <linux/list.h> 9#include <linux/pci.h> 10#include <linux/spinlock.h> 11#include "pciback.h" 12 13struct passthrough_dev_data { 14 /* Access to dev_list must be protected by lock */ 15 struct list_head dev_list; 16 spinlock_t lock; 17}; 18 |
19struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev, 20 unsigned int domain, unsigned int bus, 21 unsigned int devfn) | 19struct pci_dev *xen_pcibk_get_pci_dev(struct xen_pcibk_device *pdev, 20 unsigned int domain, unsigned int bus, 21 unsigned int devfn) |
22{ 23 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 24 struct pci_dev_entry *dev_entry; 25 struct pci_dev *dev = NULL; 26 unsigned long flags; 27 28 spin_lock_irqsave(&dev_data->lock, flags); 29 --- 6 unchanged lines hidden (view full) --- 36 } 37 } 38 39 spin_unlock_irqrestore(&dev_data->lock, flags); 40 41 return dev; 42} 43 | 22{ 23 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 24 struct pci_dev_entry *dev_entry; 25 struct pci_dev *dev = NULL; 26 unsigned long flags; 27 28 spin_lock_irqsave(&dev_data->lock, flags); 29 --- 6 unchanged lines hidden (view full) --- 36 } 37 } 38 39 spin_unlock_irqrestore(&dev_data->lock, flags); 40 41 return dev; 42} 43 |
44int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev, 45 int devid, publish_pci_dev_cb publish_cb) | 44int xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev, struct pci_dev *dev, 45 int devid, publish_pci_dev_cb publish_cb) |
46{ 47 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 48 struct pci_dev_entry *dev_entry; 49 unsigned long flags; 50 unsigned int domain, bus, devfn; 51 int err; 52 53 dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL); --- 9 unchanged lines hidden (view full) --- 63 domain = (unsigned int)pci_domain_nr(dev->bus); 64 bus = (unsigned int)dev->bus->number; 65 devfn = dev->devfn; 66 err = publish_cb(pdev, domain, bus, devfn, devid); 67 68 return err; 69} 70 | 46{ 47 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 48 struct pci_dev_entry *dev_entry; 49 unsigned long flags; 50 unsigned int domain, bus, devfn; 51 int err; 52 53 dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL); --- 9 unchanged lines hidden (view full) --- 63 domain = (unsigned int)pci_domain_nr(dev->bus); 64 bus = (unsigned int)dev->bus->number; 65 devfn = dev->devfn; 66 err = publish_cb(pdev, domain, bus, devfn, devid); 67 68 return err; 69} 70 |
71void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev) | 71void xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev, 72 struct pci_dev *dev) |
72{ 73 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 74 struct pci_dev_entry *dev_entry, *t; 75 struct pci_dev *found_dev = NULL; 76 unsigned long flags; 77 78 spin_lock_irqsave(&dev_data->lock, flags); 79 --- 6 unchanged lines hidden (view full) --- 86 } 87 88 spin_unlock_irqrestore(&dev_data->lock, flags); 89 90 if (found_dev) 91 pcistub_put_pci_dev(found_dev); 92} 93 | 73{ 74 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 75 struct pci_dev_entry *dev_entry, *t; 76 struct pci_dev *found_dev = NULL; 77 unsigned long flags; 78 79 spin_lock_irqsave(&dev_data->lock, flags); 80 --- 6 unchanged lines hidden (view full) --- 87 } 88 89 spin_unlock_irqrestore(&dev_data->lock, flags); 90 91 if (found_dev) 92 pcistub_put_pci_dev(found_dev); 93} 94 |
94int pciback_init_devices(struct pciback_device *pdev) | 95int xen_pcibk_init_devices(struct xen_pcibk_device *pdev) |
95{ 96 struct passthrough_dev_data *dev_data; 97 98 dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL); 99 if (!dev_data) 100 return -ENOMEM; 101 102 spin_lock_init(&dev_data->lock); 103 104 INIT_LIST_HEAD(&dev_data->dev_list); 105 106 pdev->pci_dev_data = dev_data; 107 108 return 0; 109} 110 | 96{ 97 struct passthrough_dev_data *dev_data; 98 99 dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL); 100 if (!dev_data) 101 return -ENOMEM; 102 103 spin_lock_init(&dev_data->lock); 104 105 INIT_LIST_HEAD(&dev_data->dev_list); 106 107 pdev->pci_dev_data = dev_data; 108 109 return 0; 110} 111 |
111int pciback_publish_pci_roots(struct pciback_device *pdev, 112 publish_pci_root_cb publish_root_cb) | 112int xen_pcibk_publish_pci_roots(struct xen_pcibk_device *pdev, 113 publish_pci_root_cb publish_root_cb) |
113{ 114 int err = 0; 115 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 116 struct pci_dev_entry *dev_entry, *e, *tmp; 117 struct pci_dev *dev; 118 int found; 119 unsigned int domain, bus; 120 --- 27 unchanged lines hidden (view full) --- 148 } 149 150 if (!err) 151 spin_unlock(&dev_data->lock); 152 153 return err; 154} 155 | 114{ 115 int err = 0; 116 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 117 struct pci_dev_entry *dev_entry, *e, *tmp; 118 struct pci_dev *dev; 119 int found; 120 unsigned int domain, bus; 121 --- 27 unchanged lines hidden (view full) --- 149 } 150 151 if (!err) 152 spin_unlock(&dev_data->lock); 153 154 return err; 155} 156 |
156void pciback_release_devices(struct pciback_device *pdev) | 157void xen_pcibk_release_devices(struct xen_pcibk_device *pdev) |
157{ 158 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 159 struct pci_dev_entry *dev_entry, *t; 160 161 list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) { 162 list_del(&dev_entry->list); 163 pcistub_put_pci_dev(dev_entry->dev); 164 kfree(dev_entry); 165 } 166 167 kfree(dev_data); 168 pdev->pci_dev_data = NULL; 169} 170 | 158{ 159 struct passthrough_dev_data *dev_data = pdev->pci_dev_data; 160 struct pci_dev_entry *dev_entry, *t; 161 162 list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) { 163 list_del(&dev_entry->list); 164 pcistub_put_pci_dev(dev_entry->dev); 165 kfree(dev_entry); 166 } 167 168 kfree(dev_data); 169 pdev->pci_dev_data = NULL; 170} 171 |
171int pciback_get_pcifront_dev(struct pci_dev *pcidev, 172 struct pciback_device *pdev, 173 unsigned int *domain, unsigned int *bus, 174 unsigned int *devfn) 175 | 172int xen_pcibk_get_pcifront_dev(struct pci_dev *pcidev, 173 struct xen_pcibk_device *pdev, 174 unsigned int *domain, unsigned int *bus, 175 unsigned int *devfn) |
176{ 177 *domain = pci_domain_nr(pcidev->bus); 178 *bus = pcidev->bus->number; 179 *devfn = pcidev->devfn; 180 return 1; 181} | 176{ 177 *domain = pci_domain_nr(pcidev->bus); 178 *bus = pcidev->bus->number; 179 *devfn = pcidev->devfn; 180 return 1; 181} |