All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Greg Bellows <greg.bellows@linaro.org>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Peter Crosthwaite <peter.crosthwaite@xilinx.com>,
	Fabian Aggeler <aggelerf@ethz.ch>,
	QEMU Developers <qemu-devel@nongnu.org>,
	Sergey Fedorov <serge.fdrv@gmail.com>,
	Christoffer Dall <christoffer.dall@linaro.org>
Subject: Re: [Qemu-devel] [PATCH v3 19/32] target-arm: insert Aarch32 cpregs twice into hashtable
Date: Thu, 26 Jun 2014 13:56:11 +1000	[thread overview]
Message-ID: <20140626035611.GF13735@toto> (raw)
In-Reply-To: <CAOgzsHUo66mCrEPoyhfYn0h1Qn8nin0v+_S94bSAD29NJBEp4A@mail.gmail.com>

On Wed, Jun 25, 2014 at 08:50:12AM -0500, Greg Bellows wrote:
> I am going to add a patch to the series to handle migration.

Great, thanks Greg.

Cheers

> 
> 
> On 25 June 2014 00:20, Edgar E. Iglesias <edgar.iglesias@gmail.com> wrote:
> 
> > On Wed, Jun 11, 2014 at 01:55:01AM +0200, Fabian Aggeler wrote:
> > > Prepare for cp register banking by inserting every cp register twice,
> > > once for secure world and once for non-secure world.
> >
> > Hi,
> >
> > A question regarding the migration issue that Sergey raised.
> > Do we need to do anything about it or can we live with multiple
> > migrations of the same reg? I guess we could somehow encode
> > an array of "migratable" flags or maybe auto eliminate the dups
> > while migrating or registering the regs.
> >
> > Except for the migration question, I think your approach here
> > looks good.
> >
> > Thanks,
> > Edgar
> >
> >
> > >
> > > Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
> > > ---
> > >  target-arm/cpu.h       | 14 +++++++++++---
> > >  target-arm/helper.c    | 20 ++++++++++++++++----
> > >  target-arm/translate.c | 19 +++++++++++++------
> > >  3 files changed, 40 insertions(+), 13 deletions(-)
> > >
> > > diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> > > index 0b8042c..d4eab39 100644
> > > --- a/target-arm/cpu.h
> > > +++ b/target-arm/cpu.h
> > > @@ -831,6 +831,7 @@ void armv7m_nvic_complete_irq(void *opaque, int irq);
> > >   *  Crn, Crm, opc1, opc2 fields
> > >   *  32 or 64 bit register (ie is it accessed via MRC/MCR
> > >   *    or via MRRC/MCRR?)
> > > + *  non-secure/secure bank (Aarch32 only)
> > >   * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
> > >   * (In this case crn and opc2 should be zero.)
> > >   * For AArch64, there is no 32/64 bit size distinction;
> > > @@ -848,9 +849,16 @@ void armv7m_nvic_complete_irq(void *opaque, int
> > irq);
> > >  #define CP_REG_AA64_SHIFT 28
> > >  #define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
> > >
> > > -#define ENCODE_CP_REG(cp, is64, crn, crm, opc1, opc2)   \
> > > -    (((cp) << 16) | ((is64) << 15) | ((crn) << 11) |    \
> > > -     ((crm) << 7) | ((opc1) << 3) | (opc2))
> > > +/* To enable banking of coprocessor registers depending on ns-bit we
> > > + * add a bit to distinguish between secure and non-secure cpregs in the
> > > + * hashtable.
> > > + */
> > > +#define CP_REG_NS_SHIFT 27
> > > +#define CP_REG_NS_MASK(nsbit) (nsbit << CP_REG_NS_SHIFT)
> > > +
> > > +#define ENCODE_CP_REG(cp, is64, crn, crm, opc1, opc2, ns)   \
> > > +    (CP_REG_NS_MASK(ns) | ((cp) << 16) | ((is64) << 15) |   \
> > > +     ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
> > >
> > >  #define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
> > >      (CP_REG_AA64_MASK |                                 \
> > > diff --git a/target-arm/helper.c b/target-arm/helper.c
> > > index f9b2374..610245d 100644
> > > --- a/target-arm/helper.c
> > > +++ b/target-arm/helper.c
> > > @@ -2883,7 +2883,7 @@ CpuDefinitionInfoList
> > *arch_query_cpu_definitions(Error **errp)
> > >
> > >  static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r,
> > >                                     void *opaque, int state,
> > > -                                   int crm, int opc1, int opc2)
> > > +                                   int crm, int opc1, int opc2, int
> > nsbit)
> > >  {
> > >      /* Private utility function for define_one_arm_cp_reg_with_opaque():
> > >       * add a single reginfo struct to the hash table.
> > > @@ -2917,7 +2917,7 @@ static void add_cpreg_to_hashtable(ARMCPU *cpu,
> > const ARMCPRegInfo *r,
> > >          *key = ENCODE_AA64_CP_REG(r2->cp, r2->crn, crm,
> > >                                    r2->opc0, opc1, opc2);
> > >      } else {
> > > -        *key = ENCODE_CP_REG(r2->cp, is64, r2->crn, crm, opc1, opc2);
> > > +        *key = ENCODE_CP_REG(r2->cp, is64, r2->crn, crm, opc1, opc2,
> > nsbit);
> > >      }
> > >      if (opaque) {
> > >          r2->opaque = opaque;
> > > @@ -3066,8 +3066,20 @@ 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);
> > > +                    if (state == ARM_CP_STATE_AA32) {
> > > +                        /* Under Aarch32 CP registers can be common
> > > +                         * (same for secure and non-secure world) or
> > banked.
> > > +                         */
> > > +                        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);
> > > +                    } else {
> > > +                        /* Aarch64 registers get mapped to non-secure
> > instance
> > > +                         * of Aarch32 */
> > > +                        add_cpreg_to_hashtable(cpu, r, opaque, state,
> > > +                                crm, opc1, opc2, SCR_NS);
> > > +                    }
> > >                  }
> > >              }
> > >          }
> > > diff --git a/target-arm/translate.c b/target-arm/translate.c
> > > index f657389..30d9592 100644
> > > --- a/target-arm/translate.c
> > > +++ b/target-arm/translate.c
> > > @@ -6968,7 +6968,7 @@ static int disas_neon_data_insn(CPUARMState * env,
> > DisasContext *s, uint32_t ins
> > >
> > >  static int disas_coproc_insn(CPUARMState * env, DisasContext *s,
> > uint32_t insn)
> > >  {
> > > -    int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
> > > +    int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2, ns;
> > >      const ARMCPRegInfo *ri;
> > >
> > >      cpnum = (insn >> 8) & 0xf;
> > > @@ -7012,8 +7012,11 @@ static int disas_coproc_insn(CPUARMState * env,
> > DisasContext *s, uint32_t insn)
> > >      isread = (insn >> 20) & 1;
> > >      rt = (insn >> 12) & 0xf;
> > >
> > > +    /* Monitor mode is always treated as secure but cp register
> > reads/writes
> > > +     * can access secure and non-secure instances using SCR.NS bit*/
> > > +    ns = IS_NS(s) ? 1 : !USE_SECURE_REG(env);
> > >      ri = get_arm_cp_reginfo(s->cp_regs,
> > > -                            ENCODE_CP_REG(cpnum, is64, crn, crm, opc1,
> > opc2));
> > > +            ENCODE_CP_REG(cpnum, is64, crn, crm, opc1, opc2, ns));
> > >      if (ri) {
> > >          /* Check access permissions */
> > >          if (!cp_access_ok(s->current_pl, ri, isread)) {
> > > @@ -7200,12 +7203,16 @@ static int disas_coproc_insn(CPUARMState * env,
> > DisasContext *s, uint32_t insn)
> > >       */
> > >      if (is64) {
> > >          qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
> > > -                      "64 bit system register cp:%d opc1: %d crm:%d\n",
> > > -                      isread ? "read" : "write", cpnum, opc1, crm);
> > > +                      "64 bit system register cp:%d opc1: %d crm:%d "
> > > +                      "(%s)\n",
> > > +                      isread ? "read" : "write", cpnum, opc1, crm,
> > > +                      ns ? "non-secure" : "secure");
> > >      } else {
> > >          qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
> > > -                      "system register cp:%d opc1:%d crn:%d crm:%d
> > opc2:%d\n",
> > > -                      isread ? "read" : "write", cpnum, opc1, crn, crm,
> > opc2);
> > > +                      "system register cp:%d opc1:%d crn:%d crm:%d
> > opc2:%d "
> > > +                      "(%s)\n",
> > > +                      isread ? "read" : "write", cpnum, opc1, crn, crm,
> > opc2,
> > > +                      ns ? "non-secure" : "secure");
> > >      }
> > >
> > >      return 1;
> > > --
> > > 1.8.3.2
> > >
> >

  reply	other threads:[~2014-06-26  3:57 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-10 23:54 [Qemu-devel] [PATCH v3 00/32] target-arm: add Security Extensions for CPUs Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 01/32] target-arm: add cpu feature EL3 to CPUs with Security Extensions Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 02/32] target-arm: move Aarch32 SCR into security reglist Fabian Aggeler
2014-06-12 21:55   ` Greg Bellows
2014-06-17  7:22     ` Aggeler  Fabian
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 03/32] target-arm: increase arrays of registers R13 & R14 Fabian Aggeler
2014-06-17  8:57   ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 04/32] target-arm: add arm_is_secure() function Fabian Aggeler
2014-06-11 12:17   ` Sergey Fedorov
2014-06-12 16:26     ` Greg Bellows
2014-06-12 17:26       ` Sergey Fedorov
2014-06-12 18:35         ` Greg Bellows
2014-06-12 19:09           ` Sergey Fedorov
2014-06-17  5:51   ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 05/32] target-arm: reject switching to monitor mode Fabian Aggeler
2014-06-12 21:55   ` Greg Bellows
2014-06-24 12:19     ` Aggeler  Fabian
2014-06-24 13:43       ` Greg Bellows
2014-06-17  5:43   ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 06/32] target-arm: make arm_current_pl() return PL3 Fabian Aggeler
2014-06-17  5:40   ` Edgar E. Iglesias
2014-06-17  7:12     ` Aggeler  Fabian
2014-06-17  7:07       ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 07/32] target-arm: add non-secure Translation Block flag Fabian Aggeler
2014-06-17  9:15   ` Edgar E. Iglesias
2014-06-17 10:07     ` Sergey Fedorov
2014-06-19  5:30       ` Edgar E. Iglesias
2014-06-25  4:15   ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 08/32] target-arm: A32: Emulate the SMC instruction Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 09/32] target-arm: extend Aarch32 async excp masking Fabian Aggeler
2014-06-17  7:48   ` Edgar E. Iglesias
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 10/32] target-arm: extend Aarch64 SCR.{FIQ|IRQ} handling Fabian Aggeler
2014-06-12 21:55   ` Greg Bellows
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 11/32] target-arm: add async excp target_el&mode function Fabian Aggeler
2014-06-12 21:56   ` Greg Bellows
2014-06-17  7:29     ` Aggeler  Fabian
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 12/32] target-arm: use dedicated target_el function Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 13/32] target-arm: implement IRQ/FIQ routing to Monitor mode Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 14/32] target-arm: Respect SCR.FW, SCR.AW and SCTLR.NMFI Fabian Aggeler
2014-06-12 22:43   ` Greg Bellows
2014-06-17  7:36     ` Aggeler  Fabian
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 15/32] target-arm: add NSACR register Fabian Aggeler
2014-06-13 18:27   ` Greg Bellows
2014-06-17  7:41     ` Aggeler  Fabian
2014-06-24 15:37       ` Greg Bellows
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 16/32] target-arm: add SDER definition Fabian Aggeler
2014-06-10 23:54 ` [Qemu-devel] [PATCH v3 17/32] target-arm: add MVBAR support Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 18/32] target-arm: add macros to access banked registers Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 19/32] target-arm: insert Aarch32 cpregs twice into hashtable Fabian Aggeler
2014-06-12 19:49   ` Sergey Fedorov
2014-06-25  5:20   ` Edgar E. Iglesias
2014-06-25 13:50     ` Greg Bellows
2014-06-26  3:56       ` Edgar E. Iglesias [this message]
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 20/32] target-arm: arrayfying fieldoffset for banking Fabian Aggeler
2014-06-13 20:18   ` Greg Bellows
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 21/32] target-arm: add SCTLR_EL3 and make SCTLR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 22/32] target-arm: make CSSELR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 23/32] target-arm: add TTBR0_EL3 and make TTBR0/1 banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 24/32] target-arm: add TCR_EL3 and make TTBCR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 25/32] target-arm: make c2_mask and c2_base_mask banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 26/32] target-arm: make DACR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 27/32] target-arm: make IFSR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 28/32] target-arm: make DFSR banked Fabian Aggeler
2014-06-13 22:06   ` Greg Bellows
2014-06-17  6:12     ` Edgar E. Iglesias
2014-06-23 16:53       ` Greg Bellows
2014-06-24 11:05       ` Aggeler  Fabian
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 29/32] target-arm: make IFAR/DFAR banked Fabian Aggeler
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 30/32] target-arm: make PAR banked Fabian Aggeler
2014-06-13 22:49   ` Greg Bellows
2014-06-17  7:15     ` Aggeler  Fabian
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 31/32] target-arm: make VBAR banked Fabian Aggeler
2014-06-13 22:43   ` Greg Bellows
2014-06-17  7:17     ` Aggeler  Fabian
2014-06-10 23:55 ` [Qemu-devel] [PATCH v3 32/32] target-arm: make c13 cp regs banked (FCSEIDR, ...) Fabian Aggeler
2014-06-23 21:40   ` Greg Bellows
2014-06-24 11:08     ` Aggeler  Fabian
2014-06-11  1:31 ` [Qemu-devel] [PATCH v3 00/32] target-arm: add Security Extensions for CPUs Edgar E. Iglesias

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=20140626035611.GF13735@toto \
    --to=edgar.iglesias@gmail.com \
    --cc=aggelerf@ethz.ch \
    --cc=christoffer.dall@linaro.org \
    --cc=greg.bellows@linaro.org \
    --cc=peter.crosthwaite@xilinx.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.