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

Commit e2122694 authored by Shanker Donthineni's avatar Shanker Donthineni Committed by Gerrit - the friendly Code Review server
Browse files

arm64: Implement branch predictor hardening for Falkor



Falkor is susceptible to branch predictor aliasing and can
theoretically be attacked by malicious code. This patch
implements a mitigation for these attacks, preventing any
malicious entries from affecting other victim contexts.

Change-Id: I535d423c2cefaf93627267b867bf0846e502d4c1
Signed-off-by: default avatarShanker Donthineni <shankerd@codeaurora.org>
[will: fix label name when !CONFIG_KVM and remove references to MIDR_FALKOR]
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
[sramana@codeaurora.org: Use only the link stack sanitization routines,
and leave Falkor related BP hardening code]
Signed-off-by: default avatarSrinivas Ramana <sramana@codeaurora.org>
parent 9690396c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -77,3 +77,11 @@ ENTRY(__psci_hyp_bp_inval_start)
	ldp	x0, x1, [sp, #(16 * 8)]
	add	sp, sp, #(8 * 18)
ENTRY(__psci_hyp_bp_inval_end)

ENTRY(__qcom_hyp_sanitize_link_stack_start)
	stp     x29, x30, [sp, #-16]!
	.rept	16
	bl	. + 4
	.endr
	ldp	x29, x30, [sp], #16
ENTRY(__qcom_hyp_sanitize_link_stack_end)
+29 −2
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ DEFINE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data);

#ifdef CONFIG_KVM
extern char __psci_hyp_bp_inval_start[], __psci_hyp_bp_inval_end[];
extern char __qcom_hyp_sanitize_link_stack_start[];
extern char __qcom_hyp_sanitize_link_stack_end[];

static void __copy_hyp_vect_bpi(int slot, const char *hyp_vecs_start,
				const char *hyp_vecs_end)
@@ -81,6 +83,8 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
#else
#define __psci_hyp_bp_inval_start		NULL
#define __psci_hyp_bp_inval_end			NULL
#define __qcom_hyp_sanitize_link_stack_start	NULL
#define __qcom_hyp_sanitize_link_stack_end	NULL

static void __maybe_unused __install_bp_hardening_cb(bp_hardening_cb_t fn,
				      const char *hyp_vecs_start,
@@ -122,6 +126,29 @@ static int enable_psci_bp_hardening(void *data)

	return 0;
}

static void __maybe_unused qcom_link_stack_sanitization(void)
{
	u64 tmp;

	asm volatile("mov	%0, x30		\n"
		     ".rept	16		\n"
		     "bl	. + 4		\n"
		     ".endr			\n"
		     "mov	x30, %0		\n"
		     : "=&r" (tmp));
}

static int __maybe_unused qcom_enable_link_stack_sanitization(void *data)
{
	const struct arm64_cpu_capabilities *entry = data;

	install_bp_hardening_cb(entry, qcom_link_stack_sanitization,
				__qcom_hyp_sanitize_link_stack_start,
				__qcom_hyp_sanitize_link_stack_end);

	return 0;
}
#endif	/* CONFIG_HARDEN_BRANCH_PREDICTOR */

#define MIDR_RANGE(model, min, max) \