Message ID | 1623749578-11231-1-git-send-email-anshuman.khandual@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64/mm: Fix ttbr0 values stored in struct thread_info for software-pan | expand |
On Tue, Jun 15, 2021 at 03:25:39PM +0100, Catalin Marinas wrote: > On Tue, Jun 15, 2021 at 03:02:58PM +0530, Anshuman Khandual wrote: > > When using CONFIG_ARM64_SW_TTBR0_PAN, a task's thread_info::ttbr0 must be > > the TTBR0_EL1 value used to run userspace. With 52-bit PAs, the PA must be > > packed into the TTBR using phys_to_ttbr(), but we forget to do this in some > > of the SW PAN code. Thus, if the value is installed into TTBR0_EL1 (as may > > happen in the uaccess routines), this could result in UNPREDICTABLE > > behaviour. > > > > Since hardware with 52-bit PA support almost certainly has HW PAN, which > > will be used in preference, this shouldn't be a practical issue, but let's > > fix this for consistency. > > I'm ok with fixing this for consistency. We should never hit those paths > unless someone built hardware with 52-bit PA (8.2) but without PAN (8.1) > and it would not be architecture compliant. > > I'll leave it with Will for 5.14, it's no a fix that needs urgent > queuing. > > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Cheers, I'll pick it up. Will
On Tue, 15 Jun 2021 15:02:58 +0530, Anshuman Khandual wrote: > When using CONFIG_ARM64_SW_TTBR0_PAN, a task's thread_info::ttbr0 must be > the TTBR0_EL1 value used to run userspace. With 52-bit PAs, the PA must be > packed into the TTBR using phys_to_ttbr(), but we forget to do this in some > of the SW PAN code. Thus, if the value is installed into TTBR0_EL1 (as may > happen in the uaccess routines), this could result in UNPREDICTABLE > behaviour. > > [...] Applied to arm64 (for-next/mm), thanks! [1/1] arm64/mm: Fix ttbr0 values stored in struct thread_info for software-pan https://git.kernel.org/arm64/c/9163f0113030 Cheers,
diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h index d3cef9133539..eeb210997149 100644 --- a/arch/arm64/include/asm/mmu_context.h +++ b/arch/arm64/include/asm/mmu_context.h @@ -177,9 +177,9 @@ static inline void update_saved_ttbr0(struct task_struct *tsk, return; if (mm == &init_mm) - ttbr = __pa_symbol(reserved_pg_dir); + ttbr = phys_to_ttbr(__pa_symbol(reserved_pg_dir)); else - ttbr = virt_to_phys(mm->pgd) | ASID(mm) << 48; + ttbr = phys_to_ttbr(virt_to_phys(mm->pgd)) | ASID(mm) << 48; WRITE_ONCE(task_thread_info(tsk)->ttbr0, ttbr); } diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 61845c0821d9..68b30e8c22db 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -381,7 +381,7 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p) * faults in case uaccess_enable() is inadvertently called by the init * thread. */ - init_task.thread_info.ttbr0 = __pa_symbol(reserved_pg_dir); + init_task.thread_info.ttbr0 = phys_to_ttbr(__pa_symbol(reserved_pg_dir)); #endif if (boot_args[1] || boot_args[2] || boot_args[3]) {
When using CONFIG_ARM64_SW_TTBR0_PAN, a task's thread_info::ttbr0 must be the TTBR0_EL1 value used to run userspace. With 52-bit PAs, the PA must be packed into the TTBR using phys_to_ttbr(), but we forget to do this in some of the SW PAN code. Thus, if the value is installed into TTBR0_EL1 (as may happen in the uaccess routines), this could result in UNPREDICTABLE behaviour. Since hardware with 52-bit PA support almost certainly has HW PAN, which will be used in preference, this shouldn't be a practical issue, but let's fix this for consistency. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: James Morse <james.morse@arm.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Fixes: 529c4b05a3cb ("arm64: handle 52-bit addresses in TTBR") Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> --- Just found via code inspection. Applies on v5.13-rc6. arch/arm64/include/asm/mmu_context.h | 4 ++-- arch/arm64/kernel/setup.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)