All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: qemu devel list <qemu-devel@nongnu.org>,
	Alistair Francis <alistair.francis@xilinx.com>,
	Igor Mammedov <imammedo@redhat.com>,
	Michael Walle <michael@walle.cc>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Shannon Zhao <zhaoshenglong@huawei.com>,
	qemu-arm@nongnu.org
Subject: Re: [Qemu-devel] [PATCH for-2.8 1/2] loader: fix handling of custom address spaces when adding ROM blobs
Date: Tue, 29 Nov 2016 18:31:15 +0200	[thread overview]
Message-ID: <20161129183016-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20161128195701.24912-2-lersek@redhat.com>

On Mon, Nov 28, 2016 at 08:57:00PM +0100, Laszlo Ersek wrote:
> * Commit 3e76099aacb4 ("loader: Allow a custom AddressSpace when loading
>   ROMs") introduced the "Rom.as" field:
> 
>   (1) It modified the utility callers of rom_insert() to take "as" as a
>       new parameter from *their* callers, and set "rom->as" from that
>       parameter. The functions covered were rom_add_file() and
>       rom_add_elf_program().
> 
>   (2) It also modified rom_insert() itself, to auto-assign
>       "&address_space_memory", in case the external caller passed -- and
>       the utility caller forwarded -- as=NULL.
> 
>   Except, commit 3e76099aacb4 forgot to update the third utility caller of
>   rom_insert(), under point (1), namely rom_add_blob().
> 
> * Later, commit 5e774eb3bd264 ("loader: Add AddressSpace loading support
>   to uImages") added the load_uimage_as() function, and the
>   rom_add_blob_fixed_as() function-like macro, with the necessary changes
>   elsewhere to propagate the new "as" parameter to rom_add_blob():
> 
>     load_uimage_as()
>       load_uboot_image()
>         rom_add_blob_fixed_as()
>           rom_add_blob()
> 
>   At this point, the signature (and workings) of rom_add_blob() had been
>   broken already, and the rom_add_blob_fixed_as() macro passed its "_as"
>   parameter to rom_add_blob() as "callback_opaque". Given that the
>   "fw_callback" parameter itself was set to NULL (correctly), this did no
>   additional damage (the opaque arg would never be used), but ultimately
>   it broke the new functionality of load_uimage_as().
> 
> * The load_uimage_as() function would be put to use in one of the later
>   patches, commit e481a1f63c93 ("generic-loader: Add a generic loader").
> 
> * We can fix this only in a unified patch now. Append "AddressSpace *as"
>   to the signature of rom_add_blob(), and handle the new parameter. Pass
>   NULL from all current callers, except from rom_add_blob_fixed_as(),
>   where "_as" has to be bumped to the proper position.
> 
> * Note that rom_add_file() rejects the case when both "mr" and "as" are
>   passed in as non-NULL. The action that this is apparently supposed to
>   prevent is the
> 
>     rom->mr = mr;
> 
>   assignment (that's the only place where the "mr" parameter is used in
>   rom_add_file()). In rom_add_blob() though, we have no "mr" parameter,
>   and the actions done on the fw_cfg branch:
> 
>     if (fw_file_name && fw_cfg) {
>         if (mc->rom_file_has_mr) {
>             data = rom_set_mr(rom, OBJECT(fw_cfg), devpath);
>             mr = rom->mr;
>         } else {
>             data = rom->data;
>         }
> 
>   reflect those that are performed by rom_add_file() too (with mr==NULL):
> 
>     if (rom->fw_file && fw_cfg) {
>         if ((!option_rom || mc->option_rom_has_mr) &&
>             mc->rom_file_has_mr) {
>             data = rom_set_mr(rom, OBJECT(fw_cfg), devpath);
>         } else {
>             data = rom->data;
>         }
> 
>   Hence we need no additional restrictions in rom_add_blob().
> 
> * Stable is not affected as both problematic commits appeared first in
>   v2.8.0-rc0.
> 
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Cc: Alistair Francis <alistair.francis@xilinx.com>
> Cc: Igor Mammedov <imammedo@redhat.com>
> Cc: Michael Walle <michael@walle.cc>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> Cc: Shannon Zhao <zhaoshenglong@huawei.com>
> Cc: qemu-arm@nongnu.org
> Cc: qemu-devel@nongnu.org
> Fixes: 3e76099aacb4dae0d37ebf95305369e03d1491e6
> Fixes: 5e774eb3bd264c76484906f4bd0fb38e00b8090e
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
>  hw/lm32/lm32_hwsetup.h   | 2 +-
>  include/hw/loader.h      | 6 +++---
>  hw/arm/virt-acpi-build.c | 2 +-
>  hw/core/loader.c         | 4 +++-
>  hw/i386/acpi-build.c     | 2 +-
>  5 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/lm32/lm32_hwsetup.h b/hw/lm32/lm32_hwsetup.h
> index b71e6eafba48..23e18784dffd 100644
> --- a/hw/lm32/lm32_hwsetup.h
> +++ b/hw/lm32/lm32_hwsetup.h
> @@ -75,7 +75,7 @@ static inline void hwsetup_create_rom(HWSetup *hw,
>          hwaddr base)
>  {
>      rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE,
> -                 TARGET_PAGE_SIZE, base, NULL, NULL, NULL);
> +                 TARGET_PAGE_SIZE, base, NULL, NULL, NULL, NULL);
>  }
>  
>  static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
> diff --git a/include/hw/loader.h b/include/hw/loader.h
> index 038170624d8f..0c864cfd6046 100644
> --- a/include/hw/loader.h
> +++ b/include/hw/loader.h
> @@ -180,7 +180,7 @@ MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
>                             size_t max_len, hwaddr addr,
>                             const char *fw_file_name,
>                             FWCfgReadCallback fw_callback,
> -                           void *callback_opaque);
> +                           void *callback_opaque, AddressSpace *as);

And so we are up to 10 parameters :(

No better ideas so

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

>  int rom_add_elf_program(const char *name, void *data, size_t datasize,
>                          size_t romsize, hwaddr addr, AddressSpace *as);
>  int rom_check_and_register_reset(void);
> @@ -194,7 +194,7 @@ void hmp_info_roms(Monitor *mon, const QDict *qdict);
>  #define rom_add_file_fixed(_f, _a, _i)          \
>      rom_add_file(_f, NULL, _a, _i, false, NULL, NULL)
>  #define rom_add_blob_fixed(_f, _b, _l, _a)      \
> -    rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL)
> +    rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL, NULL)
>  #define rom_add_file_mr(_f, _mr, _i)            \
>      rom_add_file(_f, NULL, 0, _i, false, _mr, NULL)
>  #define rom_add_file_as(_f, _as, _i)            \
> @@ -202,7 +202,7 @@ void hmp_info_roms(Monitor *mon, const QDict *qdict);
>  #define rom_add_file_fixed_as(_f, _a, _i, _as)          \
>      rom_add_file(_f, NULL, _a, _i, false, NULL, _as)
>  #define rom_add_blob_fixed_as(_f, _b, _l, _a, _as)      \
> -    rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, _as)
> +    rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL, _as)
>  
>  #define PC_ROM_MIN_VGA     0xc0000
>  #define PC_ROM_MIN_OPTION  0xc8000
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index f953610018c4..d4160dfa7d34 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -809,7 +809,7 @@ static MemoryRegion *acpi_add_rom_blob(AcpiBuildState *build_state,
>                                         uint64_t max_size)
>  {
>      return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1,
> -                        name, virt_acpi_build_update, build_state);
> +                        name, virt_acpi_build_update, build_state, NULL);
>  }
>  
>  static const VMStateDescription vmstate_virt_acpi_build = {
> diff --git a/hw/core/loader.c b/hw/core/loader.c
> index 6e022b5ad583..c0d645a87134 100644
> --- a/hw/core/loader.c
> +++ b/hw/core/loader.c
> @@ -978,7 +978,8 @@ err:
>  
>  MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
>                     size_t max_len, hwaddr addr, const char *fw_file_name,
> -                   FWCfgReadCallback fw_callback, void *callback_opaque)
> +                   FWCfgReadCallback fw_callback, void *callback_opaque,
> +                   AddressSpace *as)
>  {
>      MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
>      Rom *rom;
> @@ -986,6 +987,7 @@ MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
>  
>      rom           = g_malloc0(sizeof(*rom));
>      rom->name     = g_strdup(name);
> +    rom->as       = as;
>      rom->addr     = addr;
>      rom->romsize  = max_len ? max_len : len;
>      rom->datasize = len;
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 45a2ccfc4c60..9708cdc463df 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -2936,7 +2936,7 @@ static MemoryRegion *acpi_add_rom_blob(AcpiBuildState *build_state,
>                                         uint64_t max_size)
>  {
>      return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1,
> -                        name, acpi_build_update, build_state);
> +                        name, acpi_build_update, build_state, NULL);
>  }
>  
>  static const VMStateDescription vmstate_acpi_build = {
> -- 
> 2.9.2
> 

  parent reply	other threads:[~2016-11-29 16:31 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-28 19:56 [Qemu-devel] [PATCH for-2.8 0/2] loader fixes Laszlo Ersek
2016-11-28 19:57 ` [Qemu-devel] [PATCH for-2.8 1/2] loader: fix handling of custom address spaces when adding ROM blobs Laszlo Ersek
2016-11-28 23:07   ` Alistair Francis
2016-11-29 16:31   ` Michael S. Tsirkin [this message]
2016-11-28 19:57 ` [Qemu-devel] [PATCH for-2.8 2/2] loader: fix undefined behavior in rom_order_compare() Laszlo Ersek
2016-11-28 23:13   ` Alistair Francis
2016-11-29 16:29   ` Michael S. Tsirkin
2016-11-29 18:40     ` Laszlo Ersek
2016-11-29 13:37 ` [Qemu-devel] [PATCH for-2.8 0/2] loader fixes no-reply
2016-11-29 16:27   ` Michael S. Tsirkin
2016-11-29 18:41     ` Laszlo Ersek

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=20161129183016-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=alistair.francis@xilinx.com \
    --cc=imammedo@redhat.com \
    --cc=lersek@redhat.com \
    --cc=michael@walle.cc \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --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 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.