From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
laurent@vivier.eu, qemu-devel@nongnu.org,
elliotnunn@fastmail.com
Subject: Re: [PATCH v2 1/2] nubus-device: round Declaration ROM memory region address to qemu_target_page_size()
Date: Tue, 9 Jan 2024 00:06:51 +0100 [thread overview]
Message-ID: <cc1c2370-e516-478b-abfa-620cc8542118@linaro.org> (raw)
In-Reply-To: <20240108192013.272112-2-mark.cave-ayland@ilande.co.uk>
On 8/1/24 20:20, Mark Cave-Ayland wrote:
> Declaration ROM binary images can be any arbitrary size, however if a host ROM
> memory region is not aligned to qemu_target_page_size() then we fail the
> "assert(!(iotlb & ~TARGET_PAGE_MASK))" check in tlb_set_page_full().
>
> Ensure that the host ROM memory region is aligned to qemu_target_page_size()
> and adjust the offset at which the Declaration ROM image is loaded, since Nubus
> ROM images are unusual in that they are aligned to the end of the slot address
> space.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
> hw/nubus/nubus-device.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/hw/nubus/nubus-device.c b/hw/nubus/nubus-device.c
> index 49008e4938..e4f824d58b 100644
> --- a/hw/nubus/nubus-device.c
> +++ b/hw/nubus/nubus-device.c
> @@ -10,6 +10,7 @@
>
> #include "qemu/osdep.h"
> #include "qemu/datadir.h"
> +#include "exec/target_page.h"
> #include "hw/irq.h"
> #include "hw/loader.h"
> #include "hw/nubus/nubus.h"
> @@ -30,7 +31,7 @@ static void nubus_device_realize(DeviceState *dev, Error **errp)
> NubusDevice *nd = NUBUS_DEVICE(dev);
> char *name, *path;
> hwaddr slot_offset;
> - int64_t size;
> + int64_t size, align_size;
Both are 'size_t'.
> int ret;
>
> /* Super */
> @@ -76,16 +77,23 @@ static void nubus_device_realize(DeviceState *dev, Error **errp)
> }
>
> name = g_strdup_printf("nubus-slot-%x-declaration-rom", nd->slot);
> - memory_region_init_rom(&nd->decl_rom, OBJECT(dev), name, size,
> +
> + /*
> + * Ensure ROM memory region is aligned to target page size regardless
> + * of the size of the Declaration ROM image
> + */
> + align_size = ROUND_UP(size, qemu_target_page_size());
> + memory_region_init_rom(&nd->decl_rom, OBJECT(dev), name, align_size,
> &error_abort);
> - ret = load_image_mr(path, &nd->decl_rom);
> + ret = load_image_size(path, memory_region_get_ram_ptr(&nd->decl_rom) +
> + (uintptr_t)align_size - size, size);
memory_region_get_ram_ptr() returns a 'void *' so this looks dubious.
Maybe use a local variable to ease offset calculation?
char *rombase = memory_region_get_ram_ptr(&nd->decl_rom);
ret = load_image_size(path, rombase + align_size - size, size);
Otherwise KISS but ugly:
ret = load_image_size(path,
(void *)((uintptr_t)memory_region_get_ram_ptr(&nd->decl_rom)
+ align_size - size), size);
> g_free(path);
> g_free(name);
> if (ret < 0) {
> error_setg(errp, "could not load romfile \"%s\"", nd->romfile);
> return;
> }
> - memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - size,
> + memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - align_size,
> &nd->decl_rom);
> }
> }
next prev parent reply other threads:[~2024-01-08 23:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-08 19:20 [PATCH v2 0/2] nubus: add nubus-virtio-mmio device Mark Cave-Ayland
2024-01-08 19:20 ` [PATCH v2 1/2] nubus-device: round Declaration ROM memory region address to qemu_target_page_size() Mark Cave-Ayland
2024-01-08 23:06 ` Philippe Mathieu-Daudé [this message]
2024-01-09 21:53 ` Mark Cave-Ayland
2024-01-11 6:22 ` Philippe Mathieu-Daudé
2024-01-11 10:04 ` Mark Cave-Ayland
2024-01-08 19:20 ` [PATCH v2 2/2] nubus: add nubus-virtio-mmio device Mark Cave-Ayland
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=cc1c2370-e516-478b-abfa-620cc8542118@linaro.org \
--to=philmd@linaro.org \
--cc=elliotnunn@fastmail.com \
--cc=laurent@vivier.eu \
--cc=mark.cave-ayland@ilande.co.uk \
--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 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).