From: Peter Maydell <peter.maydell@linaro.org>
To: QEMU Developers <qemu-devel@nongnu.org>
Cc: Thomas Hanson <thomas.hanson@linaro.org>,
Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] best way to implement emulation of AArch64 tagged addresses
Date: Mon, 4 Apr 2016 16:51:45 +0100 [thread overview]
Message-ID: <CAFEAcA8c4opwvO6LJ-Ecai3x77goxyhj7P8OuzgB64As752Fiw@mail.gmail.com> (raw)
I was wondering about what the best way is to implement emulation in
TCG of the AArch64 tagged-addresses feature.
(cc'd Tom Hanson who's looking at actually writing code for this,
and RTH for review of the design sketch below.)
Quick summary of the feature (which is described in the v8 ARM ARM
section D4.1.1 "Address tagging in AArch64 state"):
If the 'tagged addresses' bit in TCR_EL1 is set then:
* the top 8 bits of virtual addresses are ignored for doing va-to-pa
translation (addresses are sign extended from bit 55)
* the top 8 bits are ignored for purposes of TLB-invalidate-by-address
* various operations that set the PC (branches, exception returns, etc)
sign-extend the new PC value from bit 55
* for a data abort or watchpoint hit, the virtual address reported in
the FAR (fault address register) includes the tag bits
(Complication, for EL0/EL1 there are two 'enable tags' bits
in TCR_EL1, and which one you use depends on bit 55 of the VA,
so you can (say) enable tags for the "lower" half of the virtual
address space, and disable them for the "higher" half.)
I thought of two possible ways to approach implementing this.
Option (1) would be to change the codegen in translate-a64.c so that
we mask out high bits before doing the QEMU load/store TCG op.
Option (2) leaves the VA that we pass to the TCG load/store alone
(ie with tag bits intact) and tries to handle this all in the va-to-pa
code.
I think option (1) is a non-starter because of that requirement to
report the full address with tags in the FAR (as well as being slower
due to all the extra masking on memory operations). So that leaves
option (2), possibly with some help from common code to make things
a bit less awkward.
In particular I think if you just do the relevant handling of the tag
bits in target-arm's get_phys_addr() and its subroutines then this
should work ok, with the exceptions that:
* the QEMU TLB code will think that [tag A + address X] and
[tag B + address X] are different virtual addresses and they will
miss each other in the TLB
* tlb invalidate by address becomes nasty because we need to invalidate
[every tag + address X]
Can we fix those just by having arm_tlb_fill() call
tlb_set_page_with_attrs() with the vaddr with the tag masked out?
Have I missed some complication that would make this not work?
[NB: this is all assuming softmmu; getting tagged addresses to work
in linux-user mode would require doing the masking in translate.c,
but I definitely don't want two implementations so I guess we just
ignore linux-user here.]
thanks
-- PMM
next reply other threads:[~2016-04-04 15:52 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-04 15:51 Peter Maydell [this message]
2016-04-04 16:28 ` [Qemu-devel] best way to implement emulation of AArch64 tagged addresses Richard Henderson
2016-04-04 16:31 ` Peter Maydell
2016-04-04 17:56 ` Richard Henderson
2016-04-08 17:20 ` Tom Hanson
2016-04-08 18:06 ` Peter Maydell
2016-04-08 18:10 ` Richard Henderson
2016-04-09 0:29 ` Thomas Hanson
2016-04-09 15:57 ` Richard Henderson
2016-04-11 12:58 ` Thomas Hanson
2016-04-13 13:36 ` Tom Hanson
2016-04-04 16:35 ` Peter Maydell
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=CAFEAcA8c4opwvO6LJ-Ecai3x77goxyhj7P8OuzgB64As752Fiw@mail.gmail.com \
--to=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=thomas.hanson@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).