--- xen-4.3.0/tools/libxl/libxl_create.c.orig 2013-09-03 14:26:47.478350269 +0100 +++ xen-4.3.0/tools/libxl/libxl_create.c 2013-09-03 14:45:26.710553063 +0100 @@ -208,6 +208,8 @@ libxl_defbool_setdefault(&b_info->disable_migrate, false); + libxl_defbool_setdefault(&b_info->e820_host, false); + switch (b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: if (b_info->shadow_memkb == LIBXL_MEMKB_DEFAULT) @@ -280,7 +282,6 @@ break; case LIBXL_DOMAIN_TYPE_PV: - libxl_defbool_setdefault(&b_info->u.pv.e820_host, false); if (b_info->shadow_memkb == LIBXL_MEMKB_DEFAULT) b_info->shadow_memkb = 0; if (b_info->u.pv.slack_memkb == LIBXL_MEMKB_DEFAULT) --- xen-4.3.0/tools/libxl/libxl_types.idl.orig 2013-09-03 14:16:48.462767589 +0100 +++ xen-4.3.0/tools/libxl/libxl_types.idl 2013-09-03 14:18:19.624028024 +0100 @@ -295,6 +295,8 @@ ("irqs", Array(uint32, "num_irqs")), ("iomem", Array(libxl_iomem_range, "num_iomem")), ("claim_mode", libxl_defbool), + # Use host's E820 for PCI passthrough. + ("e820_host", libxl_defbool), ("u", KeyedUnion(None, libxl_domain_type, "type", [("hvm", Struct(None, [("firmware", string), ("bios", libxl_bios_type), @@ -340,8 +342,6 @@ ("cmdline", string), ("ramdisk", string), ("features", string, {'const': True}), - # Use host's E820 for PCI passthrough. - ("e820_host", libxl_defbool), ])), ("invalid", Struct(None, [])), ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")), --- xen-4.3.0/tools/libxl/libxl_x86.c.orig 2013-09-03 14:26:36.093566315 +0100 +++ xen-4.3.0/tools/libxl/libxl_x86.c 2013-09-03 16:52:24.648701260 +0100 @@ -216,11 +216,8 @@ struct e820entry map[E820MAX]; libxl_domain_build_info *b_info; - if (d_config == NULL || d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) - return ERROR_INVAL; - b_info = &d_config->b_info; - if (!libxl_defbool_val(b_info->u.pv.e820_host)) + if (!libxl_defbool_val(b_info->e820_host)) return ERROR_INVAL; rc = xc_get_machine_memory_map(ctx->xch, map, E820MAX); @@ -229,9 +226,15 @@ return ERROR_FAIL; } nr = rc; - rc = e820_sanitize(ctx, map, &nr, b_info->target_memkb, - (b_info->max_memkb - b_info->target_memkb) + - b_info->u.pv.slack_memkb); + if (d_config == NULL || d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) { + rc = e820_sanitize(ctx, map, &nr, b_info->target_memkb, + (b_info->max_memkb - b_info->target_memkb)); + } else if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV) { + rc = e820_sanitize(ctx, map, &nr, b_info->target_memkb, + (b_info->max_memkb - b_info->target_memkb) + + b_info->u.pv.slack_memkb); + } + if (rc) return ERROR_FAIL; @@ -296,8 +299,7 @@ xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL); } - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV && - libxl_defbool_val(d_config->b_info.u.pv.e820_host)) { + if (libxl_defbool_val(d_config->b_info.e820_host)) { ret = libxl__e820_alloc(gc, domid, d_config); if (ret) { LIBXL__LOG_ERRNO(gc->owner, LIBXL__LOG_ERROR, --- xen-4.3.0/tools/libxl/xl_cmdimpl.c.orig 2013-09-03 14:26:54.524214804 +0100 +++ xen-4.3.0/tools/libxl/xl_cmdimpl.c 2013-09-03 14:47:11.811612562 +0100 @@ -1274,11 +1274,7 @@ if (!xlu_cfg_get_long (config, "pci_permissive", &l, 0)) pci_permissive = l; - /* To be reworked (automatically enabled) once the auto ballooning - * after guest starts is done (with PCI devices passed in). */ - if (c_info->type == LIBXL_DOMAIN_TYPE_PV) { - xlu_cfg_get_defbool(config, "e820_host", &b_info->u.pv.e820_host, 0); - } + xlu_cfg_get_defbool(config, "e820_host", &b_info->e820_host, 0); if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) { d_config->num_pcidevs = 0; @@ -1297,7 +1293,7 @@ d_config->num_pcidevs++; } if (d_config->num_pcidevs && c_info->type == LIBXL_DOMAIN_TYPE_PV) - libxl_defbool_set(&b_info->u.pv.e820_host, true); + libxl_defbool_set(&b_info->e820_host, true); } switch (xlu_cfg_get_list(config, "cpuid", &cpuids, 0, 1)) { --- xen-4.3.0/tools/libxl/xl_sxp.c.orig 2013-09-03 14:25:37.839675572 +0100 +++ xen-4.3.0/tools/libxl/xl_sxp.c 2013-09-03 14:22:13.953561029 +0100 @@ -87,6 +87,10 @@ } } + printf("\t(e820_host %s)\n", + libxl_defbool_to_string(b_info->e820_host)); + + printf("\t(image\n"); switch (c_info->type) { case LIBXL_DOMAIN_TYPE_HVM: @@ -150,8 +154,6 @@ printf("\t\t\t(kernel %s)\n", b_info->u.pv.kernel); printf("\t\t\t(cmdline %s)\n", b_info->u.pv.cmdline); printf("\t\t\t(ramdisk %s)\n", b_info->u.pv.ramdisk); - printf("\t\t\t(e820_host %s)\n", - libxl_defbool_to_string(b_info->u.pv.e820_host)); printf("\t\t)\n"); break; default: