xen_pt: Present the size of 64 bit BARs correctly
authorRoss Lagerwall <ross.lagerwall@citrix.com>
Mon, 14 May 2018 09:57:46 +0000 (10:57 +0100)
committerStefano Stabellini <sstabellini@kernel.org>
Fri, 18 May 2018 18:03:19 +0000 (11:03 -0700)
The full size of the BAR is stored in the lower PCIIORegion.size. The
upper PCIIORegion.size is 0.  Calculate the size of the upper half
correctly from the lower half otherwise the size read by the guest will
be incorrect.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
hw/xen/xen_pt_config_init.c

index a3ce33e78b569fc3f4224c2c4cdb957f87645c23..aee31c62bb99a9e13a8bddff49ea4f0f0e94b015 100644 (file)
@@ -504,6 +504,8 @@ static int xen_pt_bar_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
         bar_ro_mask = XEN_PT_BAR_IO_RO_MASK | (r_size - 1);
         break;
     case XEN_PT_BAR_FLAG_UPPER:
+        assert(index > 0);
+        r_size = d->io_regions[index - 1].size >> 32;
         bar_emu_mask = XEN_PT_BAR_ALLF;
         bar_ro_mask = r_size ? r_size - 1 : 0;
         break;