From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, patches@linaro.org
Subject: Re: [Qemu-arm] [PATCH 08/15] target/arm: Define and use XPSR bit masks
Date: Thu, 3 Aug 2017 17:32:27 +0200 [thread overview]
Message-ID: <20170803153227.GQ4859@toto> (raw)
In-Reply-To: <1501692241-23310-9-git-send-email-peter.maydell@linaro.org>
On Wed, Aug 02, 2017 at 05:43:54PM +0100, Peter Maydell wrote:
> The M profile XPSR is almost the same format as the A profile CPSR,
> but not quite. Define some XPSR_* macros and use them where we
> definitely dealing with an XPSR rather than reusing the CPSR ones.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
> target/arm/cpu.h | 38 ++++++++++++++++++++++++++++----------
> target/arm/helper.c | 15 ++++++++-------
> 2 files changed, 36 insertions(+), 17 deletions(-)
>
> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> index b64474c..1f06de0 100644
> --- a/target/arm/cpu.h
> +++ b/target/arm/cpu.h
> @@ -883,6 +883,22 @@ void pmccntr_sync(CPUARMState *env);
> /* Mask of bits which may be set by exception return copying them from SPSR */
> #define CPSR_ERET_MASK (~CPSR_RESERVED)
>
> +/* Bit definitions for M profile XPSR. Most are the same as CPSR. */
> +#define XPSR_EXCP 0x1ffU
> +#define XPSR_SPREALIGN (1U << 9) /* Only set in exception stack frames */
> +#define XPSR_IT_2_7 CPSR_IT_2_7
> +#define XPSR_GE CPSR_GE
> +#define XPSR_SFPA (1U << 20) /* Only set in exception stack frames */
> +#define XPSR_T (1U << 24) /* Not the same as CPSR_T ! */
> +#define XPSR_IT_0_1 CPSR_IT_0_1
> +#define XPSR_Q CPSR_Q
> +#define XPSR_V CPSR_V
> +#define XPSR_C CPSR_C
> +#define XPSR_Z CPSR_Z
> +#define XPSR_N CPSR_N
> +#define XPSR_NZCV CPSR_NZCV
> +#define XPSR_IT CPSR_IT
> +
> #define TTBCR_N (7U << 0) /* TTBCR.EAE==0 */
> #define TTBCR_T0SZ (7U << 0) /* TTBCR.EAE==1 */
> #define TTBCR_PD0 (1U << 4)
> @@ -987,26 +1003,28 @@ static inline uint32_t xpsr_read(CPUARMState *env)
> /* Set the xPSR. Note that some bits of mask must be all-set or all-clear. */
> static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
> {
> - if (mask & CPSR_NZCV) {
> - env->ZF = (~val) & CPSR_Z;
> + if (mask & XPSR_NZCV) {
> + env->ZF = (~val) & XPSR_Z;
> env->NF = val;
> env->CF = (val >> 29) & 1;
> env->VF = (val << 3) & 0x80000000;
> }
> - if (mask & CPSR_Q)
> - env->QF = ((val & CPSR_Q) != 0);
> - if (mask & (1 << 24))
> - env->thumb = ((val & (1 << 24)) != 0);
> - if (mask & CPSR_IT_0_1) {
> + if (mask & XPSR_Q) {
> + env->QF = ((val & XPSR_Q) != 0);
> + }
> + if (mask & XPSR_T) {
> + env->thumb = ((val & XPSR_T) != 0);
> + }
> + if (mask & XPSR_IT_0_1) {
> env->condexec_bits &= ~3;
> env->condexec_bits |= (val >> 25) & 3;
> }
> - if (mask & CPSR_IT_2_7) {
> + if (mask & XPSR_IT_2_7) {
> env->condexec_bits &= 3;
> env->condexec_bits |= (val >> 8) & 0xfc;
> }
> - if (mask & 0x1ff) {
> - env->v7m.exception = val & 0x1ff;
> + if (mask & XPSR_EXCP) {
> + env->v7m.exception = val & XPSR_EXCP;
> }
> }
>
> diff --git a/target/arm/helper.c b/target/arm/helper.c
> index cb88c66..f087d42 100644
> --- a/target/arm/helper.c
> +++ b/target/arm/helper.c
> @@ -6119,7 +6119,7 @@ static void v7m_push_stack(ARMCPU *cpu)
> /* Align stack pointer if the guest wants that */
> if ((env->regs[13] & 4) && (env->v7m.ccr & R_V7M_CCR_STKALIGN_MASK)) {
> env->regs[13] -= 4;
> - xpsr |= 0x200;
> + xpsr |= XPSR_SPREALIGN;
> }
> /* Switch to the handler mode. */
> v7m_push(env, xpsr);
> @@ -6244,10 +6244,11 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
> env->regs[15] &= ~1U;
> }
> xpsr = v7m_pop(env);
> - xpsr_write(env, xpsr, 0xfffffdff);
> + xpsr_write(env, xpsr, ~XPSR_SPREALIGN);
> /* Undo stack alignment. */
> - if (xpsr & 0x200)
> + if (xpsr & XPSR_SPREALIGN) {
> env->regs[13] |= 4;
> + }
>
> /* The restored xPSR exception field will be zero if we're
> * resuming in Thread mode. If that doesn't match what the
> @@ -8693,10 +8694,10 @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
> case 0 ... 7: /* xPSR sub-fields */
> mask = 0;
> if ((reg & 1) && el) {
> - mask |= 0x000001ff; /* IPSR (unpriv. reads as zero) */
> + mask |= XPSR_EXCP; /* IPSR (unpriv. reads as zero) */
> }
> if (!(reg & 4)) {
> - mask |= 0xf8000000; /* APSR */
> + mask |= XPSR_NZCV | XPSR_Q; /* APSR */
> }
> /* EPSR reads as zero */
> return xpsr_read(env) & mask;
> @@ -8754,10 +8755,10 @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
> uint32_t apsrmask = 0;
>
> if (mask & 8) {
> - apsrmask |= 0xf8000000; /* APSR NZCVQ */
> + apsrmask |= XPSR_NZCV | XPSR_Q;
> }
> if ((mask & 4) && arm_feature(env, ARM_FEATURE_THUMB_DSP)) {
> - apsrmask |= 0x000f0000; /* APSR GE[3:0] */
> + apsrmask |= XPSR_GE;
> }
> xpsr_write(env, val, apsrmask);
> }
> --
> 2.7.4
>
>
WARNING: multiple messages have this Message-ID (diff)
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, patches@linaro.org
Subject: Re: [Qemu-devel] [Qemu-arm] [PATCH 08/15] target/arm: Define and use XPSR bit masks
Date: Thu, 3 Aug 2017 17:32:27 +0200 [thread overview]
Message-ID: <20170803153227.GQ4859@toto> (raw)
In-Reply-To: <1501692241-23310-9-git-send-email-peter.maydell@linaro.org>
On Wed, Aug 02, 2017 at 05:43:54PM +0100, Peter Maydell wrote:
> The M profile XPSR is almost the same format as the A profile CPSR,
> but not quite. Define some XPSR_* macros and use them where we
> definitely dealing with an XPSR rather than reusing the CPSR ones.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
> target/arm/cpu.h | 38 ++++++++++++++++++++++++++++----------
> target/arm/helper.c | 15 ++++++++-------
> 2 files changed, 36 insertions(+), 17 deletions(-)
>
> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> index b64474c..1f06de0 100644
> --- a/target/arm/cpu.h
> +++ b/target/arm/cpu.h
> @@ -883,6 +883,22 @@ void pmccntr_sync(CPUARMState *env);
> /* Mask of bits which may be set by exception return copying them from SPSR */
> #define CPSR_ERET_MASK (~CPSR_RESERVED)
>
> +/* Bit definitions for M profile XPSR. Most are the same as CPSR. */
> +#define XPSR_EXCP 0x1ffU
> +#define XPSR_SPREALIGN (1U << 9) /* Only set in exception stack frames */
> +#define XPSR_IT_2_7 CPSR_IT_2_7
> +#define XPSR_GE CPSR_GE
> +#define XPSR_SFPA (1U << 20) /* Only set in exception stack frames */
> +#define XPSR_T (1U << 24) /* Not the same as CPSR_T ! */
> +#define XPSR_IT_0_1 CPSR_IT_0_1
> +#define XPSR_Q CPSR_Q
> +#define XPSR_V CPSR_V
> +#define XPSR_C CPSR_C
> +#define XPSR_Z CPSR_Z
> +#define XPSR_N CPSR_N
> +#define XPSR_NZCV CPSR_NZCV
> +#define XPSR_IT CPSR_IT
> +
> #define TTBCR_N (7U << 0) /* TTBCR.EAE==0 */
> #define TTBCR_T0SZ (7U << 0) /* TTBCR.EAE==1 */
> #define TTBCR_PD0 (1U << 4)
> @@ -987,26 +1003,28 @@ static inline uint32_t xpsr_read(CPUARMState *env)
> /* Set the xPSR. Note that some bits of mask must be all-set or all-clear. */
> static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
> {
> - if (mask & CPSR_NZCV) {
> - env->ZF = (~val) & CPSR_Z;
> + if (mask & XPSR_NZCV) {
> + env->ZF = (~val) & XPSR_Z;
> env->NF = val;
> env->CF = (val >> 29) & 1;
> env->VF = (val << 3) & 0x80000000;
> }
> - if (mask & CPSR_Q)
> - env->QF = ((val & CPSR_Q) != 0);
> - if (mask & (1 << 24))
> - env->thumb = ((val & (1 << 24)) != 0);
> - if (mask & CPSR_IT_0_1) {
> + if (mask & XPSR_Q) {
> + env->QF = ((val & XPSR_Q) != 0);
> + }
> + if (mask & XPSR_T) {
> + env->thumb = ((val & XPSR_T) != 0);
> + }
> + if (mask & XPSR_IT_0_1) {
> env->condexec_bits &= ~3;
> env->condexec_bits |= (val >> 25) & 3;
> }
> - if (mask & CPSR_IT_2_7) {
> + if (mask & XPSR_IT_2_7) {
> env->condexec_bits &= 3;
> env->condexec_bits |= (val >> 8) & 0xfc;
> }
> - if (mask & 0x1ff) {
> - env->v7m.exception = val & 0x1ff;
> + if (mask & XPSR_EXCP) {
> + env->v7m.exception = val & XPSR_EXCP;
> }
> }
>
> diff --git a/target/arm/helper.c b/target/arm/helper.c
> index cb88c66..f087d42 100644
> --- a/target/arm/helper.c
> +++ b/target/arm/helper.c
> @@ -6119,7 +6119,7 @@ static void v7m_push_stack(ARMCPU *cpu)
> /* Align stack pointer if the guest wants that */
> if ((env->regs[13] & 4) && (env->v7m.ccr & R_V7M_CCR_STKALIGN_MASK)) {
> env->regs[13] -= 4;
> - xpsr |= 0x200;
> + xpsr |= XPSR_SPREALIGN;
> }
> /* Switch to the handler mode. */
> v7m_push(env, xpsr);
> @@ -6244,10 +6244,11 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
> env->regs[15] &= ~1U;
> }
> xpsr = v7m_pop(env);
> - xpsr_write(env, xpsr, 0xfffffdff);
> + xpsr_write(env, xpsr, ~XPSR_SPREALIGN);
> /* Undo stack alignment. */
> - if (xpsr & 0x200)
> + if (xpsr & XPSR_SPREALIGN) {
> env->regs[13] |= 4;
> + }
>
> /* The restored xPSR exception field will be zero if we're
> * resuming in Thread mode. If that doesn't match what the
> @@ -8693,10 +8694,10 @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
> case 0 ... 7: /* xPSR sub-fields */
> mask = 0;
> if ((reg & 1) && el) {
> - mask |= 0x000001ff; /* IPSR (unpriv. reads as zero) */
> + mask |= XPSR_EXCP; /* IPSR (unpriv. reads as zero) */
> }
> if (!(reg & 4)) {
> - mask |= 0xf8000000; /* APSR */
> + mask |= XPSR_NZCV | XPSR_Q; /* APSR */
> }
> /* EPSR reads as zero */
> return xpsr_read(env) & mask;
> @@ -8754,10 +8755,10 @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
> uint32_t apsrmask = 0;
>
> if (mask & 8) {
> - apsrmask |= 0xf8000000; /* APSR NZCVQ */
> + apsrmask |= XPSR_NZCV | XPSR_Q;
> }
> if ((mask & 4) && arm_feature(env, ARM_FEATURE_THUMB_DSP)) {
> - apsrmask |= 0x000f0000; /* APSR GE[3:0] */
> + apsrmask |= XPSR_GE;
> }
> xpsr_write(env, val, apsrmask);
> }
> --
> 2.7.4
>
>
next prev parent reply other threads:[~2017-08-03 15:32 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-02 16:43 [Qemu-arm] [PATCH 00/15] v7M: cleanups and bugfixes prior to v8M Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 16:43 ` [Qemu-arm] [PATCH 01/15] target/arm: Use MMUAccessType enum rather than int Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 17:27 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-02 17:27 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-02 21:52 ` Philippe Mathieu-Daudé
2017-08-02 21:52 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-08-03 20:13 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 20:13 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-devel] [PATCH 02/15] target/arm: Don't trap WFI/WFE for M profile Peter Maydell
2017-08-02 17:34 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-02 17:34 ` Edgar E. Iglesias
2017-08-03 20:28 ` [Qemu-arm] " Richard Henderson
2017-08-03 20:28 ` Richard Henderson
2017-08-03 20:40 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 20:40 ` [Qemu-devel] [Qemu-arm] " Edgar E. Iglesias
2017-08-03 20:46 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 20:46 ` [Qemu-devel] [Qemu-arm] " Richard Henderson
2017-08-03 20:44 ` [Qemu-arm] [Qemu-devel] " Peter Maydell
2017-08-03 20:44 ` Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] [PATCH 03/15] target/arm: Consolidate PMSA handling in get_phys_addr() Peter Maydell
2017-08-02 17:40 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-02 17:40 ` Edgar E. Iglesias
2017-08-02 21:50 ` [Qemu-arm] " Philippe Mathieu-Daudé
2017-08-02 21:50 ` Philippe Mathieu-Daudé
2017-08-03 20:33 ` [Qemu-arm] " Richard Henderson
2017-08-03 20:33 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 04/15] target/arm: Tighten up Thumb decode where new v8M insns will be Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 17:47 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-02 17:47 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 21:33 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 21:33 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 05/15] hw/intc/armv7m_nvic.c: Remove out of date comment Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 17:48 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-02 17:48 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 21:34 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 21:34 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 06/15] target/arm: Remove incorrect comment about MPU_CTRL Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-03 15:24 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 15:24 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 21:35 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:43 ` [Qemu-devel] [PATCH 07/15] target/arm: Fix outdated comment about exception exit Peter Maydell
2017-08-03 15:25 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 15:25 ` Edgar E. Iglesias
2017-08-03 21:36 ` [Qemu-arm] " Richard Henderson
2017-08-03 21:36 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 08/15] target/arm: Define and use XPSR bit masks Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-03 15:32 ` Edgar E. Iglesias [this message]
2017-08-03 15:32 ` [Qemu-devel] [Qemu-arm] " Edgar E. Iglesias
2017-08-03 21:51 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 09/15] target/arm: Don't store M profile PRIMASK and FAULTMASK in daif Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-03 15:38 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 15:38 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:05 ` Richard Henderson
2017-08-05 4:47 ` [Qemu-arm] [Qemu-devel] " Edgar E. Iglesias
2017-08-05 4:47 ` [Qemu-devel] [Qemu-arm] " Edgar E. Iglesias
2017-08-03 22:03 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:43 ` [Qemu-devel] [PATCH 10/15] target/arm: Don't use cpsr_write/cpsr_read to transfer M profile XPSR Peter Maydell
2017-08-03 22:13 ` [Qemu-arm] " Richard Henderson
2017-08-03 22:13 ` Richard Henderson
2017-08-03 22:15 ` Richard Henderson
2017-08-04 9:51 ` Peter Maydell
2017-08-02 16:43 ` [Qemu-arm] [PATCH 11/15] target/arm: Make arm_cpu_dump_state() handle the M-profile XPSR Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-03 15:48 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 15:48 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:14 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 22:14 ` Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 12/15] target/arm: Don't calculate lr in arm_v7m_cpu_do_interrupt() until needed Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 21:46 ` [Qemu-arm] " Philippe Mathieu-Daudé
2017-08-02 21:46 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-08-03 15:48 ` Edgar E. Iglesias
2017-08-03 15:48 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:16 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:43 ` [Qemu-arm] [PATCH 13/15] target/arm: Create and use new function arm_v7m_is_handler_mode() Peter Maydell
2017-08-02 16:43 ` [Qemu-devel] " Peter Maydell
2017-08-02 21:48 ` [Qemu-arm] " Philippe Mathieu-Daudé
2017-08-02 21:48 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-08-03 15:56 ` Edgar E. Iglesias
2017-08-03 15:56 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:18 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:44 ` [Qemu-arm] [PATCH 14/15] armv7m_nvic.h: Move from include/hw/arm to include/hw/intc Peter Maydell
2017-08-02 16:44 ` [Qemu-devel] " Peter Maydell
2017-08-02 21:49 ` [Qemu-devel] [Qemu-arm] " Philippe Mathieu-Daudé
2017-08-03 15:57 ` Edgar E. Iglesias
2017-08-03 15:57 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:19 ` [Qemu-devel] " Richard Henderson
2017-08-02 16:44 ` [Qemu-arm] [PATCH 15/15] nvic: Implement "user accesses BusFault" SCS region behaviour Peter Maydell
2017-08-02 16:44 ` [Qemu-devel] " Peter Maydell
2017-08-03 15:59 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-03 15:59 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-03 22:23 ` [Qemu-arm] [Qemu-devel] " Richard Henderson
2017-08-03 22:23 ` Richard Henderson
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=20170803153227.GQ4859@toto \
--to=edgar.iglesias@gmail.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.