enable_ssbs
Signed-off-by: David Brazdil <dbrazdil@google.com>
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
index 310ef17..07f0ff8a 100644
--- a/arch/arm64/include/asm/kvm_asm.h
+++ b/arch/arm64/include/asm/kvm_asm.h
@@ -53,7 +53,6 @@
#define __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_local_vmid 4
#define __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff 5
#define __KVM_HOST_SMCCC_FUNC___kvm_vcpu_run 6
-#define __KVM_HOST_SMCCC_FUNC___kvm_enable_ssbs 8
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_get_ich_vtr_el2 9
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_read_vmcr 10
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_write_vmcr 11
@@ -113,7 +112,6 @@
extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
extern void __kvm_timer_set_cntvoff(u64 cntvoff);
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
-extern void __kvm_enable_ssbs(void);
extern u64 __vgic_v3_get_ich_vtr_el2(void);
extern u64 __vgic_v3_read_vmcr(void);
extern void __vgic_v3_write_vmcr(u32 vmcr);
diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h
index 1e6339a..2e3b614 100644
--- a/arch/arm64/include/asm/kvm_hyp.h
+++ b/arch/arm64/include/asm/kvm_hyp.h
@@ -16,6 +16,7 @@
void *hyp_stack_ptr;
void *vector_ptr;
bool ssbd_callback_required;
+ bool enable_ssbs;
};
#define read_sysreg_elx(r,nvh,vh) \
@@ -73,6 +74,7 @@
#ifdef __KVM_NVHE_HYPERVISOR__
void __sysreg_save_state_nvhe(struct kvm_cpu_context *ctxt);
void __sysreg_restore_state_nvhe(struct kvm_cpu_context *ctxt);
+void __sysreg_enable_ssbs(void);
#else
void sysreg_save_host_state_vhe(struct kvm_cpu_context *ctxt);
void sysreg_restore_host_state_vhe(struct kvm_cpu_context *ctxt);
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index da2e6a5..b3930ed 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -1314,6 +1314,8 @@
+ PAGE_SIZE),
.vector_ptr = kvm_get_hyp_vector(),
.ssbd_callback_required = this_cpu_read(arm64_ssbd_callback_required),
+ .enable_ssbs = this_cpu_has_cap(ARM64_SSBS) &&
+ arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE,
};
/*
@@ -1326,15 +1328,6 @@
arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(__kvm_hyp_init),
pgd_ptr, tpidr_el2, start_hyp, &res);
WARN_ON(res.a0 != SMCCC_RET_SUCCESS);
-
- /*
- * Disabling SSBD on a non-VHE system requires us to enable SSBS
- * at EL2.
- */
- if (this_cpu_has_cap(ARM64_SSBS) &&
- arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) {
- kvm_call_hyp_nvhe(__kvm_enable_ssbs);
- }
}
static void cpu_hyp_reset(void)
diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
index 7dce884..bea1e19 100644
--- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
+++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
@@ -62,9 +62,6 @@
ret = __kvm_vcpu_run(vcpu);
break;
}
- case KVM_HOST_SMCCC_FUNC(__kvm_enable_ssbs):
- __kvm_enable_ssbs();
- break;
case KVM_HOST_SMCCC_FUNC(__vgic_v3_get_ich_vtr_el2):
ret = __vgic_v3_get_ich_vtr_el2();
break;
@@ -118,6 +115,10 @@
__this_cpu_write(arm64_ssbd_callback_required, 1);
#endif
+ /* Disabling SSBD on a nVHE system requires to enable SSBS at EL2. */
+ if (params->enable_ssbs)
+ __sysreg_enable_ssbs();
+
host_vcpu = this_cpu_ptr(&kvm_host_vcpu);
hyp_data = this_cpu_ptr(&kvm_host_data);
hyp_ctxt = &hyp_data->host_ctxt;
diff --git a/arch/arm64/kvm/hyp/nvhe/sysreg-sr.c b/arch/arm64/kvm/hyp/nvhe/sysreg-sr.c
index 88a25fc..6f24095 100644
--- a/arch/arm64/kvm/hyp/nvhe/sysreg-sr.c
+++ b/arch/arm64/kvm/hyp/nvhe/sysreg-sr.c
@@ -34,7 +34,7 @@
__sysreg_restore_el2_return_state(ctxt);
}
-void __kvm_enable_ssbs(void)
+void __sysreg_enable_ssbs(void)
{
u64 tmp;