提交 b4514efb 编写于 作者: S Steven Price 提交者: Yang Yingliang

arm/arm64: Make use of the SMCCC 1.1 wrapper

mainline inclusion
from mainline-v5.8-rc5
commit ce4d5ca2b9dd5d85944eb93c1bbf9eb11b7a907d
category: feature
bugzilla: NA
CVE: NA

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

Rather than directly choosing which function to use based on
psci_ops.conduit, use the new arm_smccc_1_1 wrapper instead.

In some cases we still need to do some operations based on the
conduit, but the code duplication is removed.

No functional change.
Signed-off-by: NSteven Price <steven.price@arm.com>
Signed-off-by: NMarc Zyngier <maz@kernel.org>
Reviewed-by: Nzhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 b758de52
...@@ -81,12 +81,13 @@ static void cpu_v7_spectre_init(void) ...@@ -81,12 +81,13 @@ static void cpu_v7_spectre_init(void)
if (psci_ops.smccc_version == SMCCC_VERSION_1_0) if (psci_ops.smccc_version == SMCCC_VERSION_1_0)
break; break;
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
if ((int)res.a0 != 0)
return;
switch (psci_ops.conduit) { switch (psci_ops.conduit) {
case PSCI_CONDUIT_HVC: case PSCI_CONDUIT_HVC:
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
if ((int)res.a0 != 0)
break;
per_cpu(harden_branch_predictor_fn, cpu) = per_cpu(harden_branch_predictor_fn, cpu) =
call_hvc_arch_workaround_1; call_hvc_arch_workaround_1;
cpu_do_switch_mm = cpu_v7_hvc_switch_mm; cpu_do_switch_mm = cpu_v7_hvc_switch_mm;
...@@ -94,10 +95,6 @@ static void cpu_v7_spectre_init(void) ...@@ -94,10 +95,6 @@ static void cpu_v7_spectre_init(void)
break; break;
case PSCI_CONDUIT_SMC: case PSCI_CONDUIT_SMC:
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
if ((int)res.a0 != 0)
break;
per_cpu(harden_branch_predictor_fn, cpu) = per_cpu(harden_branch_predictor_fn, cpu) =
call_smc_arch_workaround_1; call_smc_arch_workaround_1;
cpu_do_switch_mm = cpu_v7_smc_switch_mm; cpu_do_switch_mm = cpu_v7_smc_switch_mm;
......
...@@ -217,40 +217,31 @@ static int detect_harden_bp_fw(void) ...@@ -217,40 +217,31 @@ static int detect_harden_bp_fw(void)
if (psci_ops.smccc_version == SMCCC_VERSION_1_0) if (psci_ops.smccc_version == SMCCC_VERSION_1_0)
return -1; return -1;
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
switch ((int)res.a0) {
case 1:
/* Firmware says we're just fine */
return 0;
case 0:
break;
default:
return -1;
}
switch (psci_ops.conduit) { switch (psci_ops.conduit) {
case PSCI_CONDUIT_HVC: case PSCI_CONDUIT_HVC:
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, cb = call_hvc_arch_workaround_1;
ARM_SMCCC_ARCH_WORKAROUND_1, &res); /* This is a guest, no need to patch KVM vectors */
switch ((int)res.a0) { smccc_start = NULL;
case 1: smccc_end = NULL;
/* Firmware says we're just fine */
return 0;
case 0:
cb = call_hvc_arch_workaround_1;
/* This is a guest, no need to patch KVM vectors */
smccc_start = NULL;
smccc_end = NULL;
break;
default:
return -1;
}
break; break;
case PSCI_CONDUIT_SMC: case PSCI_CONDUIT_SMC:
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, cb = call_smc_arch_workaround_1;
ARM_SMCCC_ARCH_WORKAROUND_1, &res); smccc_start = __smccc_workaround_1_smc_start;
switch ((int)res.a0) { smccc_end = __smccc_workaround_1_smc_end;
case 1:
/* Firmware says we're just fine */
return 0;
case 0:
cb = call_smc_arch_workaround_1;
smccc_start = __smccc_workaround_1_smc_start;
smccc_end = __smccc_workaround_1_smc_end;
break;
default:
return -1;
}
break; break;
default: default:
...@@ -340,6 +331,8 @@ void __init arm64_enable_wa2_handling(struct alt_instr *alt, ...@@ -340,6 +331,8 @@ void __init arm64_enable_wa2_handling(struct alt_instr *alt,
void arm64_set_ssbd_mitigation(bool state) void arm64_set_ssbd_mitigation(bool state)
{ {
int conduit;
if (!IS_ENABLED(CONFIG_ARM64_SSBD)) { if (!IS_ENABLED(CONFIG_ARM64_SSBD)) {
pr_info_once("SSBD disabled by kernel configuration\n"); pr_info_once("SSBD disabled by kernel configuration\n");
return; return;
...@@ -353,19 +346,9 @@ void arm64_set_ssbd_mitigation(bool state) ...@@ -353,19 +346,9 @@ void arm64_set_ssbd_mitigation(bool state)
return; return;
} }
switch (psci_ops.conduit) { conduit = arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_WORKAROUND_2, state,
case PSCI_CONDUIT_HVC: NULL);
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL); WARN_ON_ONCE(conduit == PSCI_CONDUIT_NONE);
break;
case PSCI_CONDUIT_SMC:
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
break;
default:
WARN_ON_ONCE(1);
break;
}
} }
static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry, static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
...@@ -375,6 +358,7 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry, ...@@ -375,6 +358,7 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
bool required = true; bool required = true;
s32 val; s32 val;
bool this_cpu_safe = false; bool this_cpu_safe = false;
int conduit;
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible()); WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
...@@ -399,18 +383,10 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry, ...@@ -399,18 +383,10 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
return false; return false;
} }
switch (psci_ops.conduit) { conduit = arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
case PSCI_CONDUIT_HVC: ARM_SMCCC_ARCH_WORKAROUND_2, &res);
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
break;
case PSCI_CONDUIT_SMC: if (conduit == PSCI_CONDUIT_NONE) {
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
break;
default:
ssbd_state = ARM64_SSBD_UNKNOWN; ssbd_state = ARM64_SSBD_UNKNOWN;
if (!this_cpu_safe) if (!this_cpu_safe)
__ssb_safe = false; __ssb_safe = false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册