From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= Subject: Re: [V10 PATCH 1/4] pvh dom0: construct_dom0 changes Date: Tue, 6 May 2014 17:18:44 +0200 Message-ID: <5368FD54.4040809@citrix.com> References: <1398820008-9005-1-git-send-email-mukesh.rathor@oracle.com> <1398820008-9005-2-git-send-email-mukesh.rathor@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Whh9I-0003L2-C2 for xen-devel@lists.xenproject.org; Tue, 06 May 2014 15:19:16 +0000 In-Reply-To: <1398820008-9005-2-git-send-email-mukesh.rathor@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Mukesh Rathor , xen-devel@lists.xenproject.org Cc: George.Dunlap@eu.citrix.com, keir.xen@gmail.com, tim@xen.org, JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org On 30/04/14 03:06, Mukesh Rathor wrote: > This patch changes construct_dom0() to boot in pvh mode: > - Make sure dom0 elf supports pvh mode. > - Call guest_physmap_add_page for pvh rather than simple p2m setting > - Map all non-RAM regions 1:1 upto the end region in e820 or 4GB which > ever is higher. > - Allocate p2m, copying calculation from toolstack. > - Allocate shared info page from the virtual space so that dom0 PT > can be updated. Then update p2m for it with the actual mfn. > - Since we build the page tables for pvh same as for pv, in > pvh_fixup_page_tables_for_hap we replace the mfns with pfns. > > Signed-off-by: Mukesh Rathor > Reviewed-by: Jan Beulich I have the following patch on top of yours, in order to add the memory removed by the holes to the end of the memory map: --- diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 38ed9f6..6f5ba22 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -327,11 +327,13 @@ static __init void pvh_add_mem_mapping(struct domain *d, unsigned long gfn, * pvh fixme: The following doesn't map MMIO ranges when they sit above the * highest E820 covered address. */ -static __init void pvh_map_all_iomem(struct domain *d) +static __init void pvh_map_all_iomem(struct domain *d, unsigned long nr_pages) { unsigned long start_pfn, end_pfn, end = 0, start = 0; const struct e820entry *entry; - unsigned int i, nump; + unsigned int i, j, nump, navail, nmap, nr_holes = 0; + struct page_info *page; + int rc; for ( i = 0, entry = e820.map; i < e820.nr_map; i++, entry++ ) { @@ -353,6 +355,9 @@ static __init void pvh_map_all_iomem(struct domain *d) nump = end_pfn - start_pfn; /* Add pages to the mapping */ pvh_add_mem_mapping(d, start_pfn, start_pfn, nump); + if (start_pfn <= nr_pages) + nr_holes += (end_pfn < nr_pages) ? + nump : (nr_pages - start_pfn); } start = end; } @@ -369,6 +374,42 @@ static __init void pvh_map_all_iomem(struct domain *d) nump = end_pfn - start_pfn; pvh_add_mem_mapping(d, start_pfn, start_pfn, nump); } + + /* + * Add the memory removed by the holes at the end of the + * memory map. + */ + for ( i = 0, entry = e820.map; i < e820.nr_map; i++, entry++ ) + { + if ( entry->type != E820_RAM ) + continue; + + end_pfn = PFN_UP(entry->addr + entry->size); + if ( end_pfn <= nr_pages ) + continue; + + navail = end_pfn - nr_pages; + nmap = navail > nr_holes ? nr_holes : navail; + start_pfn = PFN_DOWN(entry->addr) < nr_pages ? + nr_pages : PFN_DOWN(entry->addr); + page = alloc_domheap_pages(d, get_order_from_pages(nmap), 0); + if ( !page ) + panic("Not enough RAM for domain 0"); + for ( j = 0; j < nmap; j++ ) + { + rc = guest_physmap_add_page(d, start_pfn + j, page_to_mfn(page), 0); + if (rc != 0) + panic("Unable to add gpfn %#lx mfn %#lx to Dom0 physmap", + start_pfn + j, page_to_mfn(page)); + page++; + + } + nr_holes -= nmap; + if (nr_holes == 0) + break; + } + + ASSERT(nr_holes == 0); } static __init void dom0_update_physmap(struct domain *d, unsigned long pfn, @@ -1391,7 +1432,7 @@ int __init construct_dom0( pfn = shared_info_paddr >> PAGE_SHIFT; dom0_update_physmap(d, pfn, mfn, 0); - pvh_map_all_iomem(d); + pvh_map_all_iomem(d, nr_pages); } if ( d->domain_id == hardware_domid )