From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39162) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zjxsl-0006Y9-0e for qemu-devel@nongnu.org; Wed, 07 Oct 2015 19:12:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zjxsg-0001II-Hm for qemu-devel@nongnu.org; Wed, 07 Oct 2015 19:12:22 -0400 Received: from mail-vk0-f48.google.com ([209.85.213.48]:36210) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zjxsg-0001I6-DC for qemu-devel@nongnu.org; Wed, 07 Oct 2015 19:12:18 -0400 Received: by vkfp126 with SMTP id p126so21516236vkf.3 for ; Wed, 07 Oct 2015 16:12:17 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <87612iy7kp.fsf@linaro.org> References: <1443911939-2825-1-git-send-email-edgar.iglesias@gmail.com> <1443911939-2825-4-git-send-email-edgar.iglesias@gmail.com> <87612iy7kp.fsf@linaro.org> From: Peter Maydell Date: Thu, 8 Oct 2015 00:11:58 +0100 Message-ID: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v3 3/9] target-arm: Add support for S2 page-table protection bits List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?QWxleCBCZW5uw6ll?= Cc: Edgar Iglesias , QEMU Developers , Alexander Graf , Sergey Fedorov , Laurent Desnogues , "Edgar E. Iglesias" On 7 October 2015 at 17:19, Alex Benn=C3=A9e wrote= : > > Edgar E. Iglesias writes: > >> From: "Edgar E. Iglesias" >> >> Signed-off-by: Edgar E. Iglesias >> --- >> 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 =3D 0; >> + >> + if (s2ap & 1) { >> + prot |=3D PAGE_READ; >> + } >> + if (s2ap & 2) { >> + prot |=3D PAGE_WRITE; >> + } >> + if (!xn) { >> + prot |=3D 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 =3D (1ULL << ((granule_sz * (4 - level)) + 3)); >> descaddr |=3D (address & (page_size - 1)); >> - /* Extract attributes from the descriptor and merge with table = attrs */ >> + /* Extract attributes from the descriptor */ >> attrs =3D extract64(descriptor, 2, 10) >> | (extract64(descriptor, 52, 12) << 10); >> + >> + if (mmu_idx =3D=3D ARMMMUIdx_S2NS) { >> + /* Stage 2 table descriptors do not include any attribute f= ields */ >> + break; >> + } >> + /* Merge in attributes from table descriptors */ >> attrs |=3D extract32(tableattrs, 0, 2) << 11; /* XN, PXN */ >> attrs |=3D extract32(tableattrs, 3, 1) << 5; /* APTable[1] =3D>= AP[2] */ >> /* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] = =3D=3D 1 >> @@ -6652,11 +6680,16 @@ static bool get_phys_addr_lpae(CPUARMState *env,= target_ulong address, >> } >> >> ap =3D extract32(attrs, 4, 2); >> - ns =3D extract32(attrs, 3, 1); >> xn =3D extract32(attrs, 12, 1); >> - pxn =3D 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? The bit of the ARM ARM you want is D4.3.3 in rev A.g of the v8 ARM ARM, which describes all the attribute fields in the various descriptors. At this point 'attrs' is in the format of the attribute bits from a stage 1 Block/Page descriptor, all shifted down to the bottom of a word (ie attrs[21:0] is descriptor bits [63:52] + [11:2]). You can see us shifting [63:52] and [11:2] into place in the line just below the "Extract attributes from the descriptor" line. tableattrs[4:0] is bits [63:59] of the stage 1 Table descriptor format. For stage 2 translations (which is what the code Edgar's adding is handling) the "stage 2 block and page descriptors" format is a bit different (mostly it's missing bits that don't have any meaning for stage 2), and stage 2 table descriptors have no attribute bits at all. thanks -- PMM