From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-devel@nongnu.org, patches@linaro.org,
"Alex Bennée" <alex.bennee@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
qemu-arm@nongnu.org
Subject: Re: [PATCH 09/16] target-arm: Support multiple address spaces in page table walks
Date: Fri, 6 Nov 2015 15:22:27 +0100 [thread overview]
Message-ID: <20151106142227.GL13308@toto> (raw)
In-Reply-To: <1446747358-18214-10-git-send-email-peter.maydell@linaro.org>
On Thu, Nov 05, 2015 at 06:15:51PM +0000, Peter Maydell wrote:
> If we have a secure address space, use it in page table walks:
> * when doing the physical accesses to read descriptors,
> make them through the correct address space
> * when the final result indicates a secure access, pass the
> correct address space index to tlb_set_page_with_attrs()
>
> (The descriptor reads are the only direct physical accesses
> made in target-arm/ for CPUs which might have TrustZone.)
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Nice to see how this falls into place like this :-)
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
> target-arm/cpu.h | 29 +++++++++++++++++++++++++++++
> target-arm/helper.c | 10 +++++++---
> 2 files changed, 36 insertions(+), 3 deletions(-)
>
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index 815fef8..8dbf4d4 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -1720,6 +1720,12 @@ static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
> return el;
> }
>
> +/* Indexes used when registering address spaces with cpu_address_space_init */
> +typedef enum ARMASIdx {
> + ARMASIdx_NS = 0,
> + ARMASIdx_S = 1,
> +} ARMASIdx;
> +
> /* Return the Exception Level targeted by debug exceptions;
> * currently always EL1 since we don't implement EL2 or EL3.
> */
> @@ -1991,4 +1997,27 @@ enum {
> QEMU_PSCI_CONDUIT_HVC = 2,
> };
>
> +#ifndef CONFIG_USER_ONLY
> +/* Return the address space index to use for a memory access
> + * (which depends on whether the access is S or NS, and whether
> + * the board gave us a separate AddressSpace for S accesses).
> + */
> +static inline int arm_asidx(CPUState *cs, bool is_secure)
> +{
> + if (is_secure && cs->num_ases > 1) {
> + return ARMASIdx_S;
> + }
> + return ARMASIdx_NS;
> +}
> +
> +/* Return the AddressSpace to use for a memory access
> + * (which depends on whether the access is S or NS, and whether
> + * the board gave us a separate AddressSpace for S accesses).
> + */
> +static inline AddressSpace *arm_addressspace(CPUState *cs, bool is_secure)
> +{
> + return cpu_get_address_space(cs, arm_asidx(cs, is_secure));
> +}
> +#endif
> +
> #endif
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 174371b..242928d 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -6260,13 +6260,14 @@ static uint32_t arm_ldl_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> ARMCPU *cpu = ARM_CPU(cs);
> CPUARMState *env = &cpu->env;
> MemTxAttrs attrs = {};
> + AddressSpace *as = arm_addressspace(cs, is_secure);
>
> attrs.secure = is_secure;
> addr = S1_ptw_translate(env, mmu_idx, addr, attrs, fsr, fi);
> if (fi->s1ptw) {
> return 0;
> }
> - return address_space_ldl(cs->as, addr, attrs, NULL);
> + return address_space_ldl(as, addr, attrs, NULL);
> }
>
> static uint64_t arm_ldq_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> @@ -6276,13 +6277,14 @@ static uint64_t arm_ldq_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> ARMCPU *cpu = ARM_CPU(cs);
> CPUARMState *env = &cpu->env;
> MemTxAttrs attrs = {};
> + AddressSpace *as = arm_addressspace(cs, is_secure);
>
> attrs.secure = is_secure;
> addr = S1_ptw_translate(env, mmu_idx, addr, attrs, fsr, fi);
> if (fi->s1ptw) {
> return 0;
> }
> - return address_space_ldq(cs->as, addr, attrs, NULL);
> + return address_space_ldq(as, addr, attrs, NULL);
> }
>
> static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
> @@ -7307,6 +7309,7 @@ bool arm_tlb_fill(CPUState *cs, vaddr address,
> target_ulong page_size;
> int prot;
> int ret;
> + int asidx;
> MemTxAttrs attrs = {};
>
> ret = get_phys_addr(env, address, access_type, mmu_idx, &phys_addr,
> @@ -7315,7 +7318,8 @@ bool arm_tlb_fill(CPUState *cs, vaddr address,
> /* Map a single [sub]page. */
> phys_addr &= TARGET_PAGE_MASK;
> address &= TARGET_PAGE_MASK;
> - tlb_set_page_with_attrs(cs, address, 0, phys_addr, attrs,
> + asidx = arm_asidx(cs, attrs.secure);
> + tlb_set_page_with_attrs(cs, address, asidx, phys_addr, attrs,
> prot, mmu_idx, page_size);
> return 0;
> }
> --
> 1.9.1
>
WARNING: multiple messages have this Message-ID (diff)
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: patches@linaro.org, qemu-devel@nongnu.org, qemu-arm@nongnu.org,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH 09/16] target-arm: Support multiple address spaces in page table walks
Date: Fri, 6 Nov 2015 15:22:27 +0100 [thread overview]
Message-ID: <20151106142227.GL13308@toto> (raw)
In-Reply-To: <1446747358-18214-10-git-send-email-peter.maydell@linaro.org>
On Thu, Nov 05, 2015 at 06:15:51PM +0000, Peter Maydell wrote:
> If we have a secure address space, use it in page table walks:
> * when doing the physical accesses to read descriptors,
> make them through the correct address space
> * when the final result indicates a secure access, pass the
> correct address space index to tlb_set_page_with_attrs()
>
> (The descriptor reads are the only direct physical accesses
> made in target-arm/ for CPUs which might have TrustZone.)
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Nice to see how this falls into place like this :-)
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
> target-arm/cpu.h | 29 +++++++++++++++++++++++++++++
> target-arm/helper.c | 10 +++++++---
> 2 files changed, 36 insertions(+), 3 deletions(-)
>
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index 815fef8..8dbf4d4 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -1720,6 +1720,12 @@ static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
> return el;
> }
>
> +/* Indexes used when registering address spaces with cpu_address_space_init */
> +typedef enum ARMASIdx {
> + ARMASIdx_NS = 0,
> + ARMASIdx_S = 1,
> +} ARMASIdx;
> +
> /* Return the Exception Level targeted by debug exceptions;
> * currently always EL1 since we don't implement EL2 or EL3.
> */
> @@ -1991,4 +1997,27 @@ enum {
> QEMU_PSCI_CONDUIT_HVC = 2,
> };
>
> +#ifndef CONFIG_USER_ONLY
> +/* Return the address space index to use for a memory access
> + * (which depends on whether the access is S or NS, and whether
> + * the board gave us a separate AddressSpace for S accesses).
> + */
> +static inline int arm_asidx(CPUState *cs, bool is_secure)
> +{
> + if (is_secure && cs->num_ases > 1) {
> + return ARMASIdx_S;
> + }
> + return ARMASIdx_NS;
> +}
> +
> +/* Return the AddressSpace to use for a memory access
> + * (which depends on whether the access is S or NS, and whether
> + * the board gave us a separate AddressSpace for S accesses).
> + */
> +static inline AddressSpace *arm_addressspace(CPUState *cs, bool is_secure)
> +{
> + return cpu_get_address_space(cs, arm_asidx(cs, is_secure));
> +}
> +#endif
> +
> #endif
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 174371b..242928d 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -6260,13 +6260,14 @@ static uint32_t arm_ldl_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> ARMCPU *cpu = ARM_CPU(cs);
> CPUARMState *env = &cpu->env;
> MemTxAttrs attrs = {};
> + AddressSpace *as = arm_addressspace(cs, is_secure);
>
> attrs.secure = is_secure;
> addr = S1_ptw_translate(env, mmu_idx, addr, attrs, fsr, fi);
> if (fi->s1ptw) {
> return 0;
> }
> - return address_space_ldl(cs->as, addr, attrs, NULL);
> + return address_space_ldl(as, addr, attrs, NULL);
> }
>
> static uint64_t arm_ldq_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> @@ -6276,13 +6277,14 @@ static uint64_t arm_ldq_ptw(CPUState *cs, hwaddr addr, bool is_secure,
> ARMCPU *cpu = ARM_CPU(cs);
> CPUARMState *env = &cpu->env;
> MemTxAttrs attrs = {};
> + AddressSpace *as = arm_addressspace(cs, is_secure);
>
> attrs.secure = is_secure;
> addr = S1_ptw_translate(env, mmu_idx, addr, attrs, fsr, fi);
> if (fi->s1ptw) {
> return 0;
> }
> - return address_space_ldq(cs->as, addr, attrs, NULL);
> + return address_space_ldq(as, addr, attrs, NULL);
> }
>
> static bool get_phys_addr_v5(CPUARMState *env, uint32_t address,
> @@ -7307,6 +7309,7 @@ bool arm_tlb_fill(CPUState *cs, vaddr address,
> target_ulong page_size;
> int prot;
> int ret;
> + int asidx;
> MemTxAttrs attrs = {};
>
> ret = get_phys_addr(env, address, access_type, mmu_idx, &phys_addr,
> @@ -7315,7 +7318,8 @@ bool arm_tlb_fill(CPUState *cs, vaddr address,
> /* Map a single [sub]page. */
> phys_addr &= TARGET_PAGE_MASK;
> address &= TARGET_PAGE_MASK;
> - tlb_set_page_with_attrs(cs, address, 0, phys_addr, attrs,
> + asidx = arm_asidx(cs, attrs.secure);
> + tlb_set_page_with_attrs(cs, address, asidx, phys_addr, attrs,
> prot, mmu_idx, page_size);
> return 0;
> }
> --
> 1.9.1
>
next prev parent reply other threads:[~2015-11-06 14:22 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-05 18:15 [PATCH 00/16] Add support for multiple address spaces per CPU and use it for ARM TrustZone Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 01/16] exec.c: Don't set cpu->as until cpu_address_space_init Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:04 ` Edgar E. Iglesias
2015-11-06 13:04 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 02/16] exec.c: Allow target CPUs to define multiple AddressSpaces Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:21 ` Edgar E. Iglesias
2015-11-06 13:21 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:34 ` Peter Maydell
2015-11-06 13:34 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:49 ` Edgar E. Iglesias
2015-11-06 13:49 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:32 ` Paolo Bonzini
2015-11-09 10:32 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:30 ` Paolo Bonzini
2015-11-09 10:30 ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 03/16] tlb_set_page_with_attrs: Take argument specifying AddressSpace to use Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:27 ` Edgar E. Iglesias
2015-11-06 13:27 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:41 ` Peter Maydell
2015-11-06 13:41 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:49 ` Edgar E. Iglesias
2015-11-06 13:49 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:52 ` Edgar E. Iglesias
2015-11-06 13:52 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:44 ` Paolo Bonzini
2015-11-09 10:44 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:49 ` Peter Maydell
2015-11-09 10:49 ` [Qemu-devel] " Peter Maydell
2015-11-10 16:13 ` Peter Maydell
2015-11-10 16:13 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 04/16] exec.c: Add address space index to CPUIOTLBEntry Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:34 ` Edgar E. Iglesias
2015-11-06 13:34 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 13:45 ` Peter Maydell
2015-11-06 13:45 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:13 ` Edgar E. Iglesias
2015-11-06 14:13 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 05/16] exec.c: Add cpu_get_address_space() Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 06/16] include/qom/cpu.h: Add new get_phys_page_asidx_debug method Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:37 ` Edgar E. Iglesias
2015-11-06 13:37 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 07/16] exec.c: Use cpu_get_phys_page_asidx_debug Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:38 ` Edgar E. Iglesias
2015-11-06 13:38 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 08/16] exec.c: Have one io_mem_watch per AddressSpace Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 13:45 ` Edgar E. Iglesias
2015-11-06 13:45 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:49 ` Paolo Bonzini
2015-11-09 10:49 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:54 ` Peter Maydell
2015-11-09 10:54 ` [Qemu-devel] " Peter Maydell
2015-11-09 11:00 ` Paolo Bonzini
2015-11-09 11:00 ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 09/16] target-arm: Support multiple address spaces in page table walks Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:22 ` Edgar E. Iglesias [this message]
2015-11-06 14:22 ` Edgar E. Iglesias
2015-11-09 10:51 ` Paolo Bonzini
2015-11-09 10:51 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:58 ` Peter Maydell
2015-11-09 10:58 ` [Qemu-devel] " Peter Maydell
2015-11-09 11:03 ` Paolo Bonzini
2015-11-09 11:03 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 11:09 ` Peter Maydell
2015-11-09 11:09 ` [Qemu-devel] " Peter Maydell
2015-11-09 11:19 ` Paolo Bonzini
2015-11-09 11:19 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 11:22 ` Peter Maydell
2015-11-09 11:22 ` [Qemu-devel] " Peter Maydell
2015-11-13 18:51 ` Peter Maydell
2015-11-13 18:51 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 10/16] target-arm: Implement cpu_get_phys_page_asidx_debug Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:23 ` Edgar E. Iglesias
2015-11-06 14:23 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 11/16] memory: Add address_space_init_shareable() Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:29 ` Edgar E. Iglesias
2015-11-06 14:29 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 14:49 ` Peter Maydell
2015-11-06 14:49 ` [Qemu-devel] " Peter Maydell
2015-11-09 10:55 ` Paolo Bonzini
2015-11-09 10:55 ` [Qemu-devel] " Paolo Bonzini
2015-11-09 10:59 ` Peter Maydell
2015-11-09 10:59 ` [Qemu-devel] " Peter Maydell
2015-11-09 11:02 ` Paolo Bonzini
2015-11-09 11:02 ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 12/16] qom/cpu: Add MemoryRegion property Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:31 ` Edgar E. Iglesias
2015-11-06 14:31 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-09 10:56 ` Paolo Bonzini
2015-11-09 10:56 ` [Qemu-devel] " Paolo Bonzini
2015-11-05 18:15 ` [PATCH 13/16] target-arm: Add QOM property for Secure memory region Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:33 ` Edgar E. Iglesias
2015-11-06 14:33 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-05 18:15 ` [PATCH 14/16] hw/arm/virt: Wire up memory region to CPUs explicitly Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-06 14:45 ` Edgar E. Iglesias
2015-11-06 14:45 ` [Qemu-devel] " Edgar E. Iglesias
2015-11-06 14:51 ` Peter Maydell
2015-11-06 14:51 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 15/16] [RFC] hw/arm/virt: add secure memory region and UART Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
2015-11-05 18:15 ` [PATCH 16/16] HACK: rearrange the virt memory map to suit OP-TEE Peter Maydell
2015-11-05 18:15 ` [Qemu-devel] " Peter Maydell
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=20151106142227.GL13308@toto \
--to=edgar.iglesias@gmail.com \
--cc=afaerber@suse.de \
--cc=alex.bennee@linaro.org \
--cc=patches@linaro.org \
--cc=pbonzini@redhat.com \
--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.