[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-arm] [PATCH 1/7] target/arm: Handle SPSEL and cur
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [Qemu-arm] [PATCH 1/7] target/arm: Handle SPSEL and current stack being out of sync in MSP/PSP reads |
Date: |
Tue, 5 Dec 2017 15:54:23 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 |
On 12/01/2017 03:44 PM, Peter Maydell wrote:
> For v8M it is possible for the CONTROL.SPSEL bit value and the
> current stack to be out of sync. This means we need to update
> the checks used in reads and writes of the PSP and MSP special
> registers to use v7m_using_psp() rather than directly checking
> the SPSEL bit in the control register.
good catch.
>
> Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> ---
> target/arm/helper.c | 10 ++++------
> 1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/target/arm/helper.c b/target/arm/helper.c
> index 91a9300..88394d4 100644
> --- a/target/arm/helper.c
> +++ b/target/arm/helper.c
> @@ -9953,11 +9953,9 @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t
> reg)
>
> switch (reg) {
> case 8: /* MSP */
> - return (env->v7m.control[env->v7m.secure] &
> R_V7M_CONTROL_SPSEL_MASK) ?
> - env->v7m.other_sp : env->regs[13];
> + return v7m_using_psp(env) ? env->v7m.other_sp : env->regs[13];
> case 9: /* PSP */
> - return (env->v7m.control[env->v7m.secure] &
> R_V7M_CONTROL_SPSEL_MASK) ?
> - env->regs[13] : env->v7m.other_sp;
> + return v7m_using_psp(env) ? env->regs[13] : env->v7m.other_sp;
> case 16: /* PRIMASK */
> return env->v7m.primask[env->v7m.secure];
> case 17: /* BASEPRI */
> @@ -10059,14 +10057,14 @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t
> maskreg, uint32_t val)
> }
> break;
> case 8: /* MSP */
> - if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
> + if (v7m_using_psp(env)) {
> env->v7m.other_sp = val;
> } else {
> env->regs[13] = val;
> }
> break;
> case 9: /* PSP */
> - if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
> + if (v7m_using_psp(env)) {
> env->regs[13] = val;
> } else {
> env->v7m.other_sp = val;
>
- [Qemu-devel] [PATCH 0/7] armv8m: Implement TT, and other bugfixes, Peter Maydell, 2017/12/01
- [Qemu-devel] [PATCH 1/7] target/arm: Handle SPSEL and current stack being out of sync in MSP/PSP reads, Peter Maydell, 2017/12/01
- [Qemu-devel] [PATCH 3/7] target/arm: Add missing M profile case to regime_is_user(), Peter Maydell, 2017/12/01
- [Qemu-devel] [PATCH 2/7] target/arm: Allow explicit writes to CONTROL.SPSEL in Handler mode, Peter Maydell, 2017/12/01
- [Qemu-devel] [PATCH 6/7] target/arm: Factor MPU lookup code out of get_phys_addr_pmsav8(), Peter Maydell, 2017/12/01
- [Qemu-devel] [PATCH 5/7] target/arm: Create new arm_v7m_mmu_idx_for_secstate_and_priv(), Peter Maydell, 2017/12/01