diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c index 29ec011..fb451ef 100644 --- a/tools/firmware/hvmloader/pci.c +++ b/tools/firmware/hvmloader/pci.c @@ -185,17 +185,25 @@ void pci_setup(void) ((pci_mem_start << 1) != 0) ) pci_mem_start <<= 1; - while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend ) + if ((pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend) { struct xen_add_to_physmap xatp; - if ( hvm_info->high_mem_pgend == 0 ) - hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT); + unsigned int size = hvm_info->low_mem_pgend - (pci_mem_start >> PAGE_SHIFT); xatp.domid = DOMID_SELF; - xatp.space = XENMAPSPACE_gmfn; - xatp.idx = --hvm_info->low_mem_pgend; - xatp.gpfn = hvm_info->high_mem_pgend++; + xatp.space = XENMAPSPACE_gmfn_range; + xatp.size = size; + xatp.idx = (pci_mem_start >> PAGE_SHIFT); + xatp.gpfn = hvm_info->high_mem_pgend; + + printf("Relocate page for pci hole:\n"); if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 ) BUG(); + printf(" - low_mem_pgend: %x -> %lx\n" + " - high_mem_pgend: %x -> %x\n", + hvm_info->low_mem_pgend, (pci_mem_start >> PAGE_SHIFT), + hvm_info->high_mem_pgend, hvm_info->high_mem_pgend + size); + hvm_info->low_mem_pgend = pci_mem_start >> PAGE_SHIFT; + hvm_info->high_mem_pgend += size; } mem_resource.base = pci_mem_start;