diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in index b4bbc8f9a7..0a1a0bf13b 100644 --- a/docs/man/xl.cfg.pod.5.in +++ b/docs/man/xl.cfg.pod.5.in @@ -441,6 +441,62 @@ is guest specific). =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 + +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 + +Boot the guest using the default BIOS firmware, which depends on the +chosen device model. + +=item B + +Boot the guest using the default UEFI firmware, currently OVMF. + +=item B + +Boot the guest using the SeaBIOS BIOS firmware. + +=item B + +Boot the guest using the ROMBIOS BIOS firmware. + +=item B + +Boot the guest using the OVMF UEFI firmware. + +=item B + +Load the specified file as firmware for the guest. + +=back + =head3 Other Options =over 4 diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index f9cc56471d..f267a74ec9 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -1337,9 +1337,55 @@ void parse_config_data(const char *config_source, exit(-ERROR_FAIL); } + /* + * 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/.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 (!b_info->bootloader && !b_info->kernel) { fprintf(stderr, "Neither kernel nor bootloader specified\n"); exit(1);