x86/physdev: enable PHYSDEVOP_pci_mmcfg_reserved for PVH Dom0

So that MMCFG regions not present in the MCFG ACPI table can be added
at run time by the hardware domain.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
This commit is contained in:
Roger Pau Monne authored and Jan Beulich committed 2018-03-23 10:18:40 +01:00
1 parent be52cb139f
commit eb3dd90e40
3 files changed
+27 -5

No files matched your search

+5
View File
@@ -89,6 +89,11 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
if ( !has_pirq(curr->domain) )
return -ENOSYS;
break;
case PHYSDEVOP_pci_mmcfg_reserved:
if ( !has_vpci(curr->domain) )
return -ENOSYS;
break;
}
if ( !curr->hcall_compat )
+11 -5
View File
@@ -507,10 +507,9 @@ static const struct hvm_mmio_ops vpci_mmcfg_ops = {
.write = vpci_mmcfg_write,
};
int __hwdom_init register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
unsigned int start_bus,
unsigned int end_bus,
unsigned int seg)
int register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
unsigned int start_bus, unsigned int end_bus,
unsigned int seg)
{
struct hvm_mmcfg *mmcfg, *new = xmalloc(struct hvm_mmcfg);
@@ -535,9 +534,16 @@ int __hwdom_init register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
if ( new->addr < mmcfg->addr + mmcfg->size &&
mmcfg->addr < new->addr + new->size )
{
int ret = -EEXIST;
if ( new->addr == mmcfg->addr &&
new->start_bus == mmcfg->start_bus &&
new->segment == mmcfg->segment &&
new->size == mmcfg->size )
ret = 0;
write_unlock(&d->arch.hvm_domain.mmcfg_lock);
xfree(new);
return -EEXIST;
return ret;
}
if ( list_empty(&d->arch.hvm_domain.mmcfg_regions) )
+11
View File
@@ -557,6 +557,17 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
ret = pci_mmcfg_reserved(info.address, info.segment,
info.start_bus, info.end_bus, info.flags);
if ( !ret && has_vpci(currd) )
{
/*
* For HVM (PVH) domains try to add the newly found MMCFG to the
* domain.
*/
ret = register_vpci_mmcfg_handler(currd, info.address,
info.start_bus, info.end_bus,
info.segment);
}
break;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.