213 lines
7.9 KiB
Diff
213 lines
7.9 KiB
Diff
From a8eef037b010662e73428907af761b6d2aef4eae Mon Sep 17 00:00:00 2001
|
|
From: Anthony PERARD <anthony.perard@citrix.com>
|
|
Date: Mon, 14 Mar 2016 17:55:40 +0000
|
|
Subject: [PATCH 05/15] libxl: Load guest BIOS from file
|
|
|
|
The path to the BIOS blob can be override by the xl's bios_override option,
|
|
or provided by u.hvm.bios_firmware in the domain_build_info struct by other
|
|
libxl user.
|
|
|
|
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
|
|
---
|
|
docs/man/xl.cfg.pod.5 | 9 +++++++
|
|
tools/libxl/libxl.h | 8 +++++++
|
|
tools/libxl/libxl_dom.c | 57 ++++++++++++++++++++++++++++++++++++++++++++
|
|
tools/libxl/libxl_internal.h | 2 ++
|
|
tools/libxl/libxl_paths.c | 10 ++++++++
|
|
tools/libxl/libxl_types.idl | 1 +
|
|
tools/libxl/xl_cmdimpl.c | 11 ++++++---
|
|
7 files changed, 95 insertions(+), 3 deletions(-)
|
|
|
|
Index: xen-4.7.0-testing/docs/man/xl.cfg.pod.5
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/docs/man/xl.cfg.pod.5
|
|
+++ xen-4.7.0-testing/docs/man/xl.cfg.pod.5
|
|
@@ -1242,6 +1242,15 @@ Requires device_model_version=qemu-xen.
|
|
|
|
=back
|
|
|
|
+=item B<bios_override="PATH">
|
|
+
|
|
+Override the path to the blob to be used as BIOS. The blob provided here MUST
|
|
+be consistent with the `bios` which you have specified. You should not normally
|
|
+need to specify this option.
|
|
+
|
|
+This options does not have any effect if using bios="rombios" or
|
|
+device_model_version="qemu-xen-traditional".
|
|
+
|
|
=item B<pae=BOOLEAN>
|
|
|
|
Hide or expose the IA32 Physical Address Extensions. These extensions
|
|
Index: xen-4.7.0-testing/tools/libxl/libxl.h
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/libxl.h
|
|
+++ xen-4.7.0-testing/tools/libxl/libxl.h
|
|
@@ -940,6 +940,14 @@ void libxl_mac_copy(libxl_ctx *ctx, libx
|
|
#define LIBXL_HAVE_CHECKPOINTED_STREAM 1
|
|
|
|
/*
|
|
+ * LIBXL_HAVE_BUILDINFO_HVM_BIOS_FIRMWARE
|
|
+ *
|
|
+ * libxl_domain_build_info has u.hvm.bios_firmware field which can be use
|
|
+ * to provide a different bios blob (like SeaBIOS or OVMF).
|
|
+ */
|
|
+#define LIBXL_HAVE_BUILDINFO_HVM_BIOS_FIRMWARE
|
|
+
|
|
+/*
|
|
* ERROR_REMUS_XXX error code only exists from Xen 4.5, Xen 4.6 and it
|
|
* is changed to ERROR_CHECKPOINT_XXX in Xen 4.7
|
|
*/
|
|
Index: xen-4.7.0-testing/tools/libxl/libxl_dom.c
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/libxl_dom.c
|
|
+++ xen-4.7.0-testing/tools/libxl/libxl_dom.c
|
|
@@ -866,6 +866,38 @@ err:
|
|
return ret;
|
|
}
|
|
|
|
+static int libxl__load_hvm_firmware_module(libxl__gc *gc,
|
|
+ const char *filename,
|
|
+ const char *what,
|
|
+ struct xc_hvm_firmware_module *m)
|
|
+{
|
|
+ int datalen = 0;
|
|
+ void *data = NULL;
|
|
+ int e;
|
|
+
|
|
+ LOG(DEBUG, "Loading %s: %s", what, filename);
|
|
+ e = libxl_read_file_contents(CTX, filename, &data, &datalen);
|
|
+ if (e) {
|
|
+ /*
|
|
+ * Print a message only on ENOENT, other error are logged by the
|
|
+ * function libxl_read_file_contents().
|
|
+ */
|
|
+ if (e == ENOENT)
|
|
+ LOGEV(ERROR, e, "failed to read %s file", what);
|
|
+ return ERROR_FAIL;
|
|
+ }
|
|
+ libxl__ptr_add(gc, data);
|
|
+ if (datalen) {
|
|
+ /* Only accept non-empty files */
|
|
+ m->data = data;
|
|
+ m->length = datalen;
|
|
+ } else {
|
|
+ LOG(ERROR, "file %s for %s is empty", filename, what);
|
|
+ return ERROR_INVAL;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int libxl__domain_firmware(libxl__gc *gc,
|
|
libxl_domain_build_info *info,
|
|
struct xc_dom_image *dom)
|
|
@@ -875,6 +907,7 @@ static int libxl__domain_firmware(libxl_
|
|
int e, rc;
|
|
int datalen = 0;
|
|
void *data;
|
|
+ const char *bios_filename = NULL;
|
|
|
|
if (info->u.hvm.firmware)
|
|
firmware = info->u.hvm.firmware;
|
|
@@ -918,6 +951,30 @@ static int libxl__domain_firmware(libxl_
|
|
goto out;
|
|
}
|
|
|
|
+ if (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
|
|
+ if (info->u.hvm.bios_firmware) {
|
|
+ bios_filename = info->u.hvm.bios_firmware;
|
|
+ } else {
|
|
+ switch (info->u.hvm.bios) {
|
|
+ case LIBXL_BIOS_TYPE_SEABIOS:
|
|
+ bios_filename = libxl__seabios_path();
|
|
+ break;
|
|
+ case LIBXL_BIOS_TYPE_OVMF:
|
|
+ bios_filename = libxl__ovmf_path();
|
|
+ break;
|
|
+ case LIBXL_BIOS_TYPE_ROMBIOS:
|
|
+ default:
|
|
+ abort();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (bios_filename) {
|
|
+ rc = libxl__load_hvm_firmware_module(gc, bios_filename, "BIOS",
|
|
+ &dom->bios_module);
|
|
+ if (rc) goto out;
|
|
+ }
|
|
+
|
|
if (info->u.hvm.smbios_firmware) {
|
|
data = NULL;
|
|
e = libxl_read_file_contents(ctx, info->u.hvm.smbios_firmware,
|
|
Index: xen-4.7.0-testing/tools/libxl/libxl_internal.h
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/libxl_internal.h
|
|
+++ xen-4.7.0-testing/tools/libxl/libxl_internal.h
|
|
@@ -2315,6 +2315,8 @@ _hidden const char *libxl__xen_config_di
|
|
_hidden const char *libxl__xen_script_dir_path(void);
|
|
_hidden const char *libxl__lock_dir_path(void);
|
|
_hidden const char *libxl__run_dir_path(void);
|
|
+_hidden const char *libxl__seabios_path(void);
|
|
+_hidden const char *libxl__ovmf_path(void);
|
|
|
|
/*----- subprocess execution with timeout -----*/
|
|
|
|
Index: xen-4.7.0-testing/tools/libxl/libxl_paths.c
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/libxl_paths.c
|
|
+++ xen-4.7.0-testing/tools/libxl/libxl_paths.c
|
|
@@ -35,6 +35,16 @@ const char *libxl__run_dir_path(void)
|
|
return XEN_RUN_DIR;
|
|
}
|
|
|
|
+const char *libxl__seabios_path(void)
|
|
+{
|
|
+ return SEABIOS_PATH;
|
|
+}
|
|
+
|
|
+const char *libxl__ovmf_path(void)
|
|
+{
|
|
+ return OVMF_PATH;
|
|
+}
|
|
+
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
Index: xen-4.7.0-testing/tools/libxl/libxl_types.idl
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/libxl_types.idl
|
|
+++ xen-4.7.0-testing/tools/libxl/libxl_types.idl
|
|
@@ -512,6 +512,7 @@ libxl_domain_build_info = Struct("domain
|
|
("timer_mode", libxl_timer_mode),
|
|
("nested_hvm", libxl_defbool),
|
|
("altp2m", libxl_defbool),
|
|
+ ("bios_firmware", string),
|
|
("smbios_firmware", string),
|
|
("acpi_firmware", string),
|
|
("hdtype", libxl_hdtype),
|
|
Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c
|
|
===================================================================
|
|
--- xen-4.7.0-testing.orig/tools/libxl/xl_cmdimpl.c
|
|
+++ xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c
|
|
@@ -1680,12 +1680,17 @@ static void parse_config_data(const char
|
|
|
|
xlu_cfg_replace_string (config, "firmware_override",
|
|
&b_info->u.hvm.firmware, 0);
|
|
- if (!xlu_cfg_get_string(config, "bios", &buf, 0) &&
|
|
- libxl_bios_type_from_string(buf, &b_info->u.hvm.bios)) {
|
|
+ xlu_cfg_replace_string (config, "bios_override",
|
|
+ &b_info->u.hvm.bios_firmware, 0);
|
|
+ if (!xlu_cfg_get_string(config, "bios", &buf, 0)) {
|
|
+ if (libxl_bios_type_from_string(buf, &b_info->u.hvm.bios)) {
|
|
fprintf(stderr, "ERROR: invalid value \"%s\" for \"bios\"\n",
|
|
buf);
|
|
exit (1);
|
|
- }
|
|
+ }
|
|
+ } else if (b_info->u.hvm.bios_firmware)
|
|
+ fprintf(stderr, "WARNING: "
|
|
+ "bios_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);
|