=back
+=head3 Non direct Kernel Boot
+
+Non direct kernel boot allows booting guests with a firmware. This can be
+used by all types of guests, although the selection of options is different
+depending on the guest type.
+
+This option provides the flexibly of letting the guest decide which kernel
+they want to boot, while preventing having to poke at the guest file
+system form the toolstack domain.
+
+=head4 PV guest options
+
+=over 4
+
+=item B<firmware="pvgrub32|pvgrub64">
+
+Boots a guest using a para-virtualized version of grub that runs inside
+of the guest. The bitness of the guest needs to be know, so that the right
+version of pvgrub can be selected.
+
+Note that xl expects to find the pvgrub32.bin and pvgrub64.bin binaries in
+F<@XENFIRMWAREDIR@>.
+
+=back
+
+=head4 HVM guest options
+
+=over 4
+
+=item B<firmware="bios">
+
+Boot the guest using the default BIOS firmware, which depends on the
+chosen device model.
+
+=item B<firmware="uefi">
+
+Boot the guest using the default UEFI firmware, currently OVMF.
+
+=item B<firmware="seabios">
+
+Boot the guest using the SeaBIOS BIOS firmware.
+
+=item B<firmware="rombios">
+
+Boot the guest using the ROMBIOS BIOS firmware.
+
+=item B<firmware="ovmf">
+
+Boot the guest using the OVMF UEFI firmware.
+
+=item B<firmware="PATH">
+
+Load the specified file as firmware for the guest.
+
+=back
+
=head3 Other Options
=over 4
if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0))
b_info->u.hvm.rdm_mem_boundary_memkb = l * 1024;
+
+ /*
+ * The firmware config option can be used as a simplification
+ * instead of setting bios or firmware_override. It has the
+ * following meanings for HVM guests:
+ *
+ * - ovmf | seabios | rombios: maps directly into the "bios"
+ * option.
+ * - uefi | bios: maps into one of the above options and is set
+ * in the bios field.
+ * - Anything else is treated as a path that is copied into
+ * firmware.
+ */
+ if (!xlu_cfg_get_string (config, "firmware", &buf, 0) &&
+ libxl_bios_type_from_string(buf, &b_info->u.hvm.bios)) {
+ if (!strncmp(buf, "uefi", strlen(buf)))
+ b_info->u.hvm.bios = LIBXL_BIOS_TYPE_OVMF;
+ else if (strncmp(buf, "bios", strlen(buf)))
+ /* Assume it's a path to a custom firmware. */
+ xlu_cfg_replace_string(config, "firmware",
+ &b_info->u.hvm.firmware, 0);
+ /*
+ * BIOS is the default, and will be chosen by libxl based on
+ * the device model specified.
+ */
+ }
+
break;
case LIBXL_DOMAIN_TYPE_PV:
{
+ /*
+ * The firmware config option can be used as a simplification
+ * instead of directly setting kernel. It will be translated to
+ * XENFIRMWAREDIR/<string>.bin
+ */
+ if (!xlu_cfg_get_string (config, "firmware", &buf, 0)) {
+ if (b_info->kernel) {
+ fprintf(stderr,
+ "ERROR: both kernel and firmware specified\n");
+ exit(1);
+ }
+ if (strncmp(buf, "pvgrub32", strlen(buf)) &&
+ strncmp(buf, "pvgrub64", strlen(buf))) {
+ fprintf(stderr,
+ "ERROR: only pvgrub{32|64} supported as firmware options\n");
+ exit(1);
+ }
+
+ xasprintf(&b_info->kernel, XENFIRMWAREDIR "/%s.bin", buf);
+ }
if (!*U_PV_F(b_info,bootloader) && !b_info->kernel) {
fprintf(stderr, "Neither kernel nor bootloader specified\n");
exit(1);