On 26/03/2021 00:27, Philippe Mathieu-Daudé wrote:
> Hi,
>
> This series introduce the memory_region_add_subregion_aliased()
> helper which basically create a device which maps a subregion
> multiple times.
>
> Examples are easier, so having a subregion aliased every @span_size
> then mapped onto a container at an offset, you get something like:
>
> ^-----------^
> | |
> | |
> | +-------+ | +---------+ <--+
> | | +---------+ |
> | | | | |
> | | +-----------> | alias#3 | |
> | | | | | |
> | | | +---------+ |
> | | | +---------+ |
> | | | | | |
> | | | +-------> | alias#2 | |
> | | | | | | |region
> | container | | | +---------+ | size
> | | | | +---------+ |
> | | | | | | |
> | | | | +----> | alias#1 | |
> | | | | | | | |
> | | | | | +---------+ <--+ |
> | | +-+---+--+--+ +---------+ | |
> | | | | | | |span |
> | | | subregion +-> | alias#0 | |size |
> offset | | | | | | | |
> +----> | +-------+ | +-----------+ +---------+ <--+ <--+
> | | |
> | | |
> | | |
> | | |
> | | |
> | ^-----------^
>
> I know it need more documentation and tests, but I prefer to send
> as draft RFC for early review before spending more time on it.
>
> Based-on: <20210325120921.858993-1-f4bug@amsat.org>
> https://www.mail-archive.com/qemu-devel@nongnu.org/msg795218.html
>
> Philippe Mathieu-Daudé (10):
> hw/misc: Add device to help managing aliased memory regions
> hw/arm/musicpal: Open-code pflash_cfi02_register() call
> hw/arm/musicpal: Map flash using memory_region_add_subregion_aliased()
> hw/arm/digic: Open-code pflash_cfi02_register() call
> hw/arm/digic: Map flash using memory_region_add_subregion_aliased()
> hw/block/pflash_cfi02: Remove pflash_setup_mappings()
> hw/block/pflash_cfi02: Simplify pflash_cfi02_register() prototype
> hw/misc/aliased_region: Simplify aliased I/O regions
> hw/m68k/q800: Add MacIO container
> hw/m68k/q800: Map MacIO using memory_region_add_subregion_aliased()
>
> include/hw/block/flash.h | 1 -
> include/hw/misc/aliased_region.h | 91 +++++++++++++++
> hw/arm/digic_boards.c | 28 ++++-
> hw/arm/musicpal.c | 29 ++++-
> hw/arm/xilinx_zynq.c | 2 +-
> hw/block/pflash_cfi02.c | 36 +-----
> hw/lm32/lm32_boards.c | 4 +-
> hw/m68k/q800.c | 61 +++++-----
> hw/misc/aliased_region.c | 185 +++++++++++++++++++++++++++++++
> hw/ppc/ppc405_boards.c | 6 +-
> hw/sh4/r2d.c | 2 +-
> MAINTAINERS | 6 +
> hw/arm/Kconfig | 2 +
> hw/m68k/Kconfig | 1 +
> hw/misc/Kconfig | 3 +
> hw/misc/meson.build | 1 +
> 16 files changed, 375 insertions(+), 83 deletions(-)
> create mode 100644 include/hw/misc/aliased_region.h
> create mode 100644 hw/misc/aliased_region.c
Now this is interesting. Are there any limits to the number of aliased memory regions
supported? In my q800 dev branch I have the following commit:
https://github.com/mcayland/qemu/commit/272547abbca69906dab5d94af32c5117691a1050
("q800: reimplement mac-io region aliasing using IO memory region") to implement
similar functionality because adding just one more device into the aliased region is
enough to cause QEMU to assert with "phys_section_add: Assertion `map->sections_nb <
TARGET_PAGE_SIZE'
failed" on startup.
ATB,
Mark.