@@ -1346,12 +1346,13 @@ init_pci(struct vmctx *ctx)
1346
1346
1347
1347
/*
1348
1348
* 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
1355
1356
*/
1356
1357
1357
1358
/*
@@ -1360,14 +1361,24 @@ init_pci(struct vmctx *ctx)
1360
1361
*/
1361
1362
lowmem = vm_get_lowmem_size (ctx );
1362
1363
bzero (& mr , sizeof (struct mem_range ));
1363
- mr .name = "PCI hole" ;
1364
+ mr .name = "PCI hole (32-bit) " ;
1364
1365
mr .flags = MEM_F_RW ;
1365
1366
mr .base = lowmem ;
1366
1367
mr .size = (4ULL * 1024 * 1024 * 1024 ) - lowmem ;
1367
1368
mr .handler = pci_emul_fallback_handler ;
1368
1369
error = register_mem_fallback (& mr );
1369
1370
assert (error == 0 );
1370
1371
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
+
1371
1382
/* PCI extended config space */
1372
1383
bzero (& mr , sizeof (struct mem_range ));
1373
1384
mr .name = "PCI ECFG" ;
@@ -1425,11 +1436,18 @@ deinit_pci(struct vmctx *ctx)
1425
1436
/* Release PCI hole space */
1426
1437
lowmem = vm_get_lowmem_size (ctx );
1427
1438
bzero (& mr , sizeof (struct mem_range ));
1428
- mr .name = "PCI hole" ;
1439
+ mr .name = "PCI hole (32-bit) " ;
1429
1440
mr .base = lowmem ;
1430
1441
mr .size = (4ULL * 1024 * 1024 * 1024 ) - lowmem ;
1431
1442
unregister_mem_fallback (& mr );
1432
1443
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
+
1433
1451
for (bus = 0 ; bus < MAXBUSES ; bus ++ ) {
1434
1452
bi = pci_businfo [bus ];
1435
1453
if (bi == NULL )
0 commit comments