static int build(xc_interface *xch)
{
char cmdline[512];
- uint32_t ssid;
- xen_domain_handle_t handle = { 0 };
int rv, xs_fd;
struct xc_dom_image *dom = NULL;
int limit_kb = (maxmem ? : (memory + 1)) * 1024;
+ struct xen_domctl_createdomain config = {
+ .ssidref = SECINITSID_DOMU,
+ .flags = XEN_DOMCTL_CDF_xs_domain,
+ };
xs_fd = open("/dev/xen/xenbus_backend", O_RDWR);
if ( xs_fd == -1 )
if ( flask )
{
- rv = xc_flask_context_to_sid(xch, flask, strlen(flask), &ssid);
+ rv = xc_flask_context_to_sid(xch, flask, strlen(flask), &config.ssidref);
if ( rv )
{
fprintf(stderr, "xc_flask_context_to_sid failed\n");
goto err;
}
}
- else
- {
- ssid = SECINITSID_DOMU;
- }
- rv = xc_domain_create(xch, ssid, handle, XEN_DOMCTL_CDF_xs_domain,
- &domid, NULL);
+
+ rv = xc_domain_create(xch, &domid, &config);
if ( rv )
{
fprintf(stderr, "xc_domain_create failed\n");
void *buffer;
} xc_vcpu_extstate_t;
-typedef struct xen_arch_domainconfig xc_domain_configuration_t;
-int xc_domain_create(xc_interface *xch, uint32_t ssidref,
- xen_domain_handle_t handle, uint32_t flags,
- uint32_t *pdomid, xc_domain_configuration_t *config);
+int xc_domain_create(xc_interface *xch, uint32_t *pdomid,
+ struct xen_domctl_createdomain *config);
/* Functions to produce a dump of a given domain
#include <xen/memory.h>
#include <xen/hvm/hvm_op.h>
-int xc_domain_create(xc_interface *xch, uint32_t ssidref,
- xen_domain_handle_t handle, uint32_t flags,
- uint32_t *pdomid, xc_domain_configuration_t *config)
+int xc_domain_create(xc_interface *xch, uint32_t *pdomid,
+ struct xen_domctl_createdomain *config)
{
- xc_domain_configuration_t lconfig;
int err;
DECLARE_DOMCTL;
- if ( config == NULL )
- {
- memset(&lconfig, 0, sizeof(lconfig));
-
-#if defined (__i386) || defined(__x86_64__)
- if ( flags & XEN_DOMCTL_CDF_hvm_guest )
- lconfig.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
-#elif defined (__arm__) || defined(__aarch64__)
- lconfig.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
- lconfig.nr_spis = 0;
-#else
-#error Architecture not supported
-#endif
-
- config = &lconfig;
- }
-
domctl.cmd = XEN_DOMCTL_createdomain;
domctl.domain = *pdomid;
- domctl.u.createdomain.ssidref = ssidref;
- domctl.u.createdomain.flags = flags;
- memcpy(domctl.u.createdomain.handle, handle, sizeof(xen_domain_handle_t));
- /* xc_domain_configure_t is an alias of arch_domainconfig_t */
- memcpy(&domctl.u.createdomain.arch, config, sizeof(*config));
+ domctl.u.createdomain = *config;
+
if ( (err = do_domctl(xch, &domctl)) != 0 )
return err;
*pdomid = (uint16_t)domctl.domain;
- memcpy(config, &domctl.u.createdomain.arch, sizeof(*config));
return 0;
}
_hidden
int libxl__arch_domain_prepare_config(libxl__gc *gc,
libxl_domain_config *d_config,
- xc_domain_configuration_t *xc_config);
+ struct xen_domctl_createdomain *config);
/* save the arch specific configuration for the domain */
_hidden
int libxl__arch_domain_save_config(libxl__gc *gc,
libxl_domain_config *d_config,
libxl__domain_build_state *state,
- const xc_domain_configuration_t *xc_config);
+ const struct xen_domctl_createdomain *config);
/* arch specific internal domain creation function */
_hidden
int libxl__arch_domain_prepare_config(libxl__gc *gc,
libxl_domain_config *d_config,
- xc_domain_configuration_t *xc_config)
+ struct xen_domctl_createdomain *config)
{
uint32_t nr_spis = 0;
unsigned int i;
LOG(DEBUG, "Configure the domain");
- xc_config->nr_spis = nr_spis;
+ config->arch.nr_spis = nr_spis;
LOG(DEBUG, " - Allocate %u SPIs", nr_spis);
switch (d_config->b_info.arch_arm.gic_version) {
case LIBXL_GIC_VERSION_DEFAULT:
- xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
+ config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
break;
case LIBXL_GIC_VERSION_V2:
- xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_V2;
+ config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V2;
break;
case LIBXL_GIC_VERSION_V3:
- xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_V3;
+ config->arch.gic_version = XEN_DOMCTL_CONFIG_GIC_V3;
break;
default:
LOG(ERROR, "Unknown GIC version %d",
int libxl__arch_domain_save_config(libxl__gc *gc,
libxl_domain_config *d_config,
libxl__domain_build_state *state,
- const xc_domain_configuration_t *xc_config)
+ const struct xen_domctl_createdomain *config)
{
- switch (xc_config->gic_version) {
+ switch (config->arch.gic_version) {
case XEN_DOMCTL_CONFIG_GIC_V2:
d_config->b_info.arch_arm.gic_version = LIBXL_GIC_VERSION_V2;
break;
d_config->b_info.arch_arm.gic_version = LIBXL_GIC_VERSION_V3;
break;
default:
- LOG(ERROR, "Unexpected gic version %u", xc_config->gic_version);
+ LOG(ERROR, "Unexpected gic version %u", config->arch.gic_version);
return ERROR_FAIL;
}
/* Valid domid here means we're soft resetting. */
if (!libxl_domid_valid_guest(*domid)) {
- int flags = 0;
- xen_domain_handle_t handle;
- xc_domain_configuration_t xc_config = {};
+ struct xen_domctl_createdomain create = {
+ .ssidref = info->ssidref,
+ };
if (info->type != LIBXL_DOMAIN_TYPE_PV) {
- flags |= XEN_DOMCTL_CDF_hvm_guest;
- flags |= libxl_defbool_val(info->hap) ? XEN_DOMCTL_CDF_hap : 0;
- flags |= libxl_defbool_val(info->oos) ? 0 : XEN_DOMCTL_CDF_oos_off;
+ create.flags |= XEN_DOMCTL_CDF_hvm_guest;
+ create.flags |=
+ libxl_defbool_val(info->hap) ? XEN_DOMCTL_CDF_hap : 0;
+ create.flags |=
+ libxl_defbool_val(info->oos) ? 0 : XEN_DOMCTL_CDF_oos_off;
}
/* Ultimately, handle is an array of 16 uint8_t, same as uuid */
- libxl_uuid_copy(ctx, (libxl_uuid *)handle, &info->uuid);
+ libxl_uuid_copy(ctx, (libxl_uuid *)&create.handle, &info->uuid);
- ret = libxl__arch_domain_prepare_config(gc, d_config, &xc_config);
+ ret = libxl__arch_domain_prepare_config(gc, d_config, &create);
if (ret < 0) {
LOGED(ERROR, *domid, "fail to get domain config");
rc = ERROR_FAIL;
goto out;
}
- ret = xc_domain_create(ctx->xch, info->ssidref, handle, flags, domid,
- &xc_config);
+ ret = xc_domain_create(ctx->xch, domid, &create);
if (ret < 0) {
LOGED(ERROR, *domid, "domain creation fail");
rc = ERROR_FAIL;
goto out;
}
- rc = libxl__arch_domain_save_config(gc, d_config, state, &xc_config);
+ rc = libxl__arch_domain_save_config(gc, d_config, state, &create);
if (rc < 0)
goto out;
}
int libxl__arch_domain_prepare_config(libxl__gc *gc,
libxl_domain_config *d_config,
- xc_domain_configuration_t *xc_config)
+ struct xen_domctl_createdomain *config)
{
switch(d_config->c_info.type) {
case LIBXL_DOMAIN_TYPE_HVM:
- xc_config->emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
+ config->arch.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
break;
case LIBXL_DOMAIN_TYPE_PVH:
- xc_config->emulation_flags = XEN_X86_EMU_LAPIC;
+ config->arch.emulation_flags = XEN_X86_EMU_LAPIC;
break;
case LIBXL_DOMAIN_TYPE_PV:
- xc_config->emulation_flags = 0;
+ config->arch.emulation_flags = 0;
break;
default:
abort();
int libxl__arch_domain_save_config(libxl__gc *gc,
libxl_domain_config *d_config,
libxl__domain_build_state *state,
- const xc_domain_configuration_t *xc_config)
+ const struct xen_domctl_createdomain *config)
{
return 0;
}
#undef VAL_SSIDREF
caml_enter_blocking_section();
- result = xc_domain_create(_H(xch), cfg.ssidref, cfg.handle, cfg.flags,
- &domid, &cfg.arch);
+ result = xc_domain_create(_H(xch), &domid, &cfg);
caml_leave_blocking_section();
if (result < 0)
PyObject *args,
PyObject *kwds)
{
- uint32_t dom = 0, ssidref = 0, flags = 0, target = 0;
+ uint32_t dom = 0, target = 0;
int ret, i;
PyObject *pyhandle = NULL;
- xen_domain_handle_t handle = {
- 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
- 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef };
+ struct xen_domctl_createdomain config = {
+ .handle = {
+ 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+ 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+ },
+ };
static char *kwd_list[] = { "domid", "ssidref", "handle", "flags", "target", NULL };
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|iiOii", kwd_list,
- &dom, &ssidref, &pyhandle, &flags, &target))
+ &dom, &config.ssidref, &pyhandle,
+ &config.flags, &target))
return NULL;
if ( pyhandle != NULL )
{
PyObject *p = PyList_GetItem(pyhandle, i);
if ( !PyLongOrInt_Check(p) )
goto out_exception;
- handle[i] = (uint8_t)PyLongOrInt_AsLong(p);
+ config.handle[i] = (uint8_t)PyLongOrInt_AsLong(p);
}
}
- if ( (ret = xc_domain_create(self->xc_handle, ssidref,
- handle, flags, &dom, NULL)) < 0 )
+#if defined (__i386) || defined(__x86_64__)
+ if ( config.flags & XEN_DOMCTL_CDF_hvm_guest )
+ config.arch.emulation_flags = (XEN_X86_EMU_ALL & ~XEN_X86_EMU_VPCI);
+#elif defined (__arm__) || defined(__aarch64__)
+ config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
+#else
+#error Architecture not supported
+#endif
+
+ if ( (ret = xc_domain_create(self->xc_handle, &dom, &config)) < 0 )
return pyxc_error_to_exception(self->xc_handle);
if ( target )