|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 07/22] x86/pv: domheap pages should be mapped while relocating initrd
From: Wei Liu <wei.liu2@xxxxxxxxxx>
Xen shouldn't use domheap page as if they were xenheap pages. Map and
unmap pages accordingly.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
Signed-off-by: Wei Wang <wawei@xxxxxxxxx>
Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
----
Changes since Hongyan's version:
* Add missing newline after the variable declaration
---
xen/arch/x86/pv/dom0_build.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index a62f0fa2ef29..c837b2d96f89 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -611,18 +611,32 @@ int __init dom0_construct_pv(struct domain *d,
if ( d->arch.physaddr_bitsize &&
((mfn + count - 1) >> (d->arch.physaddr_bitsize - PAGE_SHIFT)) )
{
+ unsigned long nr_pages;
+ unsigned long len = initrd_len;
+
order = get_order_from_pages(count);
page = alloc_domheap_pages(d, order, MEMF_no_scrub);
if ( !page )
panic("Not enough RAM for domain 0 initrd\n");
+
+ nr_pages = 1UL << order;
for ( count = -count; order--; )
if ( count & (1UL << order) )
{
free_domheap_pages(page, order);
page += 1UL << order;
+ nr_pages -= 1UL << order;
}
- memcpy(page_to_virt(page), mfn_to_virt(initrd->mod_start),
- initrd_len);
+
+ for ( i = 0; i < nr_pages; i++, len -= PAGE_SIZE )
+ {
+ void *p = __map_domain_page(page + i);
+
+ memcpy(p, mfn_to_virt(initrd_mfn + i),
+ min(len, (unsigned long)PAGE_SIZE));
+ unmap_domain_page(p);
+ }
+
mpt_alloc = (paddr_t)initrd->mod_start << PAGE_SHIFT;
init_domheap_pages(mpt_alloc,
mpt_alloc + PAGE_ALIGN(initrd_len));
--
2.38.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |