qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Igor Mammedov <imammedo@redhat.com>,
	Shannon Zhao <zhaoshenglong@huawei.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Eduardo Habkost <ehabkost@redhat.com>,
	qemu-arm@nongnu.org
Subject: [Qemu-devel] [PULL v2 22/25] acpi: make bios_linker_loader_add_checksum() API offset based
Date: Tue, 7 Jun 2016 15:58:10 +0300	[thread overview]
Message-ID: <20160607155810-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1465304171-10874-1-git-send-email-mst@redhat.com>

From: Igor Mammedov <imammedo@redhat.com>

It should help to make clear that bios_linker works in terms
of offsets within a file. Also it should prevent mistakes
where user passes as arguments pointers to unrelated to file blobs.

While at it, considering that it's a ACPI checksum and
it's initial value must be 0, move checksum field zeroing
into bios_linker_loader_add_checksum() instead of doing it
at every call site manually before bios_linker_loader_add_checksum()
is called.

In addition add extra boundary checks.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/acpi/bios-linker-loader.h |  4 ++--
 hw/acpi/aml-build.c                  |  5 +++--
 hw/acpi/bios-linker-loader.c         | 36 +++++++++++++-----------------------
 hw/arm/virt-acpi-build.c             |  5 ++---
 hw/i386/acpi-build.c                 |  5 ++---
 5 files changed, 22 insertions(+), 33 deletions(-)

diff --git a/include/hw/acpi/bios-linker-loader.h b/include/hw/acpi/bios-linker-loader.h
index f666b7c..a05227e 100644
--- a/include/hw/acpi/bios-linker-loader.h
+++ b/include/hw/acpi/bios-linker-loader.h
@@ -17,8 +17,8 @@ void bios_linker_loader_alloc(BIOSLinker *linker,
                               bool alloc_fseg);
 
 void bios_linker_loader_add_checksum(BIOSLinker *linker, const char *file,
-                                     void *start, unsigned size,
-                                     uint8_t *checksum);
+                                     unsigned start_offset, unsigned size,
+                                     unsigned checksum_offset);
 
 void bios_linker_loader_add_pointer(BIOSLinker *linker,
                                     const char *dest_file,
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index d025837..123160a 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1493,6 +1493,8 @@ build_header(BIOSLinker *linker, GArray *table_data,
              AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
              const char *oem_id, const char *oem_table_id)
 {
+    unsigned tbl_offset = (char *)h - table_data->data;
+    unsigned checksum_offset = (char *)&h->checksum - table_data->data;
     memcpy(&h->signature, sig, 4);
     h->length = cpu_to_le32(len);
     h->revision = rev;
@@ -1513,10 +1515,9 @@ build_header(BIOSLinker *linker, GArray *table_data,
     h->oem_revision = cpu_to_le32(1);
     memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4);
     h->asl_compiler_revision = cpu_to_le32(1);
-    h->checksum = 0;
     /* Checksum to be filled in by Guest linker */
     bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
-                                    h, len, &h->checksum);
+        tbl_offset, len, checksum_offset);
 }
 
 void *acpi_data_push(GArray *table_data, unsigned size)
diff --git a/hw/acpi/bios-linker-loader.c b/hw/acpi/bios-linker-loader.c
index 3fb54dc..d963ebe 100644
--- a/hw/acpi/bios-linker-loader.c
+++ b/hw/acpi/bios-linker-loader.c
@@ -189,8 +189,8 @@ void bios_linker_loader_alloc(BIOSLinker *linker,
 }
 
 /*
- * bios_linker_loader_add_checksum: ask guest to add checksum of file data
- * into (same) file at the specified pointer.
+ * bios_linker_loader_add_checksum: ask guest to add checksum of ACPI
+ * table in the specified file at the specified offset.
  *
  * Checksum calculation simply sums -X for each byte X in the range
  * using 8-bit math (i.e. ACPI checksum).
@@ -198,35 +198,25 @@ void bios_linker_loader_alloc(BIOSLinker *linker,
  * @linker: linker object instance
  * @file: file that includes the checksum to be calculated
  *        and the data to be checksummed
- * @start, @size: range of data to checksum
- * @checksum: location of the checksum to be patched within file blob
- *
- * Notes:
- * - checksum byte initial value must have been pushed into blob
- *   associated with @file and reside at address @checksum.
- * - @size bytes must have been pushed into blob associated wtih @file
- *   and reside at address @start.
- * - Guest calculates checksum of specified range of data, result is added to
- *   initial value at @checksum into copy of @file in Guest memory.
- * - Range might include the checksum itself.
- * - To avoid confusion, caller must always put 0x0 at @checksum.
- * - @file must be loaded into Guest memory using bios_linker_loader_alloc
+ * @start_offset, @size: range of data in the file to checksum,
+ *                       relative to the start of file blob
+ * @checksum_offset: location of the checksum to be patched within file blob,
+ *                   relative to the start of file blob
  */
 void bios_linker_loader_add_checksum(BIOSLinker *linker, const char *file_name,
-                                     void *start, unsigned size,
-                                     uint8_t *checksum)
+                                     unsigned start_offset, unsigned size,
+                                     unsigned checksum_offset)
 {
     BiosLinkerLoaderEntry entry;
     const BiosLinkerFileEntry *file = bios_linker_find_file(linker, file_name);
-    ptrdiff_t checksum_offset = (gchar *)checksum - file->blob->data;
-    ptrdiff_t start_offset = (gchar *)start - file->blob->data;
 
-    assert(checksum_offset >= 0);
-    assert(start_offset >= 0);
-    assert(checksum_offset + 1 <= file->blob->len);
+    assert(file);
+    assert(start_offset < file->blob->len);
     assert(start_offset + size <= file->blob->len);
-    assert(*checksum == 0x0);
+    assert(checksum_offset >= start_offset);
+    assert(checksum_offset + 1 <= start_offset + size);
 
+    *(file->blob->data + checksum_offset) = 0;
     memset(&entry, 0, sizeof entry);
     strncpy(entry.cksum.file, file_name, sizeof entry.cksum.file - 1);
     entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM);
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 1cbb496..735ab86 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -374,11 +374,10 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
         ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
         ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
 
-    rsdp->checksum = 0;
     /* Checksum to be filled by Guest linker */
     bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
-                                    rsdp, sizeof *rsdp,
-                                    &rsdp->checksum);
+        (char *)rsdp - rsdp_table->data, sizeof *rsdp,
+        (char *)&rsdp->checksum - rsdp_table->data);
 
     return rsdp_table;
 }
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index b3ce5be..06d6204 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2458,11 +2458,10 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
         ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
         ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
 
-    rsdp->checksum = 0;
     /* Checksum to be filled by Guest linker */
     bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
-                                    rsdp, sizeof *rsdp,
-                                    &rsdp->checksum);
+        (char *)rsdp - rsdp_table->data, sizeof *rsdp,
+        (char *)&rsdp->checksum - rsdp_table->data);
 
     return rsdp_table;
 }
-- 
MST

  parent reply	other threads:[~2016-06-07 12:58 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1465304171-10874-1-git-send-email-mst@redhat.com>
2016-06-07 12:56 ` [Qemu-devel] [PULL v2 01/25] tests: acpi: report names of expected files in verbose mode Michael S. Tsirkin
2016-06-07 12:56 ` [Qemu-devel] [PULL v2 02/25] acpi: add aml_debug() Michael S. Tsirkin
2016-06-07 12:56 ` [Qemu-devel] [PULL v2 03/25] acpi: add aml_refof() Michael S. Tsirkin
2016-06-07 12:56 ` [Qemu-devel] [PULL v2 04/25] pc: acpi: remove AML for empty/not used GPE handlers Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 05/25] pc: acpi: consolidate CPU hotplug AML Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 06/25] pc: acpi: consolidate \GPE._E02 with the rest of " Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 07/25] pc: acpi: cpu-hotplug: make AML CPU_foo defines local to cpu_hotplug_acpi_table.c Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 08/25] pc: acpi: mark current CPU hotplug functions as legacy Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 09/25] pc: acpi: consolidate legacy CPU hotplug in one file Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 10/25] pc: acpi: simplify build_legacy_cpu_hotplug_aml() signature Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 11/25] pc: acpi: cpuhp-legacy: switch ProcessorID to possible_cpus idx Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 12/25] tests: acpi: update tables with consolidated legacy cpu-hotplug AML Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 13/25] ipmi: rework the fwinfo to be fetched from the interface Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 14/25] pc: Postpone SMBIOS table installation to post machine init Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 15/25] acpi: extend ACPI interface to provide send_event hook Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 16/25] pc: use AcpiDeviceIfClass.send_event to issue GPE events Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 17/25] acpi: convert linker from GArray to BIOSLinker structure Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 18/25] acpi: simplify bios_linker API by removing redundant 'table' argument Michael S. Tsirkin
2016-06-07 12:57 ` [Qemu-devel] [PULL v2 19/25] acpi: cleanup bios_linker_loader_cleanup() Michael S. Tsirkin
2016-06-07 12:58 ` [Qemu-devel] [PULL v2 20/25] tpm: apci: cleanup TCPA table initialization Michael S. Tsirkin
2016-06-07 12:58 ` [Qemu-devel] [PULL v2 21/25] acpi: make bios_linker_loader_add_pointer() API offset based Michael S. Tsirkin
2016-06-07 12:58 ` Michael S. Tsirkin [this message]
2016-06-07 12:58 ` [Qemu-devel] [PULL v2 23/25] pc-dimm: get memory region from ->get_memory_region() Michael S. Tsirkin
2016-06-07 12:58 ` [Qemu-devel] [PULL v2 24/25] pc-dimm: introduce realize callback Michael S. Tsirkin
2016-06-07 12:58 ` [Qemu-devel] [PULL v2 25/25] virtio: move bi-endian target support to a single location Michael S. Tsirkin

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=20160607155810-mutt-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=zhaoshenglong@huawei.com \
    /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 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).