[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] tools: Rework xc_domain_create() to take a full xen_domctl_createdomain
commit 54ed251dc7b85565820019102e533afcea814e16 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Fri Mar 9 14:38:35 2018 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Wed Aug 15 19:40:28 2018 +0100 tools: Rework xc_domain_create() to take a full xen_domctl_createdomain In future patches, the structure will be extended with further information, and this is far cleaner than adding extra parameters. The python stubs are the only user which passes NULL for the existing config option (which is actually the arch substructure). Therefore, the #ifdefary moves to compensate. For libxl, pass the full config object down into libxl__arch_domain_{prepare,save}_config(), as there are in practice arch specific settings in the common part of the structure (flags s3_integrity and oos_off specifically). No practical change in behaviour. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Christian Lindig <christian.lindig@xxxxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/helpers/init-xenstore-domain.c | 16 +++++++--------- tools/libxc/include/xenctrl.h | 6 ++---- tools/libxc/xc_domain.c | 31 ++++--------------------------- tools/libxl/libxl_arch.h | 4 ++-- tools/libxl/libxl_arm.c | 16 ++++++++-------- tools/libxl/libxl_create.c | 23 ++++++++++++----------- tools/libxl/libxl_x86.c | 10 +++++----- tools/ocaml/libs/xc/xenctrl_stubs.c | 3 +-- tools/python/xen/lowlevel/xc/xc.c | 28 ++++++++++++++++++++-------- 9 files changed, 61 insertions(+), 76 deletions(-) diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index 8453be283b..785e5704cf 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -60,11 +60,13 @@ static void usage(void) 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 ) @@ -75,19 +77,15 @@ static int build(xc_interface *xch) 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"); diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index dd7d8a9724..2c4ac329b9 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -504,10 +504,8 @@ typedef struct xc_vcpu_extstate { 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 diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 57e18ee227..0124cea842 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -26,43 +26,20 @@ #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; } diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index 74a5af3cf3..c8ccaaf14c 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -19,14 +19,14 @@ _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 diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index 8af9f6f992..2a25201220 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -39,7 +39,7 @@ static const char *gicv_to_string(libxl_gic_version gic_version) 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; @@ -86,18 +86,18 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, 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", @@ -111,9 +111,9 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, 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; @@ -121,7 +121,7 @@ int libxl__arch_domain_save_config(libxl__gc *gc, 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; } diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 1ccb3e35d3..dd9d8c8c69 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -563,35 +563,36 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, /* 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; } diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index ab88562619..6f670b03b5 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -5,17 +5,17 @@ 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(); @@ -27,7 +27,7 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, 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; } diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index b8ec239302..0d4c4cb391 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -174,8 +174,7 @@ CAMLprim value stub_xc_domain_create(value xch, value config) #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) diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 5ade12762a..5a2923a940 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -117,17 +117,21 @@ static PyObject *pyxc_domain_create(XcObject *self, 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 ) { @@ -140,12 +144,20 @@ static PyObject *pyxc_domain_create(XcObject *self, 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 ) -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |