All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Bellows <greg.bellows@linaro.org>
To: Fabian Aggeler <aggelerf@ethz.ch>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Peter Crosthwaite <peter.crosthwaite@xilinx.com>,
	QEMU Developers <qemu-devel@nongnu.org>,
	Sergey Fedorov <serge.fdrv@gmail.com>,
	"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
	Christoffer Dall <christoffer.dall@linaro.org>
Subject: Re: [Qemu-devel] [PATCH v3 11/32] target-arm: add async excp target_el&mode function
Date: Thu, 12 Jun 2014 16:56:10 -0500	[thread overview]
Message-ID: <CAOgzsHURYU03L_5z8WUtROh_ig2w3=10WYsGZN1YjsX-dKAuwQ@mail.gmail.com> (raw)
In-Reply-To: <1402444514-19658-12-git-send-email-aggelerf@ethz.ch>

[-- Attachment #1: Type: text/plain, Size: 6682 bytes --]

On 10 June 2014 18:54, Fabian Aggeler <aggelerf@ethz.ch> wrote:

> Adds a dedicated function for IRQ and FIQ exceptions to determine
> target_el and mode (Aarch32) according to tables in ARM ARMv8 and
> ARM ARM v7.
>
> Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch>
> ---
>  target-arm/cpu.h    |   3 ++
>  target-arm/helper.c | 137
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 140 insertions(+)
>
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index b786a5a..52e679f 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -768,6 +768,9 @@ static inline bool arm_el_is_aa64(CPUARMState *env,
> int el)
>
>  void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
>  unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx);
> +inline uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t
> *target_mode,
> +                                        uint32_t excp_idx, uint32_t
> cur_el,
> +                                        bool secure);
>
>  /* Interface between CPU and Interrupt controller.  */
>  void armv7m_nvic_set_pending(void *opaque, int irq);
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 5822353..8333b52 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -3224,6 +3224,21 @@ uint32_t HELPER(get_r13_banked)(CPUARMState *env,
> uint32_t mode)
>      return 0;
>  }
>
> +inline uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t
> *target_mode,
> +                                        uint32_t excp_idx, uint32_t
> cur_el,
> +                                        bool secure)
> +{
> +    switch (excp_idx) {
> +    case EXCP_IRQ:
> +        *target_mode = ARM_CPU_MODE_IRQ;
> +        break;
> +    case EXCP_FIQ:
> +        *target_mode = ARM_CPU_MODE_FIQ;
> +        break;
> +    }
> +    return 1;
> +}
> +
>  unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx)
>  {
>      return 1;
> @@ -3285,6 +3300,128 @@ void switch_mode(CPUARMState *env, int mode)
>  }
>
>  /*
> + * Determine the target EL for physical exceptions
> + */
> +inline uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t
> *target_mode,
> +                                        uint32_t excp_idx, uint32_t
> cur_el,
> +                                        bool secure)
> +{
> +    CPUARMState *env = cs->env_ptr;
> +    uint32_t target_el = 1;
> +    uint32_t excp_mode = 0;
> +
> +    bool scr_routing = 0; /* IRQ, FIQ, EA */
> +    bool hcr_routing = 0; /* IMO, FMO, AMO */
> +
> +    switch (excp_idx) {
> +    case EXCP_IRQ:
> +        scr_routing = (env->cp15.scr_el3 & SCR_IRQ);
> +        hcr_routing = (env->cp15.hcr_el2 & HCR_IMO);
> +        excp_mode = ARM_CPU_MODE_IRQ;
> +        break;
> +    case EXCP_FIQ:
> +        scr_routing = (env->cp15.scr_el3 & SCR_FIQ);
> +        hcr_routing = (env->cp15.hcr_el2 & HCR_FMO);
> +        excp_mode = ARM_CPU_MODE_FIQ;
> +    }
> +
> +    /* If HCR.TGE is set all exceptions that would be routed to EL1 are
> +     * routed to EL2 (in non-secure world).
> +     */
> +    if (arm_feature(env, ARM_FEATURE_EL2) && (env->cp15.hcr_el2 &
> HCR_TGE)) {
> +        hcr_routing = 1;
> +    }
> +
> +    /* Determine target EL according to ARM ARMv8 tables G1-15 and G1-16
> */
> +    if (arm_el_is_aa64(env, 3)) {
> +        /* EL3 in Aarch64 */
> +        if (scr_routing) {
> +            /* IRQ|FIQ|EA == 1 */
> +            target_el = 3;
> +        } else {
> +            if (hcr_routing) {
> +                /* IRQ|FIQ|EA == 0
> +                 * IMO|FMO|AMO == 1 */
> +                if (secure) {
> +                    /* Secure */
> +                    target_el = 1;
> +                    if (!arm_el_is_aa64(env, 1)) {
> +                        /* EL1 using Aarch32 */
> +                        *target_mode = ARM_CPU_MODE_ABT;
> +                    }
> +                } else if (cur_el < 2) {
> +                    /* Non-Secure goes to EL2 */
> +                    target_el = 2;
> +                    if (!arm_el_is_aa64(env, 2)) {
> +                        /* EL2 using Aarch32 */
> +                        *target_mode = ARM_CPU_MODE_HYP;
> +                    }
> +                }
> +            } else if (env->cp15.scr_el3 & SCR_RW) {
> +                /* IRQ|FIQ|EA == 0
> +                 * IMO|FMO|AMO == 0
> +                 * RW == 1 (Next lower level is Aarch64)
> +                 */
> +                if (cur_el < 2) {
> +                    target_el = 1;
> +                } else {
> +                    /* Interrupt not taken but remains pending */
> +                }
> +            } else {
> +                /* IRQ|FIQ|EA == 0
> +                 * IMO|FMO|AMO == 0
> +                 * RW == 0 (Next lower level is Aarch64)
> +                 */
> +                if (cur_el < 2) {
> +                    target_el = 1;
> +                    *target_mode = ARM_CPU_MODE_ABT;
>

According to the aforementioned tables, the target mode should be
excp_mode, not always abort.


> +                } else if (cur_el == 2) {
> +                    target_el = 2;
> +                    *target_mode = ARM_CPU_MODE_HYP;
> +                } else {
> +                    /* Interrupt not taken but remains pending */
> +                }
> +            }
> +        }
> +    } else {
> +        /* EL3 in Aarch32 */
> +        if (scr_routing) {
> +            /* IRQ|FIQ|EA == 1 */
> +            target_el = 3;
> +            *target_mode = ARM_CPU_MODE_MON;
> +        } else {
> +            if (hcr_routing) {
> +                /* IRQ|FIQ|EA == 0
> +                 * IMO|FMO|AMO == 1
> +                 */
> +                if (secure) {
> +                    target_el = 3;
> +                    *target_mode = excp_mode;
> +                } else {
> +                    target_el = 2;
> +                    *target_mode = ARM_CPU_MODE_HYP;
> +                }
> +            } else {
> +                /* IRQ|FIQ|EA == 0
> +                 * IMO|FMO|AMO == 0
> +                 */
> +                if (cur_el < 2) {
> +                    target_el = 1;
> +                    *target_mode = excp_mode;
> +                } else if (cur_el == 2) {
> +                    target_el = 2;
> +                    *target_mode = ARM_CPU_MODE_HYP;
> +                } else if (secure) {
> +                    target_el = 3;
> +                    *target_mode = excp_mode;
> +                }
> +            }
> +        }
> +    }
> +    return target_el;
> +}
> +
> +/*
>   * Determine the target EL for a given exception type.
>   */
>  unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx)
> --
> 1.8.3.2
>
>

[-- Attachment #2: Type: text/html, Size: 8742 bytes --]

  reply	other threads:[~2014-06-12 21:56 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 [this message]
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
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='CAOgzsHURYU03L_5z8WUtROh_ig2w3=10WYsGZN1YjsX-dKAuwQ@mail.gmail.com' \
    --to=greg.bellows@linaro.org \
    --cc=aggelerf@ethz.ch \
    --cc=christoffer.dall@linaro.org \
    --cc=edgar.iglesias@gmail.com \
    --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.