[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v7 09/32] target-arm: add banked register access
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v7 09/32] target-arm: add banked register accessors |
Date: |
Fri, 24 Oct 2014 17:37:58 +0100 |
On 21 October 2014 17:55, Greg Bellows <address@hidden> wrote:
> From: Fabian Aggeler <address@hidden>
>
> 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 <address@hidden>
> Signed-off-by: Fabian Aggeler <address@hidden>
> Signed-off-by: Greg Bellows <address@hidden>
>
> ==========
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 <address@hidden>
> ---
> 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
- [Qemu-devel] [PATCH v7 08/32] target-arm: add async excp target_el function, (continued)
[Qemu-devel] [PATCH v7 09/32] target-arm: add banked register accessors, Greg Bellows, 2014/10/21
- Re: [Qemu-devel] [PATCH v7 09/32] target-arm: add banked register accessors,
Peter Maydell <=
[Qemu-devel] [PATCH v7 06/32] target-arm: A32: Emulate the SMC instruction, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 04/32] target-arm: rename arm_current_pl to arm_current_el, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 11/32] target-arm: add CPREG secure state support, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 13/32] target-arm: insert AArch32 cpregs twice into hashtable, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 14/32] target-arm: move AArch32 SCR into security reglist, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 15/32] target-arm: implement IRQ/FIQ routing to Monitor mode, Greg Bellows, 2014/10/21
[Qemu-devel] [PATCH v7 16/32] target-arm: respect SCR.FW, SCR.AW and SCTLR.NMFI, Greg Bellows, 2014/10/21