Skip to content

Commit 8c28ef3

Browse files
jbeulichbostrovs
authored andcommitted
xen-pciback: relax BAR sizing write value check
Just like done in d2bd05d ("xen-pciback: return proper values during BAR sizing") for the ROM BAR, ordinary ones also shouldn't compare the written value directly against ~0, but consider the r/o bits at the bottom (if any). Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Juergen Gross <jgross@suse.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
1 parent 51a9a82 commit 8c28ef3

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

drivers/xen/xen-pciback/conf_space_header.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data)
169169
static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
170170
{
171171
struct pci_bar_info *bar = data;
172+
unsigned int pos = (offset - PCI_BASE_ADDRESS_0) / 4;
173+
const struct resource *res = dev->resource;
174+
u32 mask;
172175

173176
if (unlikely(!bar)) {
174177
pr_warn(DRV_NAME ": driver data not found for %s\n",
@@ -179,7 +182,13 @@ static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
179182
/* A write to obtain the length must happen as a 32-bit write.
180183
* This does not (yet) support writing individual bytes
181184
*/
182-
if (value == ~0)
185+
if (res[pos].flags & IORESOURCE_IO)
186+
mask = ~PCI_BASE_ADDRESS_IO_MASK;
187+
else if (pos && (res[pos - 1].flags & IORESOURCE_MEM_64))
188+
mask = 0;
189+
else
190+
mask = ~PCI_BASE_ADDRESS_MEM_MASK;
191+
if ((value | mask) == ~0U)
183192
bar->which = 1;
184193
else {
185194
u32 tmpval;

0 commit comments

Comments
 (0)