FROMLIST: arm64: mte: rename gcr_user_excl to mte_ctrl

We are going to use this field to store more data. To prepare for
that, rename it and change the users to rely on the bit position of
gcr_user_excl in mte_ctrl.

Link: https://linux-review.googlesource.com/id/Ie1fd18e480100655f5d22137f5b22f4f3a9f9e2e
Signed-off-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/linux-arm-kernel/20210702194110.2045282-2-pcc@google.com/
Bug: 189966263
Change-Id: Ie1fd18e480100655f5d22137f5b22f4f3a9f9e2e
This commit is contained in:
Peter Collingbourne
2021-06-30 14:57:35 -07:00
committed by Todd Kjos
parent a4c9e551b6
commit f438cf16cd
4 changed files with 15 additions and 10 deletions

View File

@@ -19,6 +19,9 @@
*/ */
#define NET_IP_ALIGN 0 #define NET_IP_ALIGN 0
#define MTE_CTRL_GCR_USER_EXCL_SHIFT 0
#define MTE_CTRL_GCR_USER_EXCL_MASK 0xffff
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/build_bug.h> #include <linux/build_bug.h>
@@ -156,7 +159,7 @@ struct thread_struct {
struct ptrauth_keys_kernel keys_kernel; struct ptrauth_keys_kernel keys_kernel;
#endif #endif
#ifdef CONFIG_ARM64_MTE #ifdef CONFIG_ARM64_MTE
u64 gcr_user_excl; u64 mte_ctrl;
#endif #endif
u64 sctlr_user; u64 sctlr_user;
}; };

View File

@@ -50,7 +50,7 @@ int main(void)
DEFINE(THREAD_KEYS_KERNEL, offsetof(struct task_struct, thread.keys_kernel)); DEFINE(THREAD_KEYS_KERNEL, offsetof(struct task_struct, thread.keys_kernel));
#endif #endif
#ifdef CONFIG_ARM64_MTE #ifdef CONFIG_ARM64_MTE
DEFINE(THREAD_GCR_EL1_USER, offsetof(struct task_struct, thread.gcr_user_excl)); DEFINE(THREAD_MTE_CTRL, offsetof(struct task_struct, thread.mte_ctrl));
#endif #endif
BLANK(); BLANK();
DEFINE(S_X0, offsetof(struct pt_regs, regs[0])); DEFINE(S_X0, offsetof(struct pt_regs, regs[0]));

View File

@@ -182,7 +182,7 @@ alternative_else_nop_endif
* the RRND (bit[16]) setting. * the RRND (bit[16]) setting.
*/ */
mrs_s \tmp2, SYS_GCR_EL1 mrs_s \tmp2, SYS_GCR_EL1
bfi \tmp2, \tmp, #0, #16 bfxil \tmp2, \tmp, #MTE_CTRL_GCR_USER_EXCL_SHIFT, #16
msr_s SYS_GCR_EL1, \tmp2 msr_s SYS_GCR_EL1, \tmp2
#endif #endif
.endm .endm
@@ -205,7 +205,7 @@ alternative_else_nop_endif
alternative_if_not ARM64_MTE alternative_if_not ARM64_MTE
b 1f b 1f
alternative_else_nop_endif alternative_else_nop_endif
ldr \tmp, [\tsk, #THREAD_GCR_EL1_USER] ldr \tmp, [\tsk, #THREAD_MTE_CTRL]
mte_set_gcr \tmp, \tmp2 mte_set_gcr \tmp, \tmp2
1: 1:

View File

@@ -199,7 +199,7 @@ static void update_gcr_el1_excl(u64 excl)
static void set_gcr_el1_excl(u64 excl) static void set_gcr_el1_excl(u64 excl)
{ {
current->thread.gcr_user_excl = excl; current->thread.mte_ctrl = excl;
/* /*
* SYS_GCR_EL1 will be set to current->thread.gcr_user_excl value * SYS_GCR_EL1 will be set to current->thread.gcr_user_excl value
@@ -263,8 +263,8 @@ void mte_suspend_exit(void)
long set_mte_ctrl(struct task_struct *task, unsigned long arg) long set_mte_ctrl(struct task_struct *task, unsigned long arg)
{ {
u64 sctlr = task->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK; u64 sctlr = task->thread.sctlr_user & ~SCTLR_EL1_TCF0_MASK;
u64 gcr_excl = ~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) & u64 mte_ctrl = (~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) &
SYS_GCR_EL1_EXCL_MASK; SYS_GCR_EL1_EXCL_MASK) << MTE_CTRL_GCR_USER_EXCL_SHIFT;
if (!system_supports_mte()) if (!system_supports_mte())
return 0; return 0;
@@ -285,10 +285,10 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg)
if (task != current) { if (task != current) {
task->thread.sctlr_user = sctlr; task->thread.sctlr_user = sctlr;
task->thread.gcr_user_excl = gcr_excl; task->thread.mte_ctrl = mte_ctrl;
} else { } else {
set_task_sctlr_el1(sctlr); set_task_sctlr_el1(sctlr);
set_gcr_el1_excl(gcr_excl); set_gcr_el1_excl(mte_ctrl);
} }
return 0; return 0;
@@ -297,7 +297,9 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg)
long get_mte_ctrl(struct task_struct *task) long get_mte_ctrl(struct task_struct *task)
{ {
unsigned long ret; unsigned long ret;
u64 incl = ~task->thread.gcr_user_excl & SYS_GCR_EL1_EXCL_MASK; u64 mte_ctrl = task->thread.mte_ctrl;
u64 incl = (~mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) &
SYS_GCR_EL1_EXCL_MASK;
if (!system_supports_mte()) if (!system_supports_mte())
return 0; return 0;