From: Greg Bellows <greg.bellows@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Sergey Fedorov <serge.fdrv@gmail.com>,
QEMU Developers <qemu-devel@nongnu.org>,
Fabian Aggeler <aggelerf@ethz.ch>,
"Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Subject: Re: [Qemu-devel] [PATCH v8 07/27] target-arm: insert AArch32 cpregs twice into hashtable
Date: Tue, 4 Nov 2014 16:20:02 -0600 [thread overview]
Message-ID: <CAOgzsHWj2=AAUiiMzsHht1r3PLcxyh2Ms-HLh_joSB9J5tzNOQ@mail.gmail.com> (raw)
In-Reply-To: <CAOgzsHWkqGL+1Ld5_8QnsJC2m4-XP7NMK4YremLy4d-sj1BbTw@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 11129 bytes --]
I have fixed the code to properly handle the CONTEXTIDR/FCSEIDR registers.
This is done in two parts:
1) I broke the FCSEIDR and CONTEXTIDR into separate secure/non-secure
definitions.
2) I updated the check that filters the secure duplicate instance caused by
registering unbanked register twice.
On 31 October 2014 14:01, Greg Bellows <greg.bellows@linaro.org> wrote:
>
>
> On 31 October 2014 07:44, Peter Maydell <peter.maydell@linaro.org> wrote:
>
>> On 30 October 2014 21:28, Greg Bellows <greg.bellows@linaro.org> wrote:
>> > From: Fabian Aggeler <aggelerf@ethz.ch>
>> >
>> > Prepare for cp register banking by inserting every cp register twice,
>> > once for secure world and once for non-secure world.
>> >
>> > Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
>> > Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
>> >
>> > ---
>> >
>> > v7 -> v8
>> > - Updated define registers asserts to allow either a non-zero
>> fieldoffset or
>> > non-zero bank_fieldoffsets.
>> > - Updated CP register hashing to always set the register fieldoffset
>> when
>> > banked register offsets are specified.
>> >
>> > v5 -> v6
>> > - Fixed NS-bit number in the CPREG hash lookup from 27 to 29.
>> > - Switched to dedicated CPREG secure flags.
>> > - Fixed disablement of reset and migration of common 32/64-bit
>> registers.
>> > - Globally replace Aarch# with AArch#
>> >
>> > v4 -> v5
>> > - Added use of ARM CP secure/non-secure bank flags during register
>> processing
>> > in define_one_arm_cp_reg_with_opaque(). We now only register the
>> specified
>> > bank if only one flag is specified, otherwise we register both a
>> secure and
>> > non-secure instance.
>> > ---
>> > target-arm/helper.c | 98
>> ++++++++++++++++++++++++++++++++++++++++++++---------
>> > 1 file changed, 82 insertions(+), 16 deletions(-)
>> >
>> > diff --git a/target-arm/helper.c b/target-arm/helper.c
>> > index 959a46e..c1c6303 100644
>> > --- a/target-arm/helper.c
>> > +++ b/target-arm/helper.c
>> > @@ -3296,22 +3296,62 @@ static void add_cpreg_to_hashtable(ARMCPU *cpu,
>> const ARMCPRegInfo *r,
>> > uint32_t *key = g_new(uint32_t, 1);
>> > ARMCPRegInfo *r2 = g_memdup(r, sizeof(ARMCPRegInfo));
>> > int is64 = (r->type & ARM_CP_64BIT) ? 1 : 0;
>> > - if (r->state == ARM_CP_STATE_BOTH && state == ARM_CP_STATE_AA32) {
>> > - /* The AArch32 view of a shared register sees the lower 32 bits
>> > - * of a 64 bit backing field. It is not migratable as the
>> AArch64
>> > - * view handles that. AArch64 also handles reset.
>> > - * We assume it is a cp15 register if the .cp field is left
>> unset.
>> > +
>> > + if (r->bank_fieldoffsets[0] && r->bank_fieldoffsets[1]) {
>> > + /* Register is banked (using both entries in array).
>> > + * Overwriting fieldoffset as the array is only used to define
>> > + * banked registers but later only fieldoffset is used.
>> > */
>> > - if (r2->cp == 0) {
>> > - r2->cp = 15;
>> > + r2->fieldoffset = r->bank_fieldoffsets[nsbit];
>> > + }
>> > +
>> > + if (state == ARM_CP_STATE_AA32) {
>> > + /* Clear the secure state flags and set based on incoming
>> nsbit */
>> > + r2->secure &= ~(ARM_CP_SECSTATE_S | ARM_CP_SECSTATE_NS);
>> > + r2->secure |= ARM_CP_SECSTATE_S << nsbit;
>>
>> This bitmanipulation looks like leftover from when these were in 'state';
>> r2->secure = secstate;
>> should be sufficient (and you might as well put this down below the
>> 'r2->state = state' assignment, since it's harmless to do it for all
>> regdefs including 64 bit ones).
>>
>>
> It was in the previous code, but it is still necessary for marking whether
> the given register is secure or not.
>
>
>> > +
>> > + if (r->bank_fieldoffsets[0] && r->bank_fieldoffsets[1]) {
>> > + /* If the register is banked and V8 is enabled then we
>> don't need
>> > + * to migrate or reset the AArch32 version of the banked
>> > + * registers as this will be handled through the AArch64
>> view.
>> > + * If v7 then we don't need to migrate or reset the AArch32
>> > + * non-secure bank as this will be handled through the
>> AArch64
>> > + * view. In this case the secure bank is not mirrored, so
>> we must
>> > + * preserve it's reset criteria and allow it to be
>> migrated.
>> > + *
>> > + * The exception to the above is cpregs with a crn of 13
>> > + * (specifically FCSEIDR and CONTEXTIDR) in which case
>> there may
>> > + * not be an AArch64 equivalent for one or either bank so
>> migration
>> > + * and reset must be preserved.
>> > + */
>>
>> I'm not sure what this paragraph is trying to say. The AArch64 equivalent
>> of CONTEXTIDR(NS) is CONTEXTIDR_EL1. In v8 FCSEIDR is a constant RAZ/WI
>> register, so migration and reset aren't relevant anyway.
>>
>> In any case, if we only have a couple of special case registers where
>> this bank handling doesn't work, I suggest that we should handle them
>> by having two separate reginfo structs for the S and NS versions,
>> rather than special casing a specific crn value here.
>>
>
> It does not sound like the comment was clear. The point of this code was
> to disable migration and reset of one or both banks. If we know there is
> an aarch64 version (BOTH) then we know we can disable the ns bank
> instance. If we are ARMv8 then we know that we can also disable the sec
> bank instance. However, there was an exception in that neither CONTEXTIDR
> nor FCSEIDR actually have an ARMv8/AArch64 secure counterparts, so we still
> have to allow migration and reset even if ARMv8 is supported.
>
> You are correct that FCSEIDR is RAZ/WI in ARMv8, which is the exact issue
> as this is not the case in ARMv7. I'll work through it to see if adding
> separate entries alleviates the need for the ugly conditional. BTW, I
> didn't like this either, but at the time I hadn't found a more elegant
> approach.
>
>
>>
>> > + if (r->state == ARM_CP_STATE_BOTH) {
>> > + if ((arm_feature(&cpu->env, ARM_FEATURE_V8) && r->crn
>> != 13) ||
>> > + nsbit) {
>> > + r2->type |= ARM_CP_NO_MIGRATE;
>> > + r2->resetfn = arm_cp_reset_ignore;
>> > + }
>> > + }
>> > + } else if (!nsbit) {
>> > + /* The register is not banked so we only want to allow
>> migration of
>> > + * the non-secure instance.
>> > + */
>> > + r2->type |= ARM_CP_NO_MIGRATE;
>> > + r2->resetfn = arm_cp_reset_ignore;
>> > }
>> > - r2->type |= ARM_CP_NO_MIGRATE;
>> > - r2->resetfn = arm_cp_reset_ignore;
>> > +
>> > + if (r->state == ARM_CP_STATE_BOTH) {
>> > + /* We assume it is a cp15 register if the .cp field is
>> left unset.
>> > + */
>> > + if (r2->cp == 0) {
>> > + r2->cp = 15;
>> > + }
>> > +
>> > #ifdef HOST_WORDS_BIGENDIAN
>> > - if (r2->fieldoffset) {
>> > - r2->fieldoffset += sizeof(uint32_t);
>> > - }
>> > + if (r2->fieldoffset) {
>> > + r2->fieldoffset += sizeof(uint32_t);
>> > + }
>> > #endif
>> > + }
>> > }
>> > if (state == ARM_CP_STATE_AA64) {
>> > /* To allow abbreviation of ARMCPRegInfo
>> > @@ -3460,10 +3500,14 @@ void define_one_arm_cp_reg_with_opaque(ARMCPU
>> *cpu,
>> > */
>> > if (!(r->type & (ARM_CP_SPECIAL|ARM_CP_CONST))) {
>> > if (r->access & PL3_R) {
>> > - assert(r->fieldoffset || r->readfn);
>> > + assert((r->fieldoffset ||
>> > + (r->bank_fieldoffsets[0] &&
>> r->bank_fieldoffsets[1])) ||
>> > + r->readfn);
>> > }
>> > if (r->access & PL3_W) {
>> > - assert(r->fieldoffset || r->writefn);
>> > + assert((r->fieldoffset ||
>> > + (r->bank_fieldoffsets[0] &&
>> r->bank_fieldoffsets[1])) ||
>> > + r->writefn);
>> > }
>> > }
>> > /* Bad type field probably means missing sentinel at end of reg
>> list */
>> > @@ -3476,8 +3520,30 @@ void define_one_arm_cp_reg_with_opaque(ARMCPU
>> *cpu,
>> > if (r->state != state && r->state !=
>> ARM_CP_STATE_BOTH) {
>> > continue;
>> > }
>> > - add_cpreg_to_hashtable(cpu, r, opaque, state,
>> > - crm, opc1, opc2, SCR_NS);
>> > + if (state == ARM_CP_STATE_AA32) {
>> > + /* Under AArch32 CP registers can be common
>> > + * (same for secure and non-secure world) or
>> banked.
>> > + */
>> > + uint32_t s =
>> > + r->secure & (ARM_CP_SECSTATE_S |
>> ARM_CP_SECSTATE_NS);
>> > + if (ARM_CP_SECSTATE_S == s) {
>>
>> As a general remark, don't use this sort of "yoda conditional" with the
>> constant on the LHS of the ==, please.
>>
>
> Fixed in v9.
>
>
>>
>> > + add_cpreg_to_hashtable(cpu, r, opaque,
>> state,
>> > + crm, opc1, opc2, !SCR_NS);
>> > + } else if (ARM_CP_SECSTATE_NS == s) {
>> > + add_cpreg_to_hashtable(cpu, r, opaque,
>> state,
>> > + crm, opc1, opc2, SCR_NS);
>> > + } else {
>> > + add_cpreg_to_hashtable(cpu, r, opaque,
>> state,
>> > + crm, opc1, opc2, !SCR_NS);
>> > + add_cpreg_to_hashtable(cpu, r, opaque,
>> state,
>> > + crm, opc1, opc2, SCR_NS);
>> > + }
>>
>> Given the change to make add_cpreg_to_hashtable() take an ARM_CP_SECSTATE*
>> constant that I suggested in the previous patch, you can simplify this to
>>
>> switch (r->secure) {
>> case ARM_CP_SECSTATE_S:
>> case ARM_CP_SECSTATE_NS:
>> add_cpreg_to_hashtable(cpu, r, opaque, state, r->secure,
>> crm, opc1, opc2);
>> break;
>> default:
>> add_cpreg_to_hashtable(cpu, r, opaque, state,
>> ARM_CP_SECSTATE_S, crm, opc1, opc2);
>> add_cpreg_to_hashtable(cpu, r, opaque, state,
>> ARM_CP_SECSTATE_NS, crm, opc1, opc2);
>> break;
>> }
>>
>
>> > + } else {
>> > + /* AArch64 registers get mapped to non-secure
>> instance
>> > + * of AArch32 */
>> > + add_cpreg_to_hashtable(cpu, r, opaque, state,
>> > + crm, opc1, opc2, SCR_NS);
>> > + }
>> > }
>> > }
>> > }
>> > --
>> > 1.8.3.2
>>
>> thanks
>> -- PMM
>>
>
>
[-- Attachment #2: Type: text/html, Size: 14983 bytes --]
next prev parent reply other threads:[~2014-11-04 22:20 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-30 21:28 [Qemu-devel] [PATCH v8 00/27] target-arm: add Security Extensions for CPUs Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 01/27] target-arm: extend async excp masking Greg Bellows
2014-10-31 19:00 ` Peter Maydell
2014-11-05 21:12 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 02/27] target-arm: add async excp target_el function Greg Bellows
2014-10-31 11:56 ` Peter Maydell
2014-10-31 14:14 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 03/27] target-arm: add banked register accessors Greg Bellows
2014-10-31 16:50 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 04/27] target-arm: add non-secure Translation Block flag Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 05/27] target-arm: add CPREG secure state support Greg Bellows
2014-10-31 12:15 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 06/27] target-arm: add secure state bit to CPREG hash Greg Bellows
2014-10-31 12:28 ` Peter Maydell
2014-10-31 12:31 ` Peter Maydell
2014-10-31 16:20 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 07/27] target-arm: insert AArch32 cpregs twice into hashtable Greg Bellows
2014-10-31 12:44 ` Peter Maydell
2014-10-31 19:01 ` Greg Bellows
2014-11-04 22:20 ` Greg Bellows [this message]
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 08/27] target-arm: move AArch32 SCR into security reglist Greg Bellows
2014-10-31 12:06 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 09/27] target-arm: implement IRQ/FIQ routing to Monitor mode Greg Bellows
2014-10-31 12:01 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 10/27] target-arm: add NSACR register Greg Bellows
2014-10-31 13:24 ` Peter Maydell
2014-10-31 21:09 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 11/27] target-arm: add SDER definition Greg Bellows
2014-10-31 13:30 ` Peter Maydell
2014-10-31 21:17 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 12/27] target-arm: add MVBAR support Greg Bellows
2014-10-31 13:35 ` Peter Maydell
2014-10-31 21:19 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 13/27] target-arm: add SCTLR_EL3 and make SCTLR banked Greg Bellows
2014-10-31 14:07 ` Peter Maydell
2014-10-31 21:51 ` Greg Bellows
2014-10-31 23:26 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 14/27] target-arm: respect SCR.FW, SCR.AW and SCTLR.NMFI Greg Bellows
2014-10-31 14:18 ` Peter Maydell
2014-11-03 14:57 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 15/27] target-arm: make CSSELR banked Greg Bellows
2014-10-31 14:23 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 16/27] target-arm: add TTBR0_EL3 and make TTBR0/1 banked Greg Bellows
2014-10-31 15:04 ` Peter Maydell
2014-11-04 22:44 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 17/27] target-arm: add TCR_EL3 and make TTBCR banked Greg Bellows
2014-10-31 15:07 ` Peter Maydell
2014-11-04 22:45 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 18/27] target-arm: make c2_mask and c2_base_mask banked Greg Bellows
2014-10-31 15:26 ` Peter Maydell
2014-11-04 22:46 ` Greg Bellows
2014-11-04 23:27 ` Peter Maydell
2014-11-05 15:09 ` Greg Bellows
2014-11-05 15:15 ` Peter Maydell
2014-11-05 15:18 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 19/27] target-arm: make DACR banked Greg Bellows
2014-10-31 15:38 ` Peter Maydell
2014-11-03 21:23 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 20/27] target-arm: make IFSR banked Greg Bellows
2014-10-31 16:18 ` Peter Maydell
2014-11-05 22:19 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 21/27] target-arm: make DFSR banked Greg Bellows
2014-10-31 16:19 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 22/27] target-arm: make IFAR/DFAR banked Greg Bellows
2014-10-31 16:24 ` Peter Maydell
2014-11-03 22:59 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 23/27] target-arm: make PAR banked Greg Bellows
2014-10-31 17:21 ` Peter Maydell
2014-11-03 22:58 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 24/27] target-arm: make VBAR banked Greg Bellows
2014-10-31 17:22 ` Peter Maydell
2014-11-03 22:06 ` Greg Bellows
2014-11-03 22:49 ` Peter Maydell
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 25/27] target-arm: make c13 cp regs banked (FCSEIDR, ...) Greg Bellows
2014-10-31 17:27 ` Peter Maydell
2014-11-03 22:57 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 26/27] target-arm: make MAIR0/1 banked Greg Bellows
2014-10-31 17:31 ` Peter Maydell
2014-11-03 23:00 ` Greg Bellows
2014-11-04 14:13 ` Greg Bellows
2014-10-30 21:28 ` [Qemu-devel] [PATCH v8 27/27] target-arm: add cpu feature EL3 to CPUs with Security Extensions Greg Bellows
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='CAOgzsHWj2=AAUiiMzsHht1r3PLcxyh2Ms-HLh_joSB9J5tzNOQ@mail.gmail.com' \
--to=greg.bellows@linaro.org \
--cc=aggelerf@ethz.ch \
--cc=edgar.iglesias@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=serge.fdrv@gmail.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 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).