diff mbox

[v7,09/32] target-arm: add banked register accessors

Message ID 1413910544-20150-10-git-send-email-greg.bellows@linaro.org
State New
Headers show

Commit Message

Greg Bellows Oct. 21, 2014, 4:55 p.m. UTC
From: Fabian Aggeler <aggelerf@ethz.ch>

If EL3 is in AArch32 state certain cp registers are banked (secure and
non-secure instance). When reading or writing to coprocessor registers
the following macros can be used.

- A32_BANKED macros are used for choosing the banked register based on provided
  input security argument.  This macro is used to choose the bank during
  translation of MRC/MCR instructions that are dependent on something other
  than the current secure state.
- A32_BANKED_CURRENT macros are used for choosing the banked register based on
  current secure state.  This is NOT to be used for choosing the bank used
  during translation as it breaks monitor mode.

If EL3 is operating in AArch64 state coprocessor registers are not
banked anymore. The macros use the non-secure instance (_ns) in this
case, which is architecturally mapped to the AArch64 EL register.

Signed-off-by: Sergey Fedorov <s.fedorov@samsung.com>
Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
Signed-off-by: Greg Bellows <greg.bellows@linaro.org>

Comments

Peter Maydell Oct. 24, 2014, 4:37 p.m. UTC | #1
On 21 October 2014 17:55, Greg Bellows <greg.bellows@linaro.org> wrote:
> From: Fabian Aggeler <aggelerf@ethz.ch>
>
> If EL3 is in AArch32 state certain cp registers are banked (secure and
> non-secure instance). When reading or writing to coprocessor registers
> the following macros can be used.
>
> - A32_BANKED macros are used for choosing the banked register based on provided
>   input security argument.  This macro is used to choose the bank during
>   translation of MRC/MCR instructions that are dependent on something other
>   than the current secure state.
> - A32_BANKED_CURRENT macros are used for choosing the banked register based on
>   current secure state.  This is NOT to be used for choosing the bank used
>   during translation as it breaks monitor mode.
>
> If EL3 is operating in AArch64 state coprocessor registers are not
> banked anymore. The macros use the non-secure instance (_ns) in this
> case, which is architecturally mapped to the AArch64 EL register.
>
> Signed-off-by: Sergey Fedorov <s.fedorov@samsung.com>
> Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
> Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
>
> ==========

Can you make these separators the standard '---', please? Otherwise
when I apply these patches I'll have to go through them all manually
editing the version changes out...

> v5 -> v6
> - Converted macro USE_SECURE_REG() into inlince function use_secure_reg()
> - Globally replace Aarch# with AArch#
>
> v4 -> v5
> - Cleaned-up macros to try and alleviate misuse.  Made A32_BANKED macros take
>   secure arg indicator rather than relying on USE_SECURE_REG.  Incorporated the
>   A32_BANKED macros into the A32_BANKED_CURRENT.  CURRENT is now the only one
>   that automatically chooses based on current secure state.

...and as you can see your own patch tooling isn't handling them
right, because you now have two signed-off-by lines :-)

> Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
> ---
>  target-arm/cpu.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
>
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index 1a564b9..b48b81a 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -817,6 +817,46 @@ static inline bool arm_el_is_aa64(CPUARMState *env, int el)
>      return arm_feature(env, ARM_FEATURE_AARCH64);
>  }
>
> +/* Function for determing whether to use the secure or non-secure bank of a CP
> + * register.  When EL3 is operating in AArch32 state, the NS-bit determines
> + * whether the secure instance of a cp-register should be used.
> + */
> +static inline bool use_secure_reg(CPUARMState *env)
> +{
> +    bool ret = (arm_feature(env, ARM_FEATURE_EL3) &&
> +                !arm_el_is_aa64(env, 3) &&
> +                !(env->cp15.scr_el3 & SCR_NS));
> +
> +    return ret;
> +}

This function is a bit misnamed, and it's actually only used for
setting the TBFLAG_NS bit, so:
 * name it access_secure_reg()
 * change the comment:
  /* Function for determing whether guest cp register reads and writes should
   * access the secure or non-secure bank of a cp register.  When EL3 is
   * operating in AArch32 state, the NS-bit determines whether the secure
   * instance of a cp register should be used. When EL3 is AArch64 (or if
   * it doesn't exist at all) then there is no register banking, and all
   * accesses are to the non-secure version.
   */
 * move it into patch 10 (the one which adds the TBFLAG_NS bit).

If you do that, then you can mark what's left in this patch
with my Reviewed-by tag.

> +
> +/* Macros for accessing a specified CP register bank */
> +#define A32_BANKED_REG_GET(_env, _regname, _secure)    \
> +    ((_secure) ? (_env)->cp15._regname##_s : (_env)->cp15._regname##_ns)
> +
> +#define A32_BANKED_REG_SET(_env, _regname, _secure, _val)   \
> +    do {                                                \
> +        if (_secure) {                                   \
> +            (_env)->cp15._regname##_s = (_val);            \
> +        } else {                                        \
> +            (_env)->cp15._regname##_ns = (_val);           \
> +        }                                               \
> +    } while (0)
> +
> +/* Macros for automatically accessing a specific CP register bank depending on
> + * the current secure state of the system.  These macros are not intended for
> + * supporting instruction translation reads/writes as these are dependent
> + * solely on the SCR.NS bit and not the mode.
> + */
> +#define A32_BANKED_CURRENT_REG_GET(_env, _regname)        \
> +    A32_BANKED_REG_GET((_env), _regname,                \
> +                       ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))))
> +
> +#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val)                       \
> +    A32_BANKED_REG_SET((_env), _regname,                                    \
> +                       ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))),  \
> +                       (_val))
> +
>  void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
>  unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx);
>
> --
> 1.8.3.2

thanks
-- PMM
Greg Bellows Oct. 28, 2014, 6:42 p.m. UTC | #2
On 24 October 2014 11:37, Peter Maydell <peter.maydell@linaro.org> wrote:

> On 21 October 2014 17:55, Greg Bellows <greg.bellows@linaro.org> wrote:
> > From: Fabian Aggeler <aggelerf@ethz.ch>
> >
> > If EL3 is in AArch32 state certain cp registers are banked (secure and
> > non-secure instance). When reading or writing to coprocessor registers
> > the following macros can be used.
> >
> > - A32_BANKED macros are used for choosing the banked register based on
> provided
> >   input security argument.  This macro is used to choose the bank during
> >   translation of MRC/MCR instructions that are dependent on something
> other
> >   than the current secure state.
> > - A32_BANKED_CURRENT macros are used for choosing the banked register
> based on
> >   current secure state.  This is NOT to be used for choosing the bank
> used
> >   during translation as it breaks monitor mode.
> >
> > If EL3 is operating in AArch64 state coprocessor registers are not
> > banked anymore. The macros use the non-secure instance (_ns) in this
> > case, which is architecturally mapped to the AArch64 EL register.
> >
> > Signed-off-by: Sergey Fedorov <s.fedorov@samsung.com>
> > Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
> > Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
> >
> > ==========
>
> Can you make these separators the standard '---', please? Otherwise
> when I apply these patches I'll have to go through them all manually
> editing the version changes out...
>

I did not know there were standard separators.  I have fixed this in all
the patches.


> > v5 -> v6
> > - Converted macro USE_SECURE_REG() into inlince function use_secure_reg()
> > - Globally replace Aarch# with AArch#
> >
> > v4 -> v5
> > - Cleaned-up macros to try and alleviate misuse.  Made A32_BANKED macros
> take
> >   secure arg indicator rather than relying on USE_SECURE_REG.
> Incorporated the
> >   A32_BANKED macros into the A32_BANKED_CURRENT.  CURRENT is now the
> only one
> >   that automatically chooses based on current secure state.
>
> ...and as you can see your own patch tooling isn't handling them
> right, because you now have two signed-off-by lines :-)
>
> > Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
> > ---
> >  target-arm/cpu.h | 40 ++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 40 insertions(+)
> >
> > diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> > index 1a564b9..b48b81a 100644
> > --- a/target-arm/cpu.h
> > +++ b/target-arm/cpu.h
> > @@ -817,6 +817,46 @@ static inline bool arm_el_is_aa64(CPUARMState *env,
> int el)
> >      return arm_feature(env, ARM_FEATURE_AARCH64);
> >  }
> >
> > +/* Function for determing whether to use the secure or non-secure bank
> of a CP
> > + * register.  When EL3 is operating in AArch32 state, the NS-bit
> determines
> > + * whether the secure instance of a cp-register should be used.
> > + */
> > +static inline bool use_secure_reg(CPUARMState *env)
> > +{
> > +    bool ret = (arm_feature(env, ARM_FEATURE_EL3) &&
> > +                !arm_el_is_aa64(env, 3) &&
> > +                !(env->cp15.scr_el3 & SCR_NS));
> > +
> > +    return ret;
> > +}
>
> This function is a bit misnamed, and it's actually only used for
> setting the TBFLAG_NS bit, so:
>  * name it access_secure_reg()
>  * change the comment:
>   /* Function for determing whether guest cp register reads and writes
> should
>    * access the secure or non-secure bank of a cp register.  When EL3 is
>    * operating in AArch32 state, the NS-bit determines whether the secure
>    * instance of a cp register should be used. When EL3 is AArch64 (or if
>    * it doesn't exist at all) then there is no register banking, and all
>    * accesses are to the non-secure version.
>    */
>  * move it into patch 10 (the one which adds the TBFLAG_NS bit).
>
> If you do that, then you can mark what's left in this patch
> with my Reviewed-by tag.
>

Done in v8


>
> > +
> > +/* Macros for accessing a specified CP register bank */
> > +#define A32_BANKED_REG_GET(_env, _regname, _secure)    \
> > +    ((_secure) ? (_env)->cp15._regname##_s : (_env)->cp15._regname##_ns)
> > +
> > +#define A32_BANKED_REG_SET(_env, _regname, _secure, _val)   \
> > +    do {                                                \
> > +        if (_secure) {                                   \
> > +            (_env)->cp15._regname##_s = (_val);            \
> > +        } else {                                        \
> > +            (_env)->cp15._regname##_ns = (_val);           \
> > +        }                                               \
> > +    } while (0)
> > +
> > +/* Macros for automatically accessing a specific CP register bank
> depending on
> > + * the current secure state of the system.  These macros are not
> intended for
> > + * supporting instruction translation reads/writes as these are
> dependent
> > + * solely on the SCR.NS bit and not the mode.
> > + */
> > +#define A32_BANKED_CURRENT_REG_GET(_env, _regname)        \
> > +    A32_BANKED_REG_GET((_env), _regname,                \
> > +                       ((!arm_el_is_aa64((_env), 3) &&
> arm_is_secure(_env))))
> > +
> > +#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val)
>        \
> > +    A32_BANKED_REG_SET((_env), _regname,
>     \
> > +                       ((!arm_el_is_aa64((_env), 3) &&
> arm_is_secure(_env))),  \
> > +                       (_val))
> > +
> >  void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
> >  unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx);
> >
> > --
> > 1.8.3.2
>
> thanks
> -- PMM
>
diff mbox

Patch

==========

v5 -> v6
- Converted macro USE_SECURE_REG() into inlince function use_secure_reg()
- Globally replace Aarch# with AArch#

v4 -> v5
- Cleaned-up macros to try and alleviate misuse.  Made A32_BANKED macros take
  secure arg indicator rather than relying on USE_SECURE_REG.  Incorporated the
  A32_BANKED macros into the A32_BANKED_CURRENT.  CURRENT is now the only one
  that automatically chooses based on current secure state.

Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
---
 target-arm/cpu.h | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index 1a564b9..b48b81a 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -817,6 +817,46 @@  static inline bool arm_el_is_aa64(CPUARMState *env, int el)
     return arm_feature(env, ARM_FEATURE_AARCH64);
 }
 
+/* Function for determing whether to use the secure or non-secure bank of a CP
+ * register.  When EL3 is operating in AArch32 state, the NS-bit determines
+ * whether the secure instance of a cp-register should be used.
+ */
+static inline bool use_secure_reg(CPUARMState *env)
+{
+    bool ret = (arm_feature(env, ARM_FEATURE_EL3) &&
+                !arm_el_is_aa64(env, 3) &&
+                !(env->cp15.scr_el3 & SCR_NS));
+
+    return ret;
+}
+
+/* Macros for accessing a specified CP register bank */
+#define A32_BANKED_REG_GET(_env, _regname, _secure)    \
+    ((_secure) ? (_env)->cp15._regname##_s : (_env)->cp15._regname##_ns)
+
+#define A32_BANKED_REG_SET(_env, _regname, _secure, _val)   \
+    do {                                                \
+        if (_secure) {                                   \
+            (_env)->cp15._regname##_s = (_val);            \
+        } else {                                        \
+            (_env)->cp15._regname##_ns = (_val);           \
+        }                                               \
+    } while (0)
+
+/* Macros for automatically accessing a specific CP register bank depending on
+ * the current secure state of the system.  These macros are not intended for
+ * supporting instruction translation reads/writes as these are dependent
+ * solely on the SCR.NS bit and not the mode.
+ */
+#define A32_BANKED_CURRENT_REG_GET(_env, _regname)        \
+    A32_BANKED_REG_GET((_env), _regname,                \
+                       ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))))
+
+#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val)                       \
+    A32_BANKED_REG_SET((_env), _regname,                                    \
+                       ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))),  \
+                       (_val))
+
 void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
 unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx);