From: Tom Rini <trini@konsulko.com>
To: u-boot@lists.denx.de
Subject: [Uboot-stm32] [PATCH 0/7] arm: cache: cp15: don't map reserved region with no-map property
Date: Tue, 27 Oct 2020 13:25:33 -0400 [thread overview]
Message-ID: <20201027172533.GD14816@bill-the-cat> (raw)
In-Reply-To: <f629253d8c92446ca1d33a25058c1676@SFHDAG2NODE3.st.com>
On Fri, Oct 09, 2020 at 05:00:44PM +0000, Patrick DELAUNAY wrote:
> Hi Ard,
>
> > From: Ard Biesheuvel <ardb@kernel.org>
> > Sent: mercredi 7 octobre 2020 15:16
> >
> > On Wed, 7 Oct 2020 at 13:53, Ahmad Fatoum <a.fatoum@pengutronix.de> wrote:
> > >
> > > Hello,
> > >
> > > On 10/7/20 1:23 PM, Ahmad Fatoum wrote:
> > > > My findings[1] back then were that U-Boot did set the eXecute Never
> > > > bit only on OMAP, but not for other platforms. So I could imagine
> > > > this being the root cause of Patrick's issues as well:
> > >
> > > Rereading my own link, my memory is a little less fuzzy: eXecute Never
> > > was being set, but was without effect due Manager mode being set in the
> > DACR:
> > >
> > > > The ARM Architecture Reference Manual notes[1]:
> > > > > When using the Short-descriptor translation table format, the XN
> > > > > attribute is not checked for domains marked as Manager.
> > > > > Therefore, the system must not include read-sensitive memory in
> > > > > domains marked as Manager, because the XN bit does not prevent
> > > > > speculative fetches from a Manager domain.
> > >
> > > > To avoid speculative access to read-sensitive memory-mapped
> > > > peripherals on ARMv7, we'll need U-Boot to use client domain
> > > > permissions, so the XN bit can function.
> > >
> > > > This issue has come up before and was fixed in de63ac278
> > > > ("ARM: mmu: Set domain permissions to client access") for OMAP2 only.
> > > > It's equally applicable to all ARMv7-A platforms where caches are
> > > > enabled.
> > > > [1]: B3.7.2 - Execute-never restrictions on instruction fetching
> > >
> > > Hope this helps,
> > > Ahmad
> > >
> >
> > It most definitely does, thanks a lot.
> >
> > U-boot's mmu_setup() currently sets DACR to manager for all domains, so this is
> > broken for all non-LPAE configurations running on v7 CPUs (except OMAP and
> > perhaps others that fixed it individually). This affects all device mappings: not just
> > secure DRAM for OP-TEE, but any MMIO register for any peripheral that is
> > mapped into the CPU's address space.
> >
> > Patrick, could you please check whether this fixes the issue as well?
> >
> > --- a/arch/arm/lib/cache-cp15.c
> > +++ b/arch/arm/lib/cache-cp15.c
> > @@ -202,9 +202,9 @@ static inline void mmu_setup(void)
> > asm volatile("mcr p15, 0, %0, c2, c0, 0"
> > : : "r" (gd->arch.tlb_addr) : "memory"); #endif
> > - /* Set the access control to all-supervisor */
> > + /* Set the access control to client (0b01) for each of the 16
> > + domains */
> > asm volatile("mcr p15, 0, %0, c3, c0, 0"
> > - : : "r" (~0));
> > + : : "r" (0x55555555));
> >
> > arm_init_domains();
>
> The test will take some time to be sure that solve my remaining issue because issue is not always reproductible.
>
> At fist chek, I wasn't sure of DACR bahavior, but I found in [1] the line :
>
> The XN attribute is not checked for domains marked as Manager. Read-sensitive memory must
> not be included in domains marked as Manager, because the XN bit does not prevent prefetches
> in these cases.
>
> So, I need to test your patch + DCACHE_OFF instead of INVALID
> (to map with XN the OP-TEE region) in my patchset.
>
> FYI: I found the same DACR configuration is done in:
> arch/arm/cpu/armv7/ls102xa/cpu.c:199
>
> [1] https://developer.arm.com/documentation/ddi0406/b/System-Level-Architecture/Virtual-Memory-System-Architecture--VMSA-/Memory-access-control/The-Execute-Never--XN--attribute-and-instruction-prefetching?lang=en
>
> Patrick
>
> For information:
>
> At the beginning I wasn't sure that the current DACR configuration is an issue because in found
> in pseudo code of DDI0406B_arm_architecture_reference_manual_errata_markup_8_0.pdf
>
> B3.13.3 Address translation
> if CheckDomain(tlbrecord.domain, mva, tlbrecord.sectionnotpage, iswrite) then
> CheckPermission(tlbrecord.perms, mva, tlbrecord.sectionnotpage, iswrite, ispriv);
>
> B3.13.4 Domain checking
> boolean CheckDomain(bits(4) domain, bits(32) mva, boolean sectionnotpage, boolean iswrite)
> bitpos = 2*UInt(domain);
> case DACR<bitpos+1:bitpos> of
> when ?00? DataAbort(mva, domain, sectionnotpage, iswrite, DAbort_Domain);
> when ?01? permissioncheck = TRUE;
> when ?10? UNPREDICTABLE;
> when ?11? permissioncheck = FALSE;
> return permissioncheck;
>
> B2.4.8 Access permission checking
> // CheckPermission()
> // =================
> CheckPermission(Permissions perms, bits(32) mva,
> boolean sectionnotpage, bits(4) domain, boolean iswrite, boolean ispriv)
>
> if SCTLR.AFE == ?0? then
> perms.ap<0> = ?1?;
> case perms.ap of
> when ?000? abort = TRUE;
> when ?001? abort = !ispriv;
> when ?010? abort = !ispriv && iswrite;
> when ?011? abort = FALSE;
> when ?100? UNPREDICTABLE;
> when ?101? abort = !ispriv || iswrite;
> when ?110? abort = iswrite;
> when ?111?
> if MemorySystemArchitecture() == MemArch_VMSA then
> abort = iswrite
> else
> UNPREDICTABLE;
> if abort then
> DataAbort(mva, domain, sectionnotpage, iswrite, DAbort_Permission);
> return;
>
> => it seens only the read/write permission is checked here (perms.ap)
> => perms.xn is not used here
>
> access_control = DRACR[r];
> perms.ap = access_control<10:8>;
> perms.xn = access_control<12>;
>
> with AP[2:0], bits [10:8]
> Access Permissions field. Indicates the read and write access permissions for unprivileged
> and privileged accesses to the memory region.
>
> But now it is clear with [1]
So, where did everything end up here? I specifically didn't grab this
series as it sounded like there was concern the problem should be solved
via another patch. Or would that be an in-addition-to? Thanks!
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20201027/5a147f22/attachment.sig>
next prev parent reply other threads:[~2020-10-27 17:25 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-06 16:35 [PATCH 0/7] arm: cache: cp15: don't map reserved region with no-map property Patrick Delaunay
2020-10-06 16:35 ` [PATCH 1/7] lmb: Add support of flags for no-map properties Patrick Delaunay
2020-10-06 16:35 ` [PATCH 2/7] lmb: add lmb_is_reserved_flags Patrick Delaunay
2020-10-06 16:35 ` [PATCH 3/7] lmb: remove lmb_region.size Patrick Delaunay
2020-10-06 16:35 ` [PATCH 4/7] lmb: add lmb_dump_region() function Patrick Delaunay
2020-10-06 16:36 ` [PATCH 5/7] test: lmb: add test for lmb_reserve_flags Patrick Delaunay
2020-10-06 16:36 ` [PATCH 6/7] image-fdt: save no-map parameter of reserve-memory Patrick Delaunay
2020-10-06 16:36 ` [PATCH 7/7] arm: cache: cp15: don't map the reserved region with no-map property Patrick Delaunay
2020-10-07 10:26 ` [PATCH 0/7] arm: cache: cp15: don't map " Ard Biesheuvel
2020-10-07 11:23 ` [Uboot-stm32] " Ahmad Fatoum
2020-10-07 11:52 ` Ahmad Fatoum
2020-10-07 13:15 ` Ard Biesheuvel
2020-10-07 14:55 ` Etienne Carriere
2020-10-07 15:07 ` Ard Biesheuvel
2020-10-07 15:13 ` Etienne Carriere
2020-10-09 17:00 ` Patrick DELAUNAY
2020-10-27 17:25 ` Tom Rini [this message]
2020-10-27 21:04 ` Ard Biesheuvel
2020-10-28 10:33 ` Patrick DELAUNAY
2020-10-29 10:40 ` Etienne Carriere
2020-10-29 11:26 ` Ard Biesheuvel
2020-10-29 16:06 ` Etienne Carriere
2020-10-29 16:31 ` Ard Biesheuvel
2020-10-29 16:35 ` Jerome Forissier
2020-10-29 17:11 ` Etienne Carriere
2020-10-09 15:52 ` Patrick DELAUNAY
2020-10-09 17:12 ` Ahmad Fatoum
2020-10-09 17:15 ` Ahmad Fatoum
2020-10-09 18:35 ` Ard Biesheuvel
2020-10-12 9:09 ` Etienne Carriere
2020-10-12 9:20 ` Ard Biesheuvel
2020-10-12 9:51 ` Etienne Carriere
2020-10-12 10:27 ` Ard Biesheuvel
2020-10-09 11:18 ` Patrick DELAUNAY
2020-10-09 12:26 ` Ard Biesheuvel
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=20201027172533.GD14816@bill-the-cat \
--to=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox