Commit 059833eb authored by David S. Miller's avatar David S. Miller

[SPARC64]: Range check bus number in SUN4V PCI controller driver.

It has to be somewhere in the range from pbm->pci_first_busno to
pbm->pci_last_busno, inclusive.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0b522497
...@@ -514,19 +514,31 @@ struct pci_iommu_ops pci_sun4v_iommu_ops = { ...@@ -514,19 +514,31 @@ struct pci_iommu_ops pci_sun4v_iommu_ops = {
/* SUN4V PCI configuration space accessors. */ /* SUN4V PCI configuration space accessors. */
static inline int pci_sun4v_out_of_range(struct pci_pbm_info *pbm, unsigned int bus)
{
if (bus < pbm->pci_first_busno ||
bus > pbm->pci_last_busno)
return 1;
return 0;
}
static int pci_sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, static int pci_sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
int where, int size, u32 *value) int where, int size, u32 *value)
{ {
struct pci_pbm_info *pbm = bus_dev->sysdata; struct pci_pbm_info *pbm = bus_dev->sysdata;
unsigned long devhandle = pbm->devhandle; u32 devhandle = pbm->devhandle;
unsigned int bus = bus_dev->number; unsigned int bus = bus_dev->number;
unsigned int device = PCI_SLOT(devfn); unsigned int device = PCI_SLOT(devfn);
unsigned int func = PCI_FUNC(devfn); unsigned int func = PCI_FUNC(devfn);
unsigned long ret; unsigned long ret;
ret = pci_sun4v_config_get(devhandle, if (pci_sun4v_out_of_range(pbm, bus)) {
HV_PCI_DEVICE_BUILD(bus, device, func), ret = ~0UL;
where, size); } else {
ret = pci_sun4v_config_get(devhandle,
HV_PCI_DEVICE_BUILD(bus, device, func),
where, size);
}
switch (size) { switch (size) {
case 1: case 1:
*value = ret & 0xff; *value = ret & 0xff;
...@@ -547,16 +559,19 @@ static int pci_sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, ...@@ -547,16 +559,19 @@ static int pci_sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
int where, int size, u32 value) int where, int size, u32 value)
{ {
struct pci_pbm_info *pbm = bus_dev->sysdata; struct pci_pbm_info *pbm = bus_dev->sysdata;
unsigned long devhandle = pbm->devhandle; u32 devhandle = pbm->devhandle;
unsigned int bus = bus_dev->number; unsigned int bus = bus_dev->number;
unsigned int device = PCI_SLOT(devfn); unsigned int device = PCI_SLOT(devfn);
unsigned int func = PCI_FUNC(devfn); unsigned int func = PCI_FUNC(devfn);
unsigned long ret; unsigned long ret;
ret = pci_sun4v_config_put(devhandle, if (pci_sun4v_out_of_range(pbm, bus)) {
HV_PCI_DEVICE_BUILD(bus, device, func), /* Do nothing. */
where, size, value); } else {
ret = pci_sun4v_config_put(devhandle,
HV_PCI_DEVICE_BUILD(bus, device, func),
where, size, value);
}
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment