mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
x86/loader: add -shim option
Add new -shim command line option, wire up for the x86 loader. When specified load shim into the new "etc/boot/shim" fw_cfg file. Needs OVMF changes too to be actually useful. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-ID: <20240905141211.1253307-6-kraxel@redhat.com>
This commit is contained in:
parent
f2594d9284
commit
a5bd044b15
5 changed files with 53 additions and 0 deletions
|
@ -305,6 +305,21 @@ static void machine_set_kernel(Object *obj, const char *value, Error **errp)
|
||||||
ms->kernel_filename = g_strdup(value);
|
ms->kernel_filename = g_strdup(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *machine_get_shim(Object *obj, Error **errp)
|
||||||
|
{
|
||||||
|
MachineState *ms = MACHINE(obj);
|
||||||
|
|
||||||
|
return g_strdup(ms->shim_filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void machine_set_shim(Object *obj, const char *value, Error **errp)
|
||||||
|
{
|
||||||
|
MachineState *ms = MACHINE(obj);
|
||||||
|
|
||||||
|
g_free(ms->shim_filename);
|
||||||
|
ms->shim_filename = g_strdup(value);
|
||||||
|
}
|
||||||
|
|
||||||
static char *machine_get_initrd(Object *obj, Error **errp)
|
static char *machine_get_initrd(Object *obj, Error **errp)
|
||||||
{
|
{
|
||||||
MachineState *ms = MACHINE(obj);
|
MachineState *ms = MACHINE(obj);
|
||||||
|
@ -1082,6 +1097,11 @@ static void machine_class_init(ObjectClass *oc, void *data)
|
||||||
object_class_property_set_description(oc, "kernel",
|
object_class_property_set_description(oc, "kernel",
|
||||||
"Linux kernel image file");
|
"Linux kernel image file");
|
||||||
|
|
||||||
|
object_class_property_add_str(oc, "shim",
|
||||||
|
machine_get_shim, machine_set_shim);
|
||||||
|
object_class_property_set_description(oc, "shim",
|
||||||
|
"shim.efi file");
|
||||||
|
|
||||||
object_class_property_add_str(oc, "initrd",
|
object_class_property_add_str(oc, "initrd",
|
||||||
machine_get_initrd, machine_set_initrd);
|
machine_get_initrd, machine_set_initrd);
|
||||||
object_class_property_set_description(oc, "initrd",
|
object_class_property_set_description(oc, "initrd",
|
||||||
|
|
|
@ -965,6 +965,22 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||||
/* kernel without setup header patches */
|
/* kernel without setup header patches */
|
||||||
fw_cfg_add_file(fw_cfg, "etc/boot/kernel", kernel, kernel_size);
|
fw_cfg_add_file(fw_cfg, "etc/boot/kernel", kernel, kernel_size);
|
||||||
|
|
||||||
|
if (machine->shim_filename) {
|
||||||
|
GMappedFile *mapped_file;
|
||||||
|
GError *gerr = NULL;
|
||||||
|
|
||||||
|
mapped_file = g_mapped_file_new(machine->shim_filename, false, &gerr);
|
||||||
|
if (!mapped_file) {
|
||||||
|
fprintf(stderr, "qemu: error reading shim %s: %s\n",
|
||||||
|
machine->shim_filename, gerr->message);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fw_cfg_add_file(fw_cfg, "etc/boot/shim",
|
||||||
|
g_mapped_file_get_contents(mapped_file),
|
||||||
|
g_mapped_file_get_length(mapped_file));
|
||||||
|
}
|
||||||
|
|
||||||
if (sev_enabled()) {
|
if (sev_enabled()) {
|
||||||
sev_add_kernel_loader_hashes(&sev_load_ctx, &error_fatal);
|
sev_add_kernel_loader_hashes(&sev_load_ctx, &error_fatal);
|
||||||
}
|
}
|
||||||
|
|
|
@ -431,6 +431,7 @@ struct MachineState {
|
||||||
BootConfiguration boot_config;
|
BootConfiguration boot_config;
|
||||||
char *kernel_filename;
|
char *kernel_filename;
|
||||||
char *kernel_cmdline;
|
char *kernel_cmdline;
|
||||||
|
char *shim_filename;
|
||||||
char *initrd_filename;
|
char *initrd_filename;
|
||||||
const char *cpu_type;
|
const char *cpu_type;
|
||||||
AccelState *accelerator;
|
AccelState *accelerator;
|
||||||
|
|
|
@ -4145,6 +4145,13 @@ SRST
|
||||||
or in multiboot format.
|
or in multiboot format.
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
|
DEF("shim", HAS_ARG, QEMU_OPTION_shim, \
|
||||||
|
"-shim shim.efi use 'shim.efi' to boot the kernel\n", QEMU_ARCH_ALL)
|
||||||
|
SRST
|
||||||
|
``-shim shim.efi``
|
||||||
|
Use 'shim.efi' to boot the kernel
|
||||||
|
ERST
|
||||||
|
|
||||||
DEF("append", HAS_ARG, QEMU_OPTION_append, \
|
DEF("append", HAS_ARG, QEMU_OPTION_append, \
|
||||||
"-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL)
|
"-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL)
|
||||||
SRST
|
SRST
|
||||||
|
|
|
@ -2427,6 +2427,7 @@ static void configure_accelerators(const char *progname)
|
||||||
static void qemu_validate_options(const QDict *machine_opts)
|
static void qemu_validate_options(const QDict *machine_opts)
|
||||||
{
|
{
|
||||||
const char *kernel_filename = qdict_get_try_str(machine_opts, "kernel");
|
const char *kernel_filename = qdict_get_try_str(machine_opts, "kernel");
|
||||||
|
const char *shim_filename = qdict_get_try_str(machine_opts, "shim");
|
||||||
const char *initrd_filename = qdict_get_try_str(machine_opts, "initrd");
|
const char *initrd_filename = qdict_get_try_str(machine_opts, "initrd");
|
||||||
const char *kernel_cmdline = qdict_get_try_str(machine_opts, "append");
|
const char *kernel_cmdline = qdict_get_try_str(machine_opts, "append");
|
||||||
|
|
||||||
|
@ -2436,6 +2437,11 @@ static void qemu_validate_options(const QDict *machine_opts)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shim_filename != NULL) {
|
||||||
|
error_report("-shim only allowed with -kernel option");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (initrd_filename != NULL) {
|
if (initrd_filename != NULL) {
|
||||||
error_report("-initrd only allowed with -kernel option");
|
error_report("-initrd only allowed with -kernel option");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -2912,6 +2918,9 @@ void qemu_init(int argc, char **argv)
|
||||||
case QEMU_OPTION_kernel:
|
case QEMU_OPTION_kernel:
|
||||||
qdict_put_str(machine_opts_dict, "kernel", optarg);
|
qdict_put_str(machine_opts_dict, "kernel", optarg);
|
||||||
break;
|
break;
|
||||||
|
case QEMU_OPTION_shim:
|
||||||
|
qdict_put_str(machine_opts_dict, "shim", optarg);
|
||||||
|
break;
|
||||||
case QEMU_OPTION_initrd:
|
case QEMU_OPTION_initrd:
|
||||||
qdict_put_str(machine_opts_dict, "initrd", optarg);
|
qdict_put_str(machine_opts_dict, "initrd", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue