qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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: Fri, 31 Oct 2014 14:01:29 -0500	[thread overview]
Message-ID: <CAOgzsHWkqGL+1Ld5_8QnsJC2m4-XP7NMK4YremLy4d-sj1BbTw@mail.gmail.com> (raw)
In-Reply-To: <CAFEAcA9y=qBQs5dbsnMxaZ_7zGVF0-KQcm5mq2MY8FfdwkmNTQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 10448 bytes --]

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: 14017 bytes --]

  reply	other threads:[~2014-10-31 19:01 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 [this message]
2014-11-04 22:20       ` Greg Bellows
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=CAOgzsHWkqGL+1Ld5_8QnsJC2m4-XP7NMK4YremLy4d-sj1BbTw@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).