arm64: KVM: Report SMCCC_ARCH_WORKAROUND_1 BP hardening support
A new feature of SMCCC 1.1 is that it offers firmware-based CPU workarounds. In particular, SMCCC_ARCH_WORKAROUND_1 provides BP hardening for CVE-2017-5715. If the host has some mitigation for this issue, report that we deal with it using SMCCC_ARCH_WORKAROUND_1, as we apply the host workaround on every guest exit. Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
a4097b3511
commit
6167ec5c91
|
@ -306,4 +306,11 @@ static inline void kvm_fpsimd_flush_cpu_state(void) {}
|
||||||
|
|
||||||
static inline void kvm_arm_vhe_guest_enter(void) {}
|
static inline void kvm_arm_vhe_guest_enter(void) {}
|
||||||
static inline void kvm_arm_vhe_guest_exit(void) {}
|
static inline void kvm_arm_vhe_guest_exit(void) {}
|
||||||
|
|
||||||
|
static inline bool kvm_arm_harden_branch_predictor(void)
|
||||||
|
{
|
||||||
|
/* No way to detect it yet, pretend it is not there. */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __ARM_KVM_HOST_H__ */
|
#endif /* __ARM_KVM_HOST_H__ */
|
||||||
|
|
|
@ -415,4 +415,10 @@ static inline void kvm_arm_vhe_guest_exit(void)
|
||||||
{
|
{
|
||||||
local_daif_restore(DAIF_PROCCTX_NOIRQ);
|
local_daif_restore(DAIF_PROCCTX_NOIRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_arm_harden_branch_predictor(void)
|
||||||
|
{
|
||||||
|
return cpus_have_const_cap(ARM64_HARDEN_BRANCH_PREDICTOR);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __ARM64_KVM_HOST_H__ */
|
#endif /* __ARM64_KVM_HOST_H__ */
|
||||||
|
|
|
@ -73,6 +73,11 @@
|
||||||
ARM_SMCCC_SMC_32, \
|
ARM_SMCCC_SMC_32, \
|
||||||
0, 1)
|
0, 1)
|
||||||
|
|
||||||
|
#define ARM_SMCCC_ARCH_WORKAROUND_1 \
|
||||||
|
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||||
|
ARM_SMCCC_SMC_32, \
|
||||||
|
0, 0x8000)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
|
@ -405,13 +405,20 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
u32 func_id = smccc_get_function(vcpu);
|
u32 func_id = smccc_get_function(vcpu);
|
||||||
u32 val = PSCI_RET_NOT_SUPPORTED;
|
u32 val = PSCI_RET_NOT_SUPPORTED;
|
||||||
|
u32 feature;
|
||||||
|
|
||||||
switch (func_id) {
|
switch (func_id) {
|
||||||
case ARM_SMCCC_VERSION_FUNC_ID:
|
case ARM_SMCCC_VERSION_FUNC_ID:
|
||||||
val = ARM_SMCCC_VERSION_1_1;
|
val = ARM_SMCCC_VERSION_1_1;
|
||||||
break;
|
break;
|
||||||
case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
|
case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
|
||||||
/* Nothing supported yet */
|
feature = smccc_get_arg1(vcpu);
|
||||||
|
switch(feature) {
|
||||||
|
case ARM_SMCCC_ARCH_WORKAROUND_1:
|
||||||
|
if (kvm_arm_harden_branch_predictor())
|
||||||
|
val = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return kvm_psci_call(vcpu);
|
return kvm_psci_call(vcpu);
|
||||||
|
|
Loading…
Reference in New Issue