|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 01/02] HVM firmware passthrough libxl support
On Fri, 2013-01-18 at 21:40 +0000, Ross Philipson wrote:
> This patch introduces support for two new parameters in libxl:
>
> smbios_firmware=<path_to_smbios_structures_file>
> acpi_firmware=<path_to_acpi_tables_file>
>
> The changes are primarily in the domain building code where the firmware files
> are read and passed to libxc for loading into the new guest. After the domain
> building call to libxc, the addresses for the loaded blobs are returned and
> written to xenstore.
>
> Additionally, this patch switches to using the new xc_hvm_build() routine.
>
> Signed-off-by: Ross Philipson <ross.philipson@xxxxxxxxxx>
>
>
> diff -r 35a0556a7f76 tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c Thu Jan 10 17:32:10 2013 +0000
> +++ b/tools/libxl/libxl_dom.c Fri Jan 18 15:21:50 2013 -0500
> @@ -21,6 +21,7 @@
>
> #include <xc_dom.h>
> #include <xen/hvm/hvm_info_table.h>
> +#include <xen/hvm/hvm_xs_strings.h>
>
> libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid)
> {
> @@ -462,6 +463,7 @@ static unsigned long timer_mode(const li
> mode <= LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING);
> return ((unsigned long)mode);
> }
> +
> static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
> libxl_domain_build_info *info,
> int store_evtchn, unsigned long *store_mfn,
> @@ -510,11 +512,79 @@ static int hvm_build_set_params(xc_inter
> return 0;
> }
>
> -static const char *libxl__domain_firmware(libxl__gc *gc,
> - libxl_domain_build_info *info)
> +static int hvm_build_set_xs_values(libxl__gc *gc,
> + uint32_t domid,
> + struct xc_hvm_build_args *args)
> +{
> + libxl_ctx *ctx = libxl__gc_owner(gc);
> + char *path = NULL;
> + int ret = 0;
> +
> + if (args->smbios_module.guest_addr_out) {
> + path = libxl__sprintf(gc,
> "/local/domain/%d/"HVM_XS_SMBIOS_PT_ADDRESS,
> + domid);
> + if (!path)
> + goto str_err;
xl will panic on memory allocation failure so you don't need to handle
it yourself, which removes a lot of error handling.
You could also use GCSPRINTF to shorten the line if you wanted
> +
> + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%"PRIx64,
> + args->smbios_module.guest_addr_out);
> + if (ret)
> + goto xs_err;
> +
> + path = libxl__sprintf(gc, "/local/domain/%d/"HVM_XS_SMBIOS_PT_LENGTH,
> + domid);
> + if (!path)
> + goto str_err;
> +
> + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%x",
> + args->smbios_module.length);
> + if (ret)
> + goto xs_err;
> + }
> +
> + if (args->acpi_module.guest_addr_out) {
> + path = libxl__sprintf(gc, "/local/domain/%d/"HVM_XS_ACPI_PT_ADDRESS,
> + domid);
> + if (!path)
> + goto str_err;
> +
> + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%"PRIx64,
> + args->acpi_module.guest_addr_out);
> + if (ret)
> + goto xs_err;
> +
> + path = libxl__sprintf(gc, "/local/domain/%d/"HVM_XS_ACPI_PT_LENGTH,
> + domid);
> + if (!path)
> + goto str_err;
> +
> + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%x",
> + args->acpi_module.length);
> + if (ret)
> + goto xs_err;
> + }
> +
> + return 0;
> +
> +xs_err:
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "failed to write firmware xenstore value, err: %d", ret);
You can use the LOG macro to shorten these long lines too.
> + return -1;
> +str_err:
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "failed to get firmware xenstore path");
> + return -1;
> +}
> +
> +static int libxl__domain_firmware(libxl__gc *gc,
> + libxl_domain_build_info *info,
> + struct xc_hvm_build_args *args)
> {
> libxl_ctx *ctx = libxl__gc_owner(gc);
> const char *firmware;
> + int e, rc = ERROR_FAIL;
> + int datalen = 0;
> + void *data = 0;
>
> if (info->u.hvm.firmware)
> firmware = info->u.hvm.firmware;
> @@ -530,11 +600,68 @@ static const char *libxl__domain_firmwar
> default:
> LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "invalid device model version
> %d",
> info->device_model_version);
> - return NULL;
> + return -1;
> break;
> }
> }
> - return libxl__abs_path(gc, firmware, libxl__xenfirmwaredir_path());
> + args->image_file_name = libxl__abs_path(gc, firmware,
> + libxl__xenfirmwaredir_path());
> + if (!args->image_file_name) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "invalid firmware path");
> + return -1;
> + }
> +
> + if (info->u.hvm.smbios_firmware) {
> + e = libxl_read_file_contents(ctx, info->u.hvm.smbios_firmware,
> + &data, &datalen);
> + if (e) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "failed to read SMBIOS firmware file %s",
> + info->u.hvm.smbios_firmware);
> + goto err;
> + }
> + if (!datalen) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "SMBIOS firmware file %s is empty",
> + info->u.hvm.smbios_firmware);
> + goto err;
> + }
> + args->smbios_module.data = data;
> + args->smbios_module.length = (uint32_t)datalen;
> + }
> +
> + if (info->u.hvm.acpi_firmware) {
> + e = libxl_read_file_contents(ctx, info->u.hvm.acpi_firmware,
> + &data, &datalen);
> + if (e) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "failed to read ACPI firmware file %s",
> + info->u.hvm.acpi_firmware);
> + goto err;
> + }
> + if (!datalen) {
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "ACPI firmware file %s is empty",
> + info->u.hvm.acpi_firmware);
> + goto err;
> + }
> + args->acpi_module.data = data;
> + args->acpi_module.length = (uint32_t)datalen;
> + }
> +
> + rc = 0;
> + goto out;
Might as well return 0?
> +err:
> + if (args->smbios_module.data) {
> + free(args->smbios_module.data);
> + args->smbios_module.data = NULL;
> + }
> + if (args->acpi_module.data) {
> + free(args->acpi_module.data);
> + args->acpi_module.data = NULL;
> + }
DO you leak args->image_file_name here?
> +out:
> + return rc;
> }
>
> int libxl__build_hvm(libxl__gc *gc, uint32_t domid,
> diff -r 35a0556a7f76 tools/libxl/libxl_types.idl
> --- a/tools/libxl/libxl_types.idl Thu Jan 10 17:32:10 2013 +0000
> +++ b/tools/libxl/libxl_types.idl Fri Jan 18 15:21:50 2013 -0500
> @@ -308,6 +308,8 @@ libxl_domain_build_info = Struct("domain
> ("vpt_align", libxl_defbool),
> ("timer_mode",
> libxl_timer_mode),
> ("nested_hvm", libxl_defbool),
> + ("smbios_firmware", string),
> + ("acpi_firmware", string),
> ("nographic", libxl_defbool),
> ("vga",
> libxl_vga_interface_info),
> ("vnc", libxl_vnc_info),
I think we ought to have a LIBXL_HAVE_FOO define for these two, in
libxl.h I suppose since the IDL doesn't support that sort of thing (not
sure if it should or not).
> diff -r 35a0556a7f76 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c Thu Jan 10 17:32:10 2013 +0000
> +++ b/tools/libxl/xl_cmdimpl.c Fri Jan 18 15:21:50 2013 -0500
> @@ -882,6 +882,11 @@ static void parse_config_data(const char
> }
>
> xlu_cfg_get_defbool(config, "nestedhvm", &b_info->u.hvm.nested_hvm,
> 0);
> +
> + xlu_cfg_replace_string (config, "smbios_firmware",
> + &b_info->u.hvm.smbios_firmware, 0);
> + xlu_cfg_replace_string (config, "acpi_firmware",
> + &b_info->u.hvm.acpi_firmware, 0);
> break;
> case LIBXL_DOMAIN_TYPE_PV:
> {
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |