From: Dov Murik <dovmurik@linux.ibm.com> To: qemu-devel@nongnu.org Cc: "Tom Lendacky" <thomas.lendacky@amd.com>, "Ashish Kalra" <ashish.kalra@amd.com>, "Brijesh Singh" <brijesh.singh@amd.com>, "Eduardo Habkost" <ehabkost@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, "Connor Kuehl" <ckuehl@redhat.com>, "Laszlo Ersek" <lersek@redhat.com>, "James Bottomley" <jejb@linux.ibm.com>, "Richard Henderson" <richard.henderson@linaro.org>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, "Dov Murik" <dovmurik@linux.ibm.com>, "Tobin Feldman-Fitzthum" <tobin@linux.ibm.com>, "Jim Cadden" <jcadden@ibm.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com> Subject: [PATCH v3 2/2] x86/sev: generate SEV kernel loader hashes in x86_load_linux Date: Thu, 24 Jun 2021 10:20:40 +0000 [thread overview] Message-ID: <20210624102040.2015280-3-dovmurik@linux.ibm.com> (raw) In-Reply-To: <20210624102040.2015280-1-dovmurik@linux.ibm.com> If SEV is enabled and a kernel is passed via -kernel, pass the hashes of kernel/initrd/cmdline in an encrypted guest page to OVMF for SEV measured boot. Co-developed-by: James Bottomley <jejb@linux.ibm.com> Signed-off-by: James Bottomley <jejb@linux.ibm.com> Signed-off-by: Dov Murik <dovmurik@linux.ibm.com> Reviewed-by: Connor Kuehl <ckuehl@redhat.com> --- hw/i386/x86.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/hw/i386/x86.c b/hw/i386/x86.c index d30cf27e29..830c8f6f58 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -45,6 +45,7 @@ #include "hw/i386/fw_cfg.h" #include "hw/intc/i8259.h" #include "hw/rtc/mc146818rtc.h" +#include "target/i386/sev_i386.h" #include "hw/acpi/cpu_hotplug.h" #include "hw/irq.h" @@ -778,6 +779,7 @@ void x86_load_linux(X86MachineState *x86ms, const char *initrd_filename = machine->initrd_filename; const char *dtb_filename = machine->dtb; const char *kernel_cmdline = machine->kernel_cmdline; + KernelLoaderContext kernel_loader_context = {}; /* Align to 16 bytes as a paranoia measure */ cmdline_size = (strlen(kernel_cmdline) + 16) & ~15; @@ -924,6 +926,8 @@ void x86_load_linux(X86MachineState *x86ms, fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_ADDR, cmdline_addr); fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, strlen(kernel_cmdline) + 1); fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA, kernel_cmdline); + kernel_loader_context.cmdline_data = (char *)kernel_cmdline; + kernel_loader_context.cmdline_size = strlen(kernel_cmdline) + 1; if (protocol >= 0x202) { stl_p(header + 0x228, cmdline_addr); @@ -1005,6 +1009,8 @@ void x86_load_linux(X86MachineState *x86ms, fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr); fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data, initrd_size); + kernel_loader_context.initrd_data = initrd_data; + kernel_loader_context.initrd_size = initrd_size; stl_p(header + 0x218, initrd_addr); stl_p(header + 0x21c, initrd_size); @@ -1063,15 +1069,32 @@ void x86_load_linux(X86MachineState *x86ms, load_image_size(dtb_filename, setup_data->data, dtb_size); } - memcpy(setup, header, MIN(sizeof(header), setup_size)); + /* + * If we're starting an encrypted VM, it will be OVMF based, which uses the + * efi stub for booting and doesn't require any values to be placed in the + * kernel header. We therefore don't update the header so the hash of the + * kernel on the other side of the fw_cfg interface matches the hash of the + * file the user passed in. + */ + if (!sev_enabled()) { + memcpy(setup, header, MIN(sizeof(header), setup_size)); + } fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, prot_addr); fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_KERNEL_DATA, kernel, kernel_size); + kernel_loader_context.kernel_data = (char *)kernel; + kernel_loader_context.kernel_size = kernel_size; fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_ADDR, real_addr); fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, setup_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA, setup, setup_size); + kernel_loader_context.setup_data = (char *)setup; + kernel_loader_context.setup_size = setup_size; + + if (sev_enabled()) { + sev_add_kernel_loader_hashes(&kernel_loader_context, &error_fatal); + } option_rom[nb_option_roms].bootindex = 0; option_rom[nb_option_roms].name = "linuxboot.bin"; -- 2.25.1
next prev parent reply other threads:[~2021-06-24 10:22 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-24 10:20 [PATCH v3 0/2] x86/sev: Measured Linux SEV guest with kernel/initrd/cmdline Dov Murik 2021-06-24 10:20 ` [PATCH v3 1/2] sev/i386: Introduce sev_add_kernel_loader_hashes for measured linux boot Dov Murik 2021-07-01 17:23 ` Connor Kuehl 2021-07-02 12:29 ` Dov Murik 2021-06-24 10:20 ` Dov Murik [this message] 2021-07-08 16:41 ` [PATCH v3 0/2] x86/sev: Measured Linux SEV guest with kernel/initrd/cmdline Connor Kuehl 2021-07-08 17:03 ` Philippe Mathieu-Daudé 2021-07-08 17:16 ` Connor Kuehl 2021-07-29 19:31 ` Dov Murik 2021-07-30 14:47 ` Connor Kuehl 2021-07-30 18:02 ` Dov Murik 2021-07-30 18:14 ` Connor Kuehl 2021-07-09 6:55 ` Michael S. Tsirkin 2021-08-25 7:35 [PATCH v3 0/2] [RESEND] " Dov Murik 2021-08-25 7:35 ` [PATCH v3 2/2] x86/sev: generate SEV kernel loader hashes in x86_load_linux Dov Murik 2021-09-27 17:03 ` Daniel P. Berrangé 2021-09-29 9:42 ` Dov Murik
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210624102040.2015280-3-dovmurik@linux.ibm.com \ --to=dovmurik@linux.ibm.com \ --cc=ashish.kalra@amd.com \ --cc=brijesh.singh@amd.com \ --cc=ckuehl@redhat.com \ --cc=dgilbert@redhat.com \ --cc=ehabkost@redhat.com \ --cc=jcadden@ibm.com \ --cc=jejb@linux.ibm.com \ --cc=lersek@redhat.com \ --cc=mst@redhat.com \ --cc=pbonzini@redhat.com \ --cc=philmd@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=richard.henderson@linaro.org \ --cc=thomas.lendacky@amd.com \ --cc=tobin@linux.ibm.com \ --subject='Re: [PATCH v3 2/2] x86/sev: generate SEV kernel loader hashes in x86_load_linux' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).