*/
#define LIBXL_HAVE_BUILDINFO_GRANT_LIMITS 1
+/*
+ * LIBXL_HAVE_BUILDINFO_* indicates that libxl_domain_build_info has
+ * the field represented by the '*'. The original position of those
+ * fields is:
+ * - u.hvm.timer_mode
+ * - u.hvm.apic
+ * - u.hvm.nested_hvm
+ * - u.pv.bootloader
+ * - u.pv.bootloader_args
+ */
+#define LIBXL_HAVE_BUILDINFO_TIMER_MODE 1
+#define LIBXL_HAVE_BUILDINFO_APIC 1
+#define LIBXL_HAVE_BUILDINFO_NESTED_HVM 1
+#define LIBXL_HAVE_BUILDINFO_BOOTLOADER 1
+#define LIBXL_HAVE_BUILDINFO_BOOTLOADER_ARGS 1
+
/*
* libxl ABI compatibility
*
{
const libxl_domain_build_info *info = bl->info;
- bl->argsspace = 9 + libxl_string_list_length(&info->u.pv.bootloader_args);
+ bl->argsspace = 9 + libxl_string_list_length(&info->bootloader_args);
GCNEW_ARRAY(bl->args, bl->argsspace);
ARG("--output-format=simple0");
ARG(GCSPRINTF("--output-directory=%s", bl->outputdir));
- if (info->u.pv.bootloader_args) {
- char **p = info->u.pv.bootloader_args;
+ if (info->bootloader_args) {
+ char **p = info->bootloader_args;
while (*p) {
ARG(*p);
p++;
goto out_ok;
}
- if (!info->u.pv.bootloader) {
+ if (!info->bootloader) {
LOGD(DEBUG, domid,
"no bootloader configured, using user supplied kernel");
bl->kernel->path = bl->info->kernel;
}
LOGD(DEBUG, bl->domid,
- "Config bootloader value: %s", info->u.pv.bootloader);
+ "Config bootloader value: %s", info->bootloader);
- if ( !strcmp(info->u.pv.bootloader, "/usr/bin/pygrub") )
+ if ( !strcmp(info->bootloader, "/usr/bin/pygrub") )
LOGD(WARN, bl->domid,
"bootloader='/usr/bin/pygrub' is deprecated; use " \
"bootloader='pygrub' instead");
- bootloader = info->u.pv.bootloader;
+ bootloader = info->bootloader;
/* If the full path is not specified, check in the libexec path */
if ( bootloader[0] != '/' ) {
int libxl__domain_build_info_setdefault(libxl__gc *gc,
libxl_domain_build_info *b_info)
{
- int i;
+ int i, rc;
if (b_info->type != LIBXL_DOMAIN_TYPE_HVM &&
b_info->type != LIBXL_DOMAIN_TYPE_PV) {
return ERROR_INVAL;
}
+ /* Copy deprecated options to it's new position. */
+ rc = libxl__domain_build_info_copy_deprecated(CTX, b_info);
+ if (rc) {
+ LOG(ERROR, "Unable to copy deprecated fields");
+ return rc;
+ }
+
libxl_defbool_setdefault(&b_info->device_model_stubdomain, false);
if (libxl_defbool_val(b_info->device_model_stubdomain) &&
if (b_info->device_model_version
== LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
const char *dm;
- int rc;
dm = libxl__domain_device_model(gc, b_info);
rc = access(dm, X_OK);
break;
}
- if (b_info->u.hvm.timer_mode == LIBXL_TIMER_MODE_DEFAULT)
- b_info->u.hvm.timer_mode =
- LIBXL_TIMER_MODE_NO_DELAY_FOR_MISSED_TICKS;
+ if (libxl__timer_mode_is_default(&b_info->timer_mode))
+ b_info->timer_mode = LIBXL_TIMER_MODE_NO_DELAY_FOR_MISSED_TICKS;
libxl_defbool_setdefault(&b_info->u.hvm.pae, true);
- libxl_defbool_setdefault(&b_info->u.hvm.apic, true);
+ libxl_defbool_setdefault(&b_info->apic, true);
libxl_defbool_setdefault(&b_info->u.hvm.acpi, true);
libxl_defbool_setdefault(&b_info->u.hvm.acpi_s3, true);
libxl_defbool_setdefault(&b_info->u.hvm.acpi_s4, true);
libxl_defbool_setdefault(&b_info->u.hvm.viridian, false);
libxl_defbool_setdefault(&b_info->u.hvm.hpet, true);
libxl_defbool_setdefault(&b_info->u.hvm.vpt_align, true);
- libxl_defbool_setdefault(&b_info->u.hvm.nested_hvm, false);
+ libxl_defbool_setdefault(&b_info->nested_hvm, false);
libxl_defbool_setdefault(&b_info->u.hvm.altp2m, false);
libxl_defbool_setdefault(&b_info->u.hvm.usb, false);
libxl_defbool_setdefault(&b_info->u.hvm.xen_platform_pci, true);
}
if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM &&
- (libxl_defbool_val(d_config->b_info.u.hvm.nested_hvm) &&
+ (libxl_defbool_val(d_config->b_info.nested_hvm) &&
(libxl_defbool_val(d_config->b_info.u.hvm.altp2m) ||
(d_config->b_info.altp2m != LIBXL_ALTP2M_MODE_DISABLED)))) {
ret = ERROR_INVAL;
static unsigned long timer_mode(const libxl_domain_build_info *info)
{
- const libxl_timer_mode mode = info->u.hvm.timer_mode;
+ const libxl_timer_mode mode = info->timer_mode;
assert(mode >= LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS &&
mode <= LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING);
return ((unsigned long)mode);
xc_hvm_param_set(handle, domid, HVM_PARAM_VPT_ALIGN,
libxl_defbool_val(info->u.hvm.vpt_align));
xc_hvm_param_set(handle, domid, HVM_PARAM_NESTEDHVM,
- libxl_defbool_val(info->u.hvm.nested_hvm));
+ libxl_defbool_val(info->nested_hvm));
}
int libxl__build_pre(libxl__gc *gc, uint32_t domid,
return ERROR_FAIL;
va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
- va_hvm->apic_mode = libxl_defbool_val(info->u.hvm.apic);
+ va_hvm->apic_mode = libxl_defbool_val(info->apic);
va_hvm->nr_vcpus = info->max_vcpus;
memset(va_hvm->vcpu_online, 0, sizeof(va_hvm->vcpu_online));
memcpy(va_hvm->vcpu_online, info->avail_vcpus.map, info->avail_vcpus.size);
dom->mmio_size = HVM_BELOW_4G_MMIO_LENGTH;
else if (dom->mmio_size == 0 && !device_model) {
#if defined(__i386__) || defined(__x86_64__)
- if (libxl_defbool_val(info->u.hvm.apic)) {
+ if (libxl_defbool_val(info->apic)) {
/* Make sure LAPIC_BASE_ADDRESS is below special pages */
assert(((((X86_HVM_END_SPECIAL_REGION - X86_HVM_NR_SPECIAL_PAGES)
<< XC_PAGE_SHIFT) - LAPIC_BASE_ADDRESS)) >= XC_PAGE_SIZE);
if (d_config->b_info.device_model_version !=
LIBXL_DEVICE_MODEL_VERSION_NONE) {
xc_config->emulation_flags = XEN_X86_EMU_ALL;
- } else if (libxl_defbool_val(d_config->b_info.u.hvm.apic)) {
+ } else if (libxl_defbool_val(d_config->b_info.apic)) {
/*
* HVM guests without device model may want
* to have LAPIC emulation.
hvminfo = libxl__zalloc(gc, sizeof(*hvminfo));
- hvminfo->apic_mode = libxl_defbool_val(b_info->u.hvm.apic);
+ hvminfo->apic_mode = libxl_defbool_val(b_info->apic);
if (dom->nr_vnodes) {
unsigned int *vcpu_to_vnode, *vdistance;
xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0);
xlu_cfg_get_defbool(config, "acpi", &b_info->acpi, 0);
- if (b_info->type == LIBXL_DOMAIN_TYPE_PV) {
- xlu_cfg_replace_string (config, "bootloader",
- &b_info->u.pv.bootloader, 0);
- switch (xlu_cfg_get_list_as_string_list(config, "bootloader_args",
- &b_info->u.pv.bootloader_args, 1))
- {
+ xlu_cfg_replace_string (config, "bootloader", &b_info->bootloader, 0);
+ switch (xlu_cfg_get_list_as_string_list(config, "bootloader_args",
+ &b_info->bootloader_args, 1)) {
+ case 0:
+ break; /* Success */
+ case ESRCH: break; /* Option not present */
+ case EINVAL:
+ if (!xlu_cfg_get_string(config, "bootloader_args", &buf, 0)) {
+
+ fprintf(stderr, "WARNING: Specifying \"bootloader_args\""
+ " as a string is deprecated. "
+ "Please use a list of arguments.\n");
+ split_string_into_string_list(buf, " \t\n",
+ &b_info->bootloader_args);
+ }
+ break;
+ default:
+ fprintf(stderr,"xl: Unable to parse bootloader_args.\n");
+ exit(-ERROR_FAIL);
+ }
- case 0: break; /* Success */
- case ESRCH: break; /* Option not present */
- case EINVAL:
- if (!xlu_cfg_get_string(config, "bootloader_args", &buf, 0)) {
+ if (!xlu_cfg_get_long(config, "timer_mode", &l, 1)) {
+ const char *s = libxl_timer_mode_to_string(l);
- fprintf(stderr, "WARNING: Specifying \"bootloader_args\""
- " as a string is deprecated. "
- "Please use a list of arguments.\n");
- split_string_into_string_list(buf, " \t\n",
- &b_info->u.pv.bootloader_args);
- }
- break;
- default:
- fprintf(stderr,"xl: Unable to parse bootloader_args.\n");
+ if (b_info->type == LIBXL_DOMAIN_TYPE_PV) {
+ fprintf(stderr,
+ "ERROR: \"timer_mode\" option is not supported for PV guests.\n");
exit(-ERROR_FAIL);
- } else {
- if (!xlu_cfg_get_long(config, "timer_mode", &l, 1)) {
- const char *s = libxl_timer_mode_to_string(l);
+ }
+
+ fprintf(stderr,
+ "WARNING: specifying \"timer_mode\" as an integer is deprecated. "
+ "Please use the named parameter variant. %s%s%s\n",
+ s ? "e.g. timer_mode=\"" : "",
+ s ? s : "",
+ s ? "\"" : "");
+
+ if (l < LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS ||
+ l > LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING) {
+ fprintf(stderr, "ERROR: invalid value %ld for \"timer_mode\"\n",
+ l);
+ exit (1);
+ }
+ b_info->timer_mode = l;
+ } else if (!xlu_cfg_get_string(config, "timer_mode", &buf, 0)) {
+ if (b_info->type == LIBXL_DOMAIN_TYPE_PV) {
fprintf(stderr,
- "WARNING: specifying \"timer_mode\" as an integer is deprecated. "
- "Please use the named parameter variant. %s%s%s\n",
- s ? "e.g. timer_mode=\"" : "",
- s ? s : "",
- s ? "\"" : "");
-
- if (l < LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS ||
- l > LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING) {
- fprintf(stderr,
- "ERROR: invalid value %ld for \"timer_mode\"\n", l);
- exit (1);
- }
- b_info->u.hvm.timer_mode = l;
- } else if (!xlu_cfg_get_string(config, "timer_mode", &buf, 0) &&
- libxl_timer_mode_from_string(buf,
- &b_info->u.hvm.timer_mode)) {
+ "ERROR: \"timer_mode\" option is not supported for PV guests.\n");
+ exit(-ERROR_FAIL);
+ }
+
+ if (libxl_timer_mode_from_string(buf, &b_info->timer_mode)) {
fprintf(stderr,
"ERROR: invalid value \"%s\" for \"timer_mode\"\n", buf);
exit (1);
}
-
- xlu_cfg_get_defbool(config, "nestedhvm", &b_info->u.hvm.nested_hvm,
- 0);
}
+ xlu_cfg_get_defbool(config, "nestedhvm", &b_info->nested_hvm, 0);
+ xlu_cfg_get_defbool(config, "apic", &b_info->apic, 0);
+
switch(b_info->type) {
case LIBXL_DOMAIN_TYPE_HVM:
kernel_basename = libxl_basename(b_info->kernel);
"bios_path_override given without specific bios name\n");
xlu_cfg_get_defbool(config, "pae", &b_info->u.hvm.pae, 0);
- xlu_cfg_get_defbool(config, "apic", &b_info->u.hvm.apic, 0);
xlu_cfg_get_defbool(config, "acpi_s3", &b_info->u.hvm.acpi_s3, 0);
xlu_cfg_get_defbool(config, "acpi_s4", &b_info->u.hvm.acpi_s4, 0);
xlu_cfg_get_defbool(config, "acpi_laptop_slate", &b_info->u.hvm.acpi_laptop_slate, 0);
break;
case LIBXL_DOMAIN_TYPE_PV:
{
- if (!b_info->u.pv.bootloader && !b_info->kernel) {
+ if (!b_info->bootloader && !b_info->kernel) {
fprintf(stderr, "Neither kernel nor bootloader specified\n");
exit(1);
}
fprintf(fh, "\t(nomigrate %s)\n",
libxl_defbool_to_string(b_info->disable_migrate));
- if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->u.pv.bootloader) {
- fprintf(fh, "\t(bootloader %s)\n", b_info->u.pv.bootloader);
- if (b_info->u.pv.bootloader_args) {
+ if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->bootloader) {
+ fprintf(fh, "\t(bootloader %s)\n", b_info->bootloader);
+ if (b_info->bootloader_args) {
fprintf(fh, "\t(bootloader_args");
- for (i=0; b_info->u.pv.bootloader_args[i]; i++)
- fprintf(fh, " %s", b_info->u.pv.bootloader_args[i]);
+ for (i=0; b_info->bootloader_args[i]; i++)
+ fprintf(fh, " %s", b_info->bootloader_args[i]);
fprintf(fh, ")\n");
}
}
fprintf(fh, "\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb);
fprintf(fh, "\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae));
fprintf(fh, "\t\t\t(apic %s)\n",
- libxl_defbool_to_string(b_info->u.hvm.apic));
+ libxl_defbool_to_string(b_info->apic));
fprintf(fh, "\t\t\t(acpi %s)\n",
libxl_defbool_to_string(b_info->u.hvm.acpi));
fprintf(fh, "\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx));
fprintf(fh, "\t\t\t(vpt_align %s)\n",
libxl_defbool_to_string(b_info->u.hvm.vpt_align));
fprintf(fh, "\t\t\t(timer_mode %s)\n",
- libxl_timer_mode_to_string(b_info->u.hvm.timer_mode));
+ libxl_timer_mode_to_string(b_info->timer_mode));
fprintf(fh, "\t\t\t(nestedhvm %s)\n",
- libxl_defbool_to_string(b_info->u.hvm.nested_hvm));
+ libxl_defbool_to_string(b_info->nested_hvm));
fprintf(fh, "\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind ==
LIBXL_VGA_INTERFACE_TYPE_STD ?
"True" : "False");