Skip to content

Commit d648df7

Browse files
Liu Shuo Awenlingz
authored andcommitted
dm: register_bar/unregister_bar when bar enable/disable
Sometimes guest OS writes PCIR_COMMAND register to disable the device, then update the bar address followed by a write to PCIR_COMMAND register to enable the device again. In this case unregister_bar/register_bar should be called otherwise the IO/MMIO regions monitored by device model will not be updated accordingly. Tracked-On: #2962 Signed-off-by: Yu Wang <yu1.wang@intel.com> Signed-off-by: Jian Jun Chen <jian.jun.chen@intel.com> Signed-off-by: Liu Shuo A <shuo.a.liu@intel.com> Acked-by: Yin Fengwei <fengwei.yin@intel.com>
1 parent b838e9b commit d648df7

File tree

1 file changed

+5
-65
lines changed

1 file changed

+5
-65
lines changed

devicemodel/hw/pci/core.c

Lines changed: 5 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -541,66 +541,6 @@ register_bar(struct pci_vdev *dev, int idx)
541541
modify_bar_registration(dev, idx, 1);
542542
}
543543

544-
static void
545-
enable_bar(struct pci_vdev *dev, int idx)
546-
{
547-
int error = 0;
548-
struct inout_port iop;
549-
struct mem_range mr;
550-
551-
switch (dev->bar[idx].type) {
552-
case PCIBAR_IO:
553-
bzero(&iop, sizeof(struct inout_port));
554-
iop.name = dev->name;
555-
iop.port = dev->bar[idx].addr;
556-
iop.size = dev->bar[idx].size;
557-
error = enable_inout(&iop);
558-
break;
559-
case PCIBAR_MEM32:
560-
case PCIBAR_MEM64:
561-
bzero(&mr, sizeof(struct mem_range));
562-
mr.name = dev->name;
563-
mr.base = dev->bar[idx].addr;
564-
mr.size = dev->bar[idx].size;
565-
error = enable_mem(&mr);
566-
break;
567-
default:
568-
error = EINVAL;
569-
break;
570-
}
571-
assert(error == 0);
572-
}
573-
574-
static void
575-
disable_bar(struct pci_vdev *dev, int idx)
576-
{
577-
int error = 0;
578-
struct inout_port iop;
579-
struct mem_range mr;
580-
581-
switch (dev->bar[idx].type) {
582-
case PCIBAR_IO:
583-
bzero(&iop, sizeof(struct inout_port));
584-
iop.name = dev->name;
585-
iop.port = dev->bar[idx].addr;
586-
iop.size = dev->bar[idx].size;
587-
error = disable_inout(&iop);
588-
break;
589-
case PCIBAR_MEM32:
590-
case PCIBAR_MEM64:
591-
bzero(&mr, sizeof(struct mem_range));
592-
mr.name = dev->name;
593-
mr.base = dev->bar[idx].addr;
594-
mr.size = dev->bar[idx].size;
595-
error = disable_mem(&mr);
596-
break;
597-
default:
598-
error = EINVAL;
599-
break;
600-
}
601-
assert(error == 0);
602-
}
603-
604544
/* Are we decoding i/o port accesses for the emulated pci device? */
605545
static int
606546
porten(struct pci_vdev *dev)
@@ -2023,20 +1963,20 @@ pci_emul_cmdsts_write(struct pci_vdev *dev, int coff, uint32_t new, int bytes)
20231963
/* I/O address space decoding changed? */
20241964
if (changed & PCIM_CMD_PORTEN) {
20251965
if (porten(dev))
2026-
enable_bar(dev, i);
1966+
register_bar(dev, i);
20271967
else
2028-
disable_bar(dev, i);
1968+
unregister_bar(dev, i);
20291969
}
20301970
break;
20311971
case PCIBAR_MEM32:
20321972
case PCIBAR_MEM64:
20331973
/* MMIO address space decoding changed? */
20341974
if (changed & PCIM_CMD_MEMEN) {
20351975
if (memen(dev))
2036-
enable_bar(dev, i);
1976+
register_bar(dev, i);
20371977
else
2038-
disable_bar(dev, i);
2039-
}
1978+
unregister_bar(dev, i);
1979+
}
20401980
break;
20411981
default:
20421982
assert(0);

0 commit comments

Comments
 (0)