From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PATCH for-6.0 v2 0/5] arm: Make M-profile VTOR loads on reset handle memory aliasin
Date: Thu, 18 Mar 2021 17:48:18 +0000 [thread overview]
Message-ID: <20210318174823.18066-1-peter.maydell@linaro.org> (raw)
For Arm M-profile CPUs, on reset the CPU must load its initial PC and
SP from a vector table in guest memory. Because we can't guarantee
reset ordering, we have to handle the possibility that the ROM blob
loader's reset function has not yet run when the CPU resets, in which
case the data in an ELF file specified by the user won't be in guest
memory to be read yet.
We work around the reset ordering problem by checking whether the ROM
blob loader has any data for the address where the vector table is,
using rom_ptr(). Unfortunately this does not handle the possibility
of memory aliasing. For many M-profile boards, memory can be accessed
via multiple possible physical addresses; if the board has the vector
table at address X but the user's ELF file loads data via a different
address Y which is an alias to the same underlying guest RAM then
rom_ptr() will not find it.
This series handles the possibility of aliasing by iterating through
the whole FlatView of the CPU's address space checking for other
mappings of the MemoryRegion corresponding to the location of the
vector table. If we find any aliases we use rom_ptr() to see if the
ROM blob loader has any data there.
Changes from v1:
* do a little bit more cleanup on flatview_for_each_range():
- switch return type to bool
- document it
* put the "rom_ptr() but handle aliases" functionality into
a generally-available function rom_ptr_for_as()
We discussed the idea of just making rom_ptr() itself handle the
aliasing, but that would require looking at all the callsites to
identify a good address space to use; it's also a bit more invasive to
other platforms than I would like at this point in the release
cycle. So I opted for "provide a new function" as a safer and simpler
compromise. In many cases callers of rom_ptr() probably should be
changed to use rom_ptr_for_as() at some point, though.
I realised that although if we can get reset ordering sorted out
we can remove this use of rom_ptr()/rom_ptr_from_as() from the
Arm CPU reset function, we will still have the same "need to read
the blob data directly" problem for board init functions which
are the bulk of the callers of rom_ptr(). I suppose in theory
we could rewrite those to postpone their accessing of the data
until reset, but that sounds like it could get complicated. Anyway,
that means that rom_ptr_for_as() might have a fairly long life.
thanks
-- PMM
Peter Maydell (5):
memory: Make flatview_cb return bool, not int
memory: Document flatview_for_each_range()
memory: Add offset_in_region to flatview_cb arguments
hw/core/loader: Add new function rom_ptr_for_as()
target/arm: Make M-profile VTOR loads on reset handle memory aliasing
include/exec/memory.h | 32 ++++++++++++--
include/hw/loader.h | 31 ++++++++++++++
hw/core/loader.c | 75 +++++++++++++++++++++++++++++++++
softmmu/memory.c | 4 +-
target/arm/cpu.c | 2 +-
tests/qtest/fuzz/generic_fuzz.c | 11 +++--
6 files changed, 145 insertions(+), 10 deletions(-)
--
2.20.1
next reply other threads:[~2021-03-18 18:10 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-18 17:48 Peter Maydell [this message]
2021-03-18 17:48 ` [PATCH for-6.0 v2 1/5] memory: Make flatview_cb return bool, not int Peter Maydell
2021-03-18 18:39 ` Richard Henderson
2021-03-18 20:55 ` Philippe Mathieu-Daudé
2021-03-18 17:48 ` [PATCH for-6.0 v2 2/5] memory: Document flatview_for_each_range() Peter Maydell
2021-03-18 18:40 ` Richard Henderson
2021-03-18 20:58 ` Philippe Mathieu-Daudé
2021-03-18 17:48 ` [PATCH for-6.0 v2 3/5] memory: Add offset_in_region to flatview_cb arguments Peter Maydell
2021-03-18 18:40 ` Richard Henderson
2021-03-18 21:01 ` Philippe Mathieu-Daudé
2021-03-18 17:48 ` [PATCH for-6.0 v2 4/5] hw/core/loader: Add new function rom_ptr_for_as() Peter Maydell
2021-03-18 18:44 ` Richard Henderson
2021-03-18 19:02 ` Peter Maydell
2021-03-18 21:14 ` Richard Henderson
2021-03-18 21:28 ` Peter Maydell
2021-03-18 21:56 ` Richard Henderson
2021-03-18 17:48 ` [PATCH for-6.0 v2 5/5] target/arm: Make M-profile VTOR loads on reset handle memory aliasing Peter Maydell
2021-03-18 18:44 ` Richard Henderson
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=20210318174823.18066-1-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=f4bug@amsat.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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).