Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b87b574 authored by Will Deacon's avatar Will Deacon Committed by Greg Kroah-Hartman
Browse files

FROMLIST: arm64: mm: Introduce TTBR_ASID_MASK for getting at the ASID in the TTBR



There are now a handful of open-coded masks to extract the ASID from a
TTBR value, so introduce a TTBR_ASID_MASK and use that instead.

Suggested-by: default avatarMark Rutland <mark.rutland@arm.com>
Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
Tested-by: default avatarLaura Abbott <labbott@redhat.com>
Tested-by: default avatarShanker Donthineni <shankerd@codeaurora.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
(cherry picked from git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git


 commit b519538dfefc2f8478a1bcb458459c861d431784)

Change-Id: I538071c8ec96dca587205c78839c07b6c772fa91
[ghackmann@google.com: adjust context, applying asm-uaccess.h changes
 to uaccess.h instead]
Signed-off-by: default avatarGreg Hackmann <ghackmann@google.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 3ec3abcb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define __ASM_MMU_H

#define USER_ASID_FLAG	(UL(1) << 48)
#define TTBR_ASID_MASK	(UL(0xffff) << 48)

#ifndef __ASSEMBLY__

+4 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include <asm/alternative.h>
#include <asm/kernel-pgtable.h>
#include <asm/mmu.h>
#include <asm/sysreg.h>

#ifndef __ASSEMBLY__
@@ -141,7 +142,7 @@ static inline void __uaccess_ttbr0_disable(void)
	write_sysreg(ttbr + SWAPPER_DIR_SIZE, ttbr0_el1);
	isb();
	/* Set reserved ASID */
	ttbr &= ~(0xffffUL << 48);
	ttbr &= ~TTBR_ASID_MASK;
	write_sysreg(ttbr, ttbr1_el1);
	isb();
}
@@ -160,7 +161,7 @@ static inline void __uaccess_ttbr0_enable(void)

	/* Restore active ASID */
	ttbr1 = read_sysreg(ttbr1_el1);
	ttbr1 |= ttbr0 & (0xffffUL << 48);
	ttbr1 |= ttbr0 & TTBR_ASID_MASK;
	write_sysreg(ttbr1, ttbr1_el1);
	isb();

@@ -454,7 +455,7 @@ extern __must_check long strnlen_user(const char __user *str, long n);
	msr	ttbr0_el1, \tmp1		// set reserved TTBR0_EL1
	isb
	sub	\tmp1, \tmp1, #SWAPPER_DIR_SIZE
	bic	\tmp1, \tmp1, #(0xffff << 48)
	bic	\tmp1, \tmp1, #TTBR_ASID_MASK
	msr	ttbr1_el1, \tmp1		// set reserved ASID
	isb
	.endm
+1 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ alternative_else_nop_endif

	.if	\el != 0
	mrs	x21, ttbr1_el1
	tst	x21, #0xffff << 48		// Check for the reserved ASID
	tst	x21, #TTBR_ASID_MASK		// Check for the reserved ASID
	orr	x23, x23, #PSR_PAN_BIT		// Set the emulated PAN in the saved SPSR
	b.eq	1f				// TTBR0 access already disabled
	and	x23, x23, #~PSR_PAN_BIT		// Clear the emulated PAN in the saved SPSR