[PATCH 4/7] arm64: kpti: Add ->enable callback to remap swapper using nG mappings
Will Deacon
will.deacon at arm.com
Fri Jan 26 06:05:46 PST 2018
Hi Marc,
On Fri, Jan 26, 2018 at 01:40:50PM +0000, Marc Zyngier wrote:
> On 26/01/18 12:03, Will Deacon wrote:
> > +/*
> > + * void __kpti_install_ng_mappings(int cpu, int num_cpus, phys_addr_t swapper)
> > + *
> > + * Called exactly once from stop_machine context by each CPU found during boot.
> > + */
> > +__idmap_kpti_flag:
> > + .long 1
>
> I'm a bit concerned that we're placing the counter in a section that is
> not writeable (at least in theory). We can either have the idmap
> writeable entirely, or have a idmap data section (which means extending
> it to be more than a single page).
The idmap is mapped using the same attributes as the initial swapper
mappings (SWAPPER_MM_MMUFLAGS) but, unlike swapper, it is not subsequently
remapped and therefore remains writeable.
I could update the .pushsection flags to reflect this with "awx"?
Also, whilst looking around in head.S, I noticed phys_to_pte. I'll move
that into assembler.h and switch the argument order as a separate patch.
> Not sure if that's a concern, but I thought I'd raise it. The core works
> pretty well as is, so it cannot be completely wrong... ;-)
Is that a Tested-by? ;)
> > +ENTRY(idmap_kpti_install_ng_mappings)
> > + cpu .req w0
> > + num_cpus .req w1
> > + swapper_pa .req x2
> > + swapper_ttb .req x3
> > + flag_ptr .req x4
> > + cur_pgdp .req x5
> > + end_pgdp .req x6
> > + pgd .req x7
> > + cur_pudp .req x8
> > + end_pudp .req x9
> > + pud .req x10
> > + cur_pmdp .req x11
> > + end_pmdp .req x12
> > + pmd .req x13
> > + cur_ptep .req x14
> > + end_ptep .req x15
> > + pte .req x16
> > +
> > + mrs swapper_ttb, ttbr1_el1
> > + adr flag_ptr, __idmap_kpti_flag
> > +
> > + cbnz cpu, __idmap_kpti_secondary
> > +
> > + /* We're the boot CPU. Wait for the others to catch up */
> > + sevl
> > +1: wfe
> > + ldaxr w18, [flag_ptr]
> > + eor w18, w18, num_cpus
> > + cbnz w18, 1b
> > +
> > + /* We need to walk swapper, so turn off the MMU. */
> > + pre_disable_mmu_workaround
> > + mrs x18, sctlr_el1
> > + bic x18, x18, #1
>
> nit: You should be able to use SCTLR_ELx_M, as we already include
> sysreg.h (indirectly).
Aha, I looked for that and failed to find it. Thanks.
Will
More information about the linux-arm-kernel
mailing list