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

Commit 9be5bc93 authored by Marc Zyngier's avatar Marc Zyngier Committed by Isaac J. Manjarres
Browse files

arm64: ssbd: Restore mitigation status on CPU resume



On a system where firmware can dynamically change the state of the
mitigation, the CPU will always come up with the mitigation enabled,
including when coming back from suspend.

If the user has requested "no mitigation" via a command line option,
let's enforce it by calling into the firmware again to disable it.

Similarily, for a resume from hibernate, the mitigation could have
been disabled by the boot kernel. Let's ensure that it is set
back on in that case.

Change-Id: I02111bcf8f44e0234f50927f078eae454d31e0b6
Acked-by: default avatarWill Deacon <will.deacon@arm.com>
Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Git-commit: 647d0519b53f440a55df163de21c52a8205431cc
Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


[isaacm@codeaurora.org: resolve trivial merge conflicts]
Signed-off-by: default avatarIsaac J. Manjarres <isaacm@codeaurora.org>
parent 947ffaa8
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -278,6 +278,12 @@ static inline int arm64_get_ssbd_state(void)
#endif
}

#ifdef CONFIG_ARM64_SSBD
void arm64_set_ssbd_mitigation(bool state);
#else
static inline void arm64_set_ssbd_mitigation(bool state) {}
#endif

#endif /* __ASSEMBLY__ */

#endif
+1 −1
Original line number Diff line number Diff line
@@ -263,7 +263,7 @@ static int __init ssbd_cfg(char *buf)
}
early_param("ssbd", ssbd_cfg);

static void arm64_set_ssbd_mitigation(bool state)
void arm64_set_ssbd_mitigation(bool state)
{
	switch (psci_ops.conduit) {
	case PSCI_CONDUIT_HVC:
+11 −0
Original line number Diff line number Diff line
@@ -313,6 +313,17 @@ int swsusp_arch_suspend(void)

		sleep_cpu = -EINVAL;
		__cpu_suspend_exit();

		/*
		 * Just in case the boot kernel did turn the SSBD
		 * mitigation off behind our back, let's set the state
		 * to what we expect it to be.
		 */
		switch (arm64_get_ssbd_state()) {
		case ARM64_SSBD_FORCE_ENABLE:
		case ARM64_SSBD_KERNEL:
			arm64_set_ssbd_mitigation(true);
		}
	}

	local_dbg_restore(flags);
+8 −0
Original line number Diff line number Diff line
@@ -62,6 +62,14 @@ void notrace __cpu_suspend_exit(void)
	 */
	if (hw_breakpoint_restore)
		hw_breakpoint_restore(cpu);

	/*
	 * On resume, firmware implementing dynamic mitigation will
	 * have turned the mitigation on. If the user has forcefully
	 * disabled it, make sure their wishes are obeyed.
	 */
	if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE)
		arm64_set_ssbd_mitigation(false);
}

/*