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;