|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 05/14] 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() (while accessing those regions needs to stay after
that), so what to act on is no longer Dom0's memory map at the time of
invocation.
Don't bother freeing the allocation on intermediate error paths: We're
going to panic() anyway.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
v2: Clarify plans in description. Also log domain in new printk().
--- 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,16 @@ 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("%pd: no memory for copy of E820 map (%u entries)\n",
+ d, 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 +1412,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 |