Commit 963eb1ac authored by Srinivas Ramana's avatar Srinivas Ramana Committed by GONG, Ruiqi
Browse files

arm64: Defer enabling pointer authentication on boot core

mainline inclusion
from mainline-v5.12-rc1
commit 7f624085
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I7QNYP

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=7f6240858cf3abb75237c9ba63ec70d232573ae8



----------------------------------------

Defer enabling pointer authentication on boot core until
after its required to be enabled by cpufeature framework.
This will help in controlling the feature dynamically
with a boot parameter.

Signed-off-by: default avatarAjay Patil <pajay@qti.qualcomm.com>
Signed-off-by: default avatarPrasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: default avatarSrinivas Ramana <sramana@codeaurora.org>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/1610152163-16554-2-git-send-email-sramana@codeaurora.org


Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarDavid Brazdil <dbrazdil@google.com>
Link: https://lore.kernel.org/r/20210208095732.3267263-22-maz@kernel.org


Signed-off-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarGONG, Ruiqi <gongruiqi1@huawei.com>
parent 98ace1d4
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,15 @@ static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
	return ptrauth_clear_pac(ptr);
	return ptrauth_clear_pac(ptr);
}
}


static __always_inline void ptrauth_enable(void)
{
	if (!system_supports_address_auth())
		return;
	sysreg_clear_set(sctlr_el1, 0, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB |
					SCTLR_ELx_ENDA | SCTLR_ELx_ENDB));
	isb();
}

#define ptrauth_thread_init_user(tsk)					\
#define ptrauth_thread_init_user(tsk)					\
	ptrauth_keys_init_user(&(tsk)->thread.keys_user)
	ptrauth_keys_init_user(&(tsk)->thread.keys_user)
#define ptrauth_thread_init_kernel(tsk)					\
#define ptrauth_thread_init_kernel(tsk)					\
@@ -84,6 +93,7 @@ static inline unsigned long ptrauth_strip_insn_pac(unsigned long ptr)
	ptrauth_keys_switch_kernel(&(tsk)->thread.keys_kernel)
	ptrauth_keys_switch_kernel(&(tsk)->thread.keys_kernel)


#else /* CONFIG_ARM64_PTR_AUTH */
#else /* CONFIG_ARM64_PTR_AUTH */
#define ptrauth_enable()
#define ptrauth_prctl_reset_keys(tsk, arg)	(-EINVAL)
#define ptrauth_prctl_reset_keys(tsk, arg)	(-EINVAL)
#define ptrauth_strip_insn_pac(lr)	(lr)
#define ptrauth_strip_insn_pac(lr)	(lr)
#define ptrauth_thread_init_user(tsk)
#define ptrauth_thread_init_user(tsk)
+1 −0
Original line number Original line Diff line number Diff line
@@ -41,6 +41,7 @@ static __always_inline void boot_init_stack_canary(void)
#endif
#endif
	ptrauth_thread_init_kernel(current);
	ptrauth_thread_init_kernel(current);
	ptrauth_thread_switch_kernel(current);
	ptrauth_thread_switch_kernel(current);
	ptrauth_enable();
}
}


#endif	/* _ASM_STACKPROTECTOR_H */
#endif	/* _ASM_STACKPROTECTOR_H */
+0 −4
Original line number Original line Diff line number Diff line
@@ -420,10 +420,6 @@ SYM_FUNC_START_LOCAL(__primary_switched)
	adr_l	x5, init_task
	adr_l	x5, init_task
	msr	sp_el0, x5			// Save thread_info
	msr	sp_el0, x5			// Save thread_info


#ifdef CONFIG_ARM64_PTR_AUTH
	__ptrauth_keys_init_cpu	x5, x6, x7, x8
#endif

	adr_l	x8, vectors			// load VBAR_EL1 with virtual
	adr_l	x8, vectors			// load VBAR_EL1 with virtual
	msr	vbar_el1, x8			// vector table address
	msr	vbar_el1, x8			// vector table address
	isb
	isb