From: "Michael S. Tsirkin" <mst@redhat.com>
To: ben@skyportsystems.com
Cc: qemu-devel@nongnu.org, lersek@redhat.com, imammedo@redhat.com
Subject: Re: [Qemu-devel] [PATCH v5 02/10] linker-loader: Add new 'write pointer' command
Date: Mon, 6 Feb 2017 16:56:34 +0200 [thread overview]
Message-ID: <20170206165517-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <2bb2dd455ea355b279867a312924add82ae685e4.1486285434.git.ben@skyportsystems.com>
On Sun, Feb 05, 2017 at 01:11:57AM -0800, ben@skyportsystems.com wrote:
> From: Ben Warren <ben@skyportsystems.com>
>
> This adds to the existing 'add pointer' functionality in that it
> instructs the guest (BIOS or UEFI) to not patch memory but to instead
> write the changes back to QEMU via a writeable fw_cfg file.
>
> Signed-off-by: Ben Warren <ben@skyportsystems.com>
> ---
> hw/acpi/aml-build.c | 2 +-
> hw/acpi/bios-linker-loader.c | 35 ++++++++++++++++++++++++-----------
> hw/acpi/nvdimm.c | 2 +-
> hw/arm/virt-acpi-build.c | 4 ++--
> hw/i386/acpi-build.c | 8 ++++----
> include/hw/acpi/bios-linker-loader.h | 3 ++-
> 6 files changed, 34 insertions(+), 20 deletions(-)
>
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index 9fc54c9..03b6c6c 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -1626,7 +1626,7 @@ build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
> /* rsdt->table_offset_entry to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, rsdt_entry_offset, rsdt_entry_size,
> - ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, ref_tbl_offset, false);
> }
> build_header(linker, table_data,
> (void *)rsdt, "RSDT", rsdt_len, 1, oem_id, oem_table_id);
> diff --git a/hw/acpi/bios-linker-loader.c b/hw/acpi/bios-linker-loader.c
> index d963ebe..e46bc29 100644
> --- a/hw/acpi/bios-linker-loader.c
> +++ b/hw/acpi/bios-linker-loader.c
> @@ -52,10 +52,13 @@ struct BiosLinkerLoaderEntry {
> } alloc;
>
> /*
> - * COMMAND_ADD_POINTER - patch the table (originating from
> - * @dest_file) at @pointer.offset, by adding a pointer to the table
> + * COMMAND_ADD_POINTER &
> + * COMMAND_WRITE_POINTER - patch guest memory (originating from
> + * @dest_file) at @pointer.offset, by adding a pointer to the memory
> * originating from @src_file. 1,2,4 or 8 byte unsigned
> * addition is used depending on @pointer.size.
> + * Instead of patching memory, COMMAND_WRITE_POINTER writes the changes
> + * to @dest_file in QEMU via fw_cfg DMA.
> */
> struct {
> char dest_file[BIOS_LINKER_LOADER_FILESZ];
> @@ -85,9 +88,10 @@ struct BiosLinkerLoaderEntry {
> typedef struct BiosLinkerLoaderEntry BiosLinkerLoaderEntry;
>
> enum {
> - BIOS_LINKER_LOADER_COMMAND_ALLOCATE = 0x1,
> - BIOS_LINKER_LOADER_COMMAND_ADD_POINTER = 0x2,
> - BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM = 0x3,
> + BIOS_LINKER_LOADER_COMMAND_ALLOCATE = 0x1,
> + BIOS_LINKER_LOADER_COMMAND_ADD_POINTER = 0x2,
> + BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM = 0x3,
> + BIOS_LINKER_LOADER_COMMAND_WRITE_POINTER = 0x4,
> };
>
> enum {
> @@ -242,13 +246,15 @@ void bios_linker_loader_add_checksum(BIOSLinker *linker, const char *file_name,
> * @src_offset: location within source file blob to which
> * @dest_file+@dst_patched_offset will point to after
> * firmware's executed ADD_POINTER command
> + * @write_back: guest should write change contents back to QEMU after patching
> */
> void bios_linker_loader_add_pointer(BIOSLinker *linker,
> const char *dest_file,
> uint32_t dst_patched_offset,
> uint8_t dst_patched_size,
> const char *src_file,
> - uint32_t src_offset)
> + uint32_t src_offset,
> + bool write_back)
> {
> uint64_t le_src_offset;
> BiosLinkerLoaderEntry entry;
Frankly I prefer a new bios_linker_loader_write_pointer.
> @@ -257,8 +263,11 @@ void bios_linker_loader_add_pointer(BIOSLinker *linker,
> const BiosLinkerFileEntry *source_file =
> bios_linker_find_file(linker, src_file);
>
> - assert(dst_patched_offset < dst_file->blob->len);
> - assert(dst_patched_offset + dst_patched_size <= dst_file->blob->len);
> + /* dst_file need not exist if writing back */
Why not?
> + if (!write_back) {
> + assert(dst_patched_offset < dst_file->blob->len);
> + assert(dst_patched_offset + dst_patched_size <= dst_file->blob->len);
> + }
> assert(src_offset < source_file->blob->len);
>
> memset(&entry, 0, sizeof entry);
> @@ -266,15 +275,19 @@ void bios_linker_loader_add_pointer(BIOSLinker *linker,
> sizeof entry.pointer.dest_file - 1);
> strncpy(entry.pointer.src_file, src_file,
> sizeof entry.pointer.src_file - 1);
> - entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_POINTER);
> + entry.command = cpu_to_le32(write_back ?
> + BIOS_LINKER_LOADER_COMMAND_WRITE_POINTER :
> + BIOS_LINKER_LOADER_COMMAND_ADD_POINTER);
> entry.pointer.offset = cpu_to_le32(dst_patched_offset);
> entry.pointer.size = dst_patched_size;
> assert(dst_patched_size == 1 || dst_patched_size == 2 ||
> dst_patched_size == 4 || dst_patched_size == 8);
>
> le_src_offset = cpu_to_le64(src_offset);
> - memcpy(dst_file->blob->data + dst_patched_offset,
> - &le_src_offset, dst_patched_size);
> + if (!write_back) {
> + memcpy(dst_file->blob->data + dst_patched_offset,
> + &le_src_offset, dst_patched_size);
> + }
>
> g_array_append_vals(linker->cmd_blob, &entry, sizeof entry);
> }
> diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
> index 8e7d6ec..175996e 100644
> --- a/hw/acpi/nvdimm.c
> +++ b/hw/acpi/nvdimm.c
> @@ -1266,7 +1266,7 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
> sizeof(NvdimmDsmIn), false /* high memory */);
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, mem_addr_offset, sizeof(uint32_t),
> - NVDIMM_DSM_MEM_FILE, 0);
> + NVDIMM_DSM_MEM_FILE, 0, false);
> build_header(linker, table_data,
> (void *)(table_data->data + nvdimm_ssdt),
> "SSDT", table_data->len - nvdimm_ssdt, 1, NULL, "NVDIMM");
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index 07a10ac..a13f40d 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -380,7 +380,7 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
> /* Address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
> - ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset, false);
>
> /* Checksum to be filled by Guest linker */
> bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> @@ -684,7 +684,7 @@ static void build_fadt(GArray *table_data, BIOSLinker *linker,
> /* DSDT address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, sizeof(fadt->dsdt),
> - ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset, false);
>
> build_header(linker, table_data,
> (void *)fadt, "FACP", sizeof(*fadt), 5, NULL, NULL);
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 1c928ab..78a1d84 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -319,13 +319,13 @@ build_fadt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm,
> /* FACS address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, fw_ctrl_offset, sizeof(fadt->firmware_ctrl),
> - ACPI_BUILD_TABLE_FILE, facs_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, facs_tbl_offset, false);
>
> /* DSDT address to be filled by Guest linker */
> fadt_setup(fadt, pm);
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, sizeof(fadt->dsdt),
> - ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset, false);
>
> build_header(linker, table_data,
> (void *)fadt, "FACP", sizeof(*fadt), 1, oem_id, oem_table_id);
> @@ -2262,7 +2262,7 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
> /* log area start address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE, log_addr_offset, log_addr_size,
> - ACPI_BUILD_TPMLOG_FILE, 0);
> + ACPI_BUILD_TPMLOG_FILE, 0, false);
>
> build_header(linker, table_data,
> (void *)tcpa, "TCPA", sizeof(*tcpa), 2, NULL, NULL);
> @@ -2552,7 +2552,7 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
> /* Address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
> - ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
> + ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset, false);
>
> /* Checksum to be filled by Guest linker */
> bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> diff --git a/include/hw/acpi/bios-linker-loader.h b/include/hw/acpi/bios-linker-loader.h
> index fa1e5d1..d97e39d 100644
> --- a/include/hw/acpi/bios-linker-loader.h
> +++ b/include/hw/acpi/bios-linker-loader.h
> @@ -24,7 +24,8 @@ void bios_linker_loader_add_pointer(BIOSLinker *linker,
> uint32_t dst_patched_offset,
> uint8_t dst_patched_size,
> const char *src_file,
> - uint32_t src_offset);
> + uint32_t src_offset,
> + bool write_back);
>
> void bios_linker_loader_cleanup(BIOSLinker *linker);
> #endif
> --
> 2.7.4
next prev parent reply other threads:[~2017-02-06 14:56 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-05 9:11 [Qemu-devel] [PATCH v5 00/10] Add support for VM Generation ID ben
2017-02-05 9:11 ` [Qemu-devel] [PATCH v5 01/10] ACPI: Add a function for building named qword entries ben
2017-02-07 13:51 ` Igor Mammedov
2017-02-07 20:09 ` Laszlo Ersek
2017-02-08 10:43 ` Igor Mammedov
2017-02-08 10:53 ` Laszlo Ersek
2017-02-08 20:24 ` Ben Warren
2017-02-05 9:11 ` [Qemu-devel] [PATCH v5 02/10] linker-loader: Add new 'write pointer' command ben
2017-02-06 14:56 ` Michael S. Tsirkin [this message]
2017-02-06 17:16 ` Ben Warren
2017-02-06 17:31 ` Michael S. Tsirkin
2017-02-07 12:11 ` Igor Mammedov
2017-02-07 20:20 ` Laszlo Ersek
2017-02-05 9:11 ` [Qemu-devel] [PATCH v5 03/10] docs: VM Generation ID device description ben
2017-02-06 20:18 ` Eric Blake
2017-02-07 20:54 ` Laszlo Ersek
2017-02-10 0:55 ` Laszlo Ersek
2017-02-05 9:11 ` [Qemu-devel] [PATCH v5 04/10] ACPI: Add vmgenid storage entries to the build tables ben
2017-02-07 22:06 ` Laszlo Ersek
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 05/10] ACPI: Add Virtual Machine Generation ID support ben
2017-02-06 16:15 ` Michael S. Tsirkin
2017-02-06 17:29 ` Ben Warren
2017-02-06 17:41 ` Michael S. Tsirkin
2017-02-06 17:59 ` Ben Warren
2017-02-06 18:17 ` Michael S. Tsirkin
2017-02-06 18:48 ` Ben Warren
2017-02-06 19:04 ` Michael S. Tsirkin
2017-02-06 19:44 ` Ben Warren
2017-02-07 14:00 ` Igor Mammedov
2017-02-07 15:35 ` Michael S. Tsirkin
2017-02-07 16:04 ` Igor Mammedov
2017-02-07 16:22 ` Michael S. Tsirkin
2017-02-07 13:48 ` Igor Mammedov
2017-02-07 15:36 ` Michael S. Tsirkin
2017-02-08 20:19 ` Ben Warren
2017-02-09 9:59 ` Igor Mammedov
2017-02-08 0:48 ` Laszlo Ersek
2017-02-08 11:04 ` Igor Mammedov
2017-02-08 11:17 ` Laszlo Ersek
2017-02-08 12:00 ` Igor Mammedov
2017-02-08 22:34 ` Ben Warren
2017-02-08 23:43 ` Laszlo Ersek
2017-02-09 17:23 ` Igor Mammedov
2017-02-09 18:21 ` Michael S. Tsirkin
2017-02-09 19:27 ` Laszlo Ersek
2017-02-09 20:02 ` Ben Warren
2017-02-09 20:24 ` Laszlo Ersek
2017-02-09 20:39 ` Ben Warren
2017-02-10 8:54 ` Igor Mammedov
2017-02-09 0:37 ` Laszlo Ersek
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 06/10] qmp/hmp: add query-vm-generation-id and 'info vm-generation-id' commands ben
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 07/10] qmp/hmp: add set-vm-generation-id commands ben
2017-02-07 13:50 ` Igor Mammedov
2017-02-08 22:01 ` Laszlo Ersek
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 08/10] PC: Support dynamic sysbus on pc_i440fx ben
2017-02-06 16:31 ` Michael S. Tsirkin
2017-02-12 19:55 ` Marcel Apfelbaum
2017-02-13 0:32 ` Ben Warren
2017-02-07 14:05 ` Igor Mammedov
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 09/10] tests: Move reusable ACPI macros into a new header file ben
2017-02-05 9:12 ` [Qemu-devel] [PATCH v5 10/10] tests: Add unit tests for the VM Generation ID feature ben
2017-02-10 10:12 ` [Qemu-devel] [PATCH v5 00/10] Add support for VM Generation ID Laszlo Ersek
2017-02-10 10:28 ` Igor Mammedov
2017-02-10 15:31 ` Michael S. Tsirkin
2017-02-10 16:16 ` Igor Mammedov
2017-02-10 18:18 ` Andrew Jones
2017-02-10 18:27 ` Andreas Färber
2017-02-13 11:00 ` Igor Mammedov
2017-02-13 13:00 ` Michael S. Tsirkin
2017-02-13 13:40 ` Igor Mammedov
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=20170206165517-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=ben@skyportsystems.com \
--cc=imammedo@redhat.com \
--cc=lersek@redhat.com \
--cc=qemu-devel@nongnu.org \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.