[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 3/9] target-arm: Add support for S2 page-tabl
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH v3 3/9] target-arm: Add support for S2 page-table protection bits |
Date: |
Wed, 07 Oct 2015 17:19:50 +0100 |
User-agent: |
mu4e 0.9.13; emacs 24.5.50.4 |
Edgar E. Iglesias <address@hidden> writes:
> From: "Edgar E. Iglesias" <address@hidden>
>
> Signed-off-by: Edgar E. Iglesias <address@hidden>
> ---
> target-arm/helper.c | 41 +++++++++++++++++++++++++++++++++++++----
> 1 file changed, 37 insertions(+), 4 deletions(-)
>
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 507324f..610f1b5 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -6015,6 +6015,28 @@ simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx
> mmu_idx, int ap)
> return simple_ap_to_rw_prot_is_user(ap, regime_is_user(env, mmu_idx));
> }
>
> +/* Translate S2 section/page access permissions to protection flags
> + *
> + * @env: CPUARMState
> + * @s2ap: The 2-bit stage2 access permissions (S2AP)
> + * @xn: XN (execute-never) bit
> + */
> +static int get_S2prot(CPUARMState *env, int s2ap, int xn)
> +{
> + int prot = 0;
> +
> + if (s2ap & 1) {
> + prot |= PAGE_READ;
> + }
> + if (s2ap & 2) {
> + prot |= PAGE_WRITE;
> + }
> + if (!xn) {
> + prot |= PAGE_EXEC;
> + }
> + return prot;
> +}
> +
> /* Translate section/page access permissions to protection flags
> *
> * @env: CPUARMState
> @@ -6628,9 +6650,15 @@ static bool get_phys_addr_lpae(CPUARMState *env,
> target_ulong address,
> */
> page_size = (1ULL << ((granule_sz * (4 - level)) + 3));
> descaddr |= (address & (page_size - 1));
> - /* Extract attributes from the descriptor and merge with table attrs
> */
> + /* Extract attributes from the descriptor */
> attrs = extract64(descriptor, 2, 10)
> | (extract64(descriptor, 52, 12) << 10);
> +
> + if (mmu_idx == ARMMMUIdx_S2NS) {
> + /* Stage 2 table descriptors do not include any attribute fields
> */
> + break;
> + }
> + /* Merge in attributes from table descriptors */
> attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */
> attrs |= extract32(tableattrs, 3, 1) << 5; /* APTable[1] => AP[2] */
> /* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1
> @@ -6652,11 +6680,16 @@ static bool get_phys_addr_lpae(CPUARMState *env,
> target_ulong address,
> }
>
> ap = extract32(attrs, 4, 2);
> - ns = extract32(attrs, 3, 1);
> xn = extract32(attrs, 12, 1);
> - pxn = extract32(attrs, 11, 1);
OK I've gotten lost in the ARM ARM. Is there an architecture defined
format the final attrs we construct from the page tables is meant to
conform to? Or is the choice of the final structure arbitrary?
>
> - *prot = get_S1prot(env, mmu_idx, va_size == 64, ap, ns, xn, pxn);
> + if (mmu_idx == ARMMMUIdx_S2NS) {
> + ns = true;
> + *prot = get_S2prot(env, ap, xn);
> + } else {
> + ns = extract32(attrs, 3, 1);
> + pxn = extract32(attrs, 11, 1);
> + *prot = get_S1prot(env, mmu_idx, va_size == 64, ap, ns, xn, pxn);
> + }
>
> fault_type = permission_fault;
> if (!(*prot & (1 << access_type))) {
--
Alex Bennée
[Qemu-devel] [PATCH v3 7/9] target-arm: Add S2 translation to 32bit S1 PTWs, Edgar E. Iglesias, 2015/10/08
[Qemu-devel] [PATCH v3 8/9] target-arm: Route S2 MMU faults to EL2, Edgar E. Iglesias, 2015/10/08
[Qemu-devel] [PATCH v3 1/9] target-arm: Add HPFAR_EL2, Edgar E. Iglesias, 2015/10/08
Re: [Qemu-devel] [PATCH v3 1/9] target-arm: Add HPFAR_EL2, Alex Bennée, 2015/10/08