UPSTREAM: arm64: mte: fix restoration of GCR_EL1 from suspend
Since commit: bad1e1c663e0a72f ("arm64: mte: switch GCR_EL1 in kernel entry and exit") we saved/restored the user GCR_EL1 value at exception boundaries, and update_gcr_el1_excl() is no longer used for this. However it is used to restore the kernel's GCR_EL1 value when returning from a suspend state. Thus, the comment is misleading (and an ISB is necessary). When restoring the kernel's GCR value, we need an ISB to ensure this is used by subsequent instructions. We don't necessarily get an ISB by other means (e.g. if the kernel is built without support for pointer authentication). As __cpu_setup() initialised GCR_EL1.Exclude to 0xffff, until a context synchronization event, allocation tag 0 may be used rather than the desired set of tags. This patch drops the misleading comment, adds the missing ISB, and for clarity folds update_gcr_el1_excl() into its only user. Fixes: bad1e1c663e0 ("arm64: mte: switch GCR_EL1 in kernel entry and exit") Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Andrey Konovalov <andreyknvl@gmail.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Vincenzo Frascino <vincenzo.frascino@arm.com> Cc: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20210714143843.56537-2-mark.rutland@arm.com Signed-off-by: Will Deacon <will@kernel.org> (cherry picked from commit 59f44069e0527523f27948da7b77599a73dab157) Bug: 187129171 Signed-off-by: Connor O'Brien <connoro@google.com> Change-Id: I1be6e588f9796ca5f01d2e9bd5e9743c40dc0778
This commit is contained in:

committed by
Connor O'Brien

parent
1e8a0d84dc
commit
09ec66de84
@@ -188,18 +188,6 @@ void mte_check_tfsr_el1(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void update_gcr_el1_excl(u64 excl)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note that the mask controlled by the user via prctl() is an
|
|
||||||
* include while GCR_EL1 accepts an exclude mask.
|
|
||||||
* No need for ISB since this only affects EL0 currently, implicit
|
|
||||||
* with ERET.
|
|
||||||
*/
|
|
||||||
sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, excl);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mte_update_sctlr_user(struct task_struct *task)
|
static void mte_update_sctlr_user(struct task_struct *task)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -271,7 +259,8 @@ void mte_suspend_exit(void)
|
|||||||
if (!system_supports_mte())
|
if (!system_supports_mte())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
update_gcr_el1_excl(gcr_kernel_excl);
|
sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, gcr_kernel_excl);
|
||||||
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
long set_mte_ctrl(struct task_struct *task, unsigned long arg)
|
long set_mte_ctrl(struct task_struct *task, unsigned long arg)
|
||||||
|
Reference in New Issue
Block a user