Skip to content

Commit 263b486

Browse files
peterfangwenlingz
authored andcommitted
dm: pci: add MMIO fallback handler for 64-bit PCI hole
Add the PCI MMIO fallback handler to the 64-bit PCI host aperture, so that the guest won't inadvertently crash acrn-dm due to unhandled MMIO. Tracked-On: #2792 Signed-off-by: Peter Fang <peter.fang@intel.com> Reviewed-by: Eddie Dong <eddie.dong@intel.com> Acked-by: Yin Fengwei <fengwei.yin@intel.com>
1 parent 82e42cf commit 263b486

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

devicemodel/hw/pci/core.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,12 +1346,13 @@ init_pci(struct vmctx *ctx)
13461346

13471347
/*
13481348
* The guest physical memory map looks like the following:
1349-
* [0, lowmem) guest system memory
1350-
* [lowmem, lowmem_limit) memory hole (may be absent)
1351-
* [lowmem_limit, 0xE0000000) PCI hole (32-bit BAR allocation)
1352-
* [0xE0000000, 0xF0000000) PCI extended config window
1353-
* [0xF0000000, 4GB) LAPIC, IOAPIC, HPET, firmware
1354-
* [4GB, 4GB + highmem)
1349+
* [0, lowmem) guest system memory
1350+
* [lowmem, lowmem_limit) memory hole (may be absent)
1351+
* [lowmem_limit, 0xE0000000) PCI hole (32-bit BAR allocation)
1352+
* [0xE0000000, 0xF0000000) PCI extended config window
1353+
* [0xF0000000, 4GB) LAPIC, IOAPIC, HPET, firmware
1354+
* [4GB, 5GB) PCI hole (64-bit BAR allocation)
1355+
* [5GB, 5GB + highmem) guest system memory
13551356
*/
13561357

13571358
/*
@@ -1360,14 +1361,24 @@ init_pci(struct vmctx *ctx)
13601361
*/
13611362
lowmem = vm_get_lowmem_size(ctx);
13621363
bzero(&mr, sizeof(struct mem_range));
1363-
mr.name = "PCI hole";
1364+
mr.name = "PCI hole (32-bit)";
13641365
mr.flags = MEM_F_RW;
13651366
mr.base = lowmem;
13661367
mr.size = (4ULL * 1024 * 1024 * 1024) - lowmem;
13671368
mr.handler = pci_emul_fallback_handler;
13681369
error = register_mem_fallback(&mr);
13691370
assert(error == 0);
13701371

1372+
/* ditto for the 64-bit PCI host aperture */
1373+
bzero(&mr, sizeof(struct mem_range));
1374+
mr.name = "PCI hole (64-bit)";
1375+
mr.flags = MEM_F_RW;
1376+
mr.base = PCI_EMUL_MEMBASE64;
1377+
mr.size = PCI_EMUL_MEMLIMIT64 - PCI_EMUL_MEMBASE64;
1378+
mr.handler = pci_emul_fallback_handler;
1379+
error = register_mem_fallback(&mr);
1380+
assert(error == 0);
1381+
13711382
/* PCI extended config space */
13721383
bzero(&mr, sizeof(struct mem_range));
13731384
mr.name = "PCI ECFG";
@@ -1425,11 +1436,18 @@ deinit_pci(struct vmctx *ctx)
14251436
/* Release PCI hole space */
14261437
lowmem = vm_get_lowmem_size(ctx);
14271438
bzero(&mr, sizeof(struct mem_range));
1428-
mr.name = "PCI hole";
1439+
mr.name = "PCI hole (32-bit)";
14291440
mr.base = lowmem;
14301441
mr.size = (4ULL * 1024 * 1024 * 1024) - lowmem;
14311442
unregister_mem_fallback(&mr);
14321443

1444+
/* ditto for the 64-bit PCI host aperture */
1445+
bzero(&mr, sizeof(struct mem_range));
1446+
mr.name = "PCI hole (64-bit)";
1447+
mr.base = PCI_EMUL_MEMBASE64;
1448+
mr.size = PCI_EMUL_MEMLIMIT64 - PCI_EMUL_MEMBASE64;
1449+
unregister_mem_fallback(&mr);
1450+
14331451
for (bus = 0; bus < MAXBUSES; bus++) {
14341452
bi = pci_businfo[bus];
14351453
if (bi == NULL)

0 commit comments

Comments
 (0)