[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 2/3] arm: Allow the user to specify the GIC version
On Tue, 2015-07-07 at 15:08 +0100, Julien Grall wrote: > A platform may have a GIC compatible with previous version of the > device. "...a GIC which is compatible with a previous version..." > > This is allow to virtualize an unmodified OS on new hardware if the GIC > is compatible with older version. "This is to allow virtualization of an unmodified..." "...with the older version". > When a guest is created, the vGIC will emulate same version as the > hardware. Although, the user can specify in the configuration file the > preferred version (currently only GICv2 and GICv3 are supported). I think "Unless the user has specified in the configuration file..." > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > Cc: Wei Liu <wei.liu2@xxxxxxxxxx> > > --- > The hypervisor will check if the GIC is able to virtualize the > version specified by the user (via the DOMCTL createdomain). > If it's not compatible an error will be send on the Xen console > which will make the error not obvious for user. > > I left aside a user error reporting for a follow-up as I'm not > sure how to notify the user which GIC versions are available. May be > by a new mechanism similar to xen_get_caps? > > It may be possible to rework the libxl code to restrict the scope of > xc_config in libxl_domain_make. This can be done in a follow-up if > we figure what to do the frequency field. > > Changes in v4: > - Update the documentation to specify the default behavior > - Update the domain configuration with the GIC version returned > by the hypervisor. > > Changes in v3: > - Rename GIC_VERSION define in LIBXL_GIC_VERSION_Vn. > - Change the value of each define > - Use libxl_gic_version_from_string rather than custom if/else > - Rename LIBXL_HAVE_BUILDINFO_GIC_VERSION into > LIBXL_HAVE_BUILDINFO_ARM_GIC_VERSION and update the comment > - Update doc with Ian's suggestion > - Typoes > > Changes in v2: > - Introduce arch_arm in libxl_domain_build_info to store ARM > specific field > - Add docs > - Remove code that is not necessary with the new version > --- > docs/man/xl.cfg.pod.5 | 34 +++++++++++++++++++++++++++++++++ > tools/libxl/libxl.h | 5 +++++ > tools/libxl/libxl_arch.h | 6 ++++++ > tools/libxl/libxl_arm.c | 35 +++++++++++++++++++++++++++++++++- > tools/libxl/libxl_create.c | 7 +++++++ > tools/libxl/libxl_types.idl | 11 +++++++++++ > tools/libxl/libxl_x86.c | 7 +++++++ > tools/libxl/xl_cmdimpl.c | 12 ++++++++++++ > xen/arch/arm/domain.c | 45 > ++++++++++++++++++++++++++------------------ > xen/arch/arm/vgic.c | 4 ++-- > xen/include/asm-arm/domain.h | 2 ++ > 11 files changed, 147 insertions(+), 21 deletions(-) > > diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 > index a3e0e2e..12765d5 100644 > --- a/docs/man/xl.cfg.pod.5 > +++ b/docs/man/xl.cfg.pod.5 > @@ -1688,6 +1688,40 @@ The default is B<en-us>. > > See L<qemu(1)> for more information. > > +=head2 Architecture Specific options > + > +=head3 ARM > + > +=over 4 > + > +=item B<gic_version="vN"> > + > +Version of the GIC emulated for the guest. Currently, the following > +versions are supported: > + > +=over 4 > + > +=item B<v2> > + > +Emulate a GICv2 hardware "Emulate the GICv2 hardware" or just "Emulate a GICv2" (without the h/w). > + > +=item B<v3> > + > +Emulate a GICv3 hardware. As above. > Note that the emulated GIC does not support the > +GICv2 compatibility mode. > + > +=item B<default> > + > +Emulate the same version as the native GIC hardware used by host where the > +the domain has been created. "... where the domain was created". > diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c > index 03a9205..8ac90c4 100644 > --- a/tools/libxl/libxl_arm.c > +++ b/tools/libxl/libxl_arm.c > @@ -61,7 +61,40 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, > xc_config->nr_spis = nr_spis; > LOG(DEBUG, " - Allocate %u SPIs", nr_spis); > > - xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; > + switch (d_config->b_info.arch_arm.gic_version) { > + case LIBXL_GIC_VERSION_DEFAULT: > + xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; > + break; > + case LIBXL_GIC_VERSION_V2: > + xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_V2; > + break; > + case LIBXL_GIC_VERSION_V3: > + xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_V3; > + break; > + default: > + LOG(ERROR, "Unknown GIC version %s\n", > + > libxl_gic_version_to_string(d_config->b_info.arch_arm.gic_version)); libxl_gic_version_to_string will return NULL for a truly unknown value. Perhaps print %d version too/instead? > diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c > index f799081..2b8a506 100644 > --- a/tools/libxl/libxl_create.c > +++ b/tools/libxl/libxl_create.c > @@ -579,6 +579,13 @@ int libxl__domain_make(libxl__gc *gc, > libxl_domain_config *d_config, > goto out; > } > > + ret = libxl__arch_domain_save_config(gc, d_config, xc_config); > + if (ret < 0) { > + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "fail to save domain > config"); Please use the shorter LOG* macros, and you don't need/want to log errno here since the function doesn't touch it. Actually, the function logs on failure itself, no need to repeat it I think, just document "logs on failure" next to the prototype. > + rc = ERROR_FAIL; libxl__arch_domain_save_config already returns a libxl ERROR_*, so it should be stored into rc directly and propagated. > + goto out; > + } > + > ret = xc_cpupool_movedomain(ctx->xch, info->poolid, *domid); > if (ret < 0) { > LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "domain move fail"); > diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c > index 1be3f8b..e825315 100644 > --- a/tools/libxl/xl_cmdimpl.c > +++ b/tools/libxl/xl_cmdimpl.c > @@ -2250,6 +2250,18 @@ skip_vfb: > } > } > > + if (!xlu_cfg_get_string (config, "gic_version", &buf, 1)) { > + libxl_gic_version v; > + > + e = libxl_gic_version_from_string(buf, &v); > + if (e) { > + fprintf(stderr, > + "Unknown gic_version \"%s\" specified\n", buf); > + exit(-ERROR_FAIL); > + } > + b_info->arch_arm.gic_version = v; You can just pass &b_info....gic_version straight to the from_string function. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |