Skip to content

Commit

Permalink
arm64: mte: fix restoration of GCR_EL1 from suspend
Browse files Browse the repository at this point in the history
[ Upstream commit 59f4406 ]

Since commit:

  bad1e1c ("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: bad1e1c ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Mark Rutland authored and gregkh committed Jul 28, 2021
1 parent 3a2c492 commit 9fe5024
Showing 1 changed file with 2 additions and 13 deletions.
15 changes: 2 additions & 13 deletions arch/arm64/kernel/mte.c
Expand Up @@ -185,18 +185,6 @@ void mte_check_tfsr_el1(void)
}
#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 set_gcr_el1_excl(u64 excl)
{
current->thread.gcr_user_excl = excl;
Expand Down Expand Up @@ -257,7 +245,8 @@ void mte_suspend_exit(void)
if (!system_supports_mte())
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)
Expand Down

0 comments on commit 9fe5024

Please sign in to comment.