|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 06/15] x86/PVH: keep a copy of Dom0's initial E820 map
pvh_populate_p2m() needs to populate RAM according to the initial map
established, prior to any stealing by pvh_steal_ram(). Subsequently the
invocations of those functions will (need to) move ahead of
pvh_populate_p2m(), so what to act on is no longer Dom0's memory map at
the time of invocation.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -13,6 +13,7 @@
#include <xen/multiboot.h>
#include <xen/pci.h>
#include <xen/softirq.h>
+#include <xen/xvmalloc.h>
#include <acpi/actables.h>
@@ -413,7 +414,10 @@ static void __init pvh_init_p2m(struct d
} while ( preempted );
}
-static int __init pvh_populate_p2m(struct domain *d)
+static int __init pvh_populate_p2m(
+ struct domain *d,
+ const struct e820entry *e820,
+ unsigned int nr_e820)
{
struct vcpu *v = d->vcpu[0];
unsigned int i;
@@ -421,15 +425,15 @@ static int __init pvh_populate_p2m(struc
#define MB1_PAGES PFN_DOWN(MB(1))
/* Populate memory map. */
- for ( i = 0; i < d->arch.nr_e820; i++ )
+ for ( i = 0; i < nr_e820; i++ )
{
unsigned long addr, size;
- if ( d->arch.e820[i].type != E820_RAM )
+ if ( e820[i].type != E820_RAM )
continue;
- addr = PFN_DOWN(d->arch.e820[i].addr);
- size = PFN_DOWN(d->arch.e820[i].size);
+ addr = PFN_DOWN(e820[i].addr);
+ size = PFN_DOWN(e820[i].size);
rc = pvh_populate_memory_range(d, addr, size);
if ( rc )
@@ -438,11 +442,11 @@ static int __init pvh_populate_p2m(struc
if ( addr < MB1_PAGES )
{
uint64_t end = min_t(uint64_t, MB(1),
- d->arch.e820[i].addr + d->arch.e820[i].size);
+ e820[i].addr + e820[i].size);
enum hvm_translation_result res =
hvm_copy_to_guest_phys(mfn_to_maddr(_mfn(addr)),
mfn_to_virt(addr),
- end - d->arch.e820[i].addr,
+ end - e820[i].addr,
v);
if ( res != HVMTRANS_okay )
@@ -1352,6 +1356,8 @@ int __init dom0_construct_pvh(const stru
paddr_t entry, start_info;
struct domain *d = bd->d;
struct elf_binary elf;
+ struct e820entry *orig_e820;
+ unsigned int nr_orig_e820;
int rc;
printk(XENLOG_INFO "*** Building a PVH Dom%d ***\n", d->domain_id);
@@ -1389,6 +1395,15 @@ int __init dom0_construct_pvh(const stru
iommu_hwdom_init(d);
+ nr_orig_e820 = d->arch.nr_e820;
+ orig_e820 = xvmalloc_array(struct e820entry, nr_orig_e820);
+ if ( !orig_e820 )
+ {
+ printk("No memory for copy of E820 map (%u entries)\n", nr_orig_e820);
+ return -ENOMEM;
+ }
+ memcpy(orig_e820, d->arch.e820, nr_orig_e820 * sizeof(*orig_e820));
+
rc = pvh_place_kernel(bd, &elf, &entry);
if ( rc )
{
@@ -1396,13 +1411,15 @@ int __init dom0_construct_pvh(const stru
return rc;
}
- rc = pvh_populate_p2m(d);
+ rc = pvh_populate_p2m(d, orig_e820, nr_orig_e820);
if ( rc )
{
printk("Failed to setup Dom0 physical memory map\n");
return rc;
}
+ xvfree(orig_e820);
+
rc = pvh_load_kernel(bd, &elf, &start_info);
if ( rc )
{
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |