Commit 98ff5c07 authored by Pawan Gupta's avatar Pawan Gupta Committed by Borislav Petkov (AMD)
Browse files

x86/bugs: Avoid AUTO after the select step in the retbleed mitigation



The retbleed select function leaves the mitigation to AUTO in some cases.
Moreover, the update function can also set the mitigation to AUTO. This
is inconsistent with other mitigations and requires explicit handling of
AUTO at the end of update step.

Make sure a mitigation gets selected in the select step, and do not change
it to AUTO in the update step. When no mitigation can be selected leave it
to NONE, which is what AUTO was getting changed to in the end.

Suggested-by: default avatarBorislav Petkov <bp@alien8.de>
Signed-off-by: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Acked-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/20250611-eibrs-fix-v4-1-5ff86cac6c61@linux.intel.com
parent e04c78d8
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -1247,6 +1247,14 @@ static void __init retbleed_select_mitigation(void)
			retbleed_mitigation = RETBLEED_MITIGATION_IBPB;
		else
			retbleed_mitigation = RETBLEED_MITIGATION_NONE;
	} else if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
		/* Final mitigation depends on spectre-v2 selection */
		if (boot_cpu_has(X86_FEATURE_IBRS_ENHANCED))
			retbleed_mitigation = RETBLEED_MITIGATION_EIBRS;
		else if (boot_cpu_has(X86_FEATURE_IBRS))
			retbleed_mitigation = RETBLEED_MITIGATION_IBRS;
		else
			retbleed_mitigation = RETBLEED_MITIGATION_NONE;
	}
}

@@ -1255,9 +1263,6 @@ static void __init retbleed_update_mitigation(void)
	if (!boot_cpu_has_bug(X86_BUG_RETBLEED) || cpu_mitigations_off())
		return;

	if (retbleed_mitigation == RETBLEED_MITIGATION_NONE)
		goto out;

	/*
	 * retbleed=stuff is only allowed on Intel.  If stuffing can't be used
	 * then a different mitigation will be selected below.
@@ -1268,7 +1273,7 @@ static void __init retbleed_update_mitigation(void)
	    its_mitigation == ITS_MITIGATION_RETPOLINE_STUFF) {
		if (spectre_v2_enabled != SPECTRE_V2_RETPOLINE) {
			pr_err("WARNING: retbleed=stuff depends on spectre_v2=retpoline\n");
			retbleed_mitigation = RETBLEED_MITIGATION_AUTO;
			retbleed_mitigation = RETBLEED_MITIGATION_NONE;
		} else {
			if (retbleed_mitigation != RETBLEED_MITIGATION_STUFF)
				pr_info("Retbleed mitigation updated to stuffing\n");
@@ -1294,15 +1299,11 @@ static void __init retbleed_update_mitigation(void)
			if (retbleed_mitigation != RETBLEED_MITIGATION_STUFF)
				pr_err(RETBLEED_INTEL_MSG);
		}
		/* If nothing has set the mitigation yet, default to NONE. */
		if (retbleed_mitigation == RETBLEED_MITIGATION_AUTO)
			retbleed_mitigation = RETBLEED_MITIGATION_NONE;
	}
out:

	pr_info("%s\n", retbleed_strings[retbleed_mitigation]);
}


static void __init retbleed_apply_mitigation(void)
{
	bool mitigate_smt = false;