kvm: svm: Add initial GHCB protocol version 2 support
cover kvm: svm: Add initial GHCB protocol version 2 support
From: Joerg Roedel <[email protected]>
Hi,
here is a small set of patches which I took from the pending SEV-SNP patch-sets to enable basic support for GHCB protocol version 2.
When SEV-SNP is not supported, only two new MSR protocol VMGEXIT calls need to be supported:
- MSR-based AP-reset-hold
- MSR-based HV-feature-request
These calls are implemented by here and then the protocol is lifted to version 2.
This is submitted separately because the MSR-based AP-reset-hold call is required to support kexec/kdump in SEV-ES guests.
Regards,
Joerg
Brijesh Singh (2):
KVM: SVM: Add support for Hypervisor Feature support MSR protocol
KVM: SVM: Increase supported GHCB protocol version
Tom Lendacky (1):
KVM: SVM: Add support to handle AP reset MSR protocol
arch/x86/include/asm/sev-common.h | 5 +++ arch/x86/include/uapi/asm/svm.h | 1 + arch/x86/kvm/svm/sev.c | 63 +++++++++++++++++++++++++++---- arch/x86/kvm/svm/svm.h | 4 +- 4 files changed, 64 insertions(+), 9 deletions(-)
base-commit: e73f0f0ee7541171d89f2e2491130c7771ba58d3
Signature · 1 line
2.31.1
PATCH 1/3 KVM: SVM: Add support to handle AP reset MSR protocol
From: Tom Lendacky <[email protected]>
Add support for AP Reset Hold being invoked using the GHCB MSR protocol, available in version 2 of the GHCB specification.
--- arch/x86/include/asm/sev-common.h | 1 + arch/x86/kvm/svm/sev.c | 51 ++++++++++++++++++++++++++----- arch/x86/kvm/svm/svm.h | 1 + 3 files changed, 45 insertions(+), 8 deletions(-)
arch/x86/include/asm/sev-common.h +1 -0
@@ -11,6 +11,7 @@#define GHCB_MSR_INFO_POS 0#define GHCB_DATA_LOW 12#define GHCB_MSR_INFO_MASK (BIT_ULL(GHCB_DATA_LOW) - 1) +#define GHCB_DATA_MASK GENMASK_ULL(51, 0)#define GHCB_DATA (v) \ (((unsigned long)(v) & ~GHCB_MSR_INFO_MASK) >> GHCB_DATA_LOW)
arch/x86/kvm/svm/sev.c +43 -8
80 lines not on this page · raw message
arch/x86/kvm/svm/svm.h +1 -0
@@ -187,6 +187,7 @@ struct vcpu_svm {struct ghcb *ghcb;struct kvm_host_map ghcb_map;bool received_first_sipi; +unsigned int ap_reset_hold_type;/* SEV-ES scratch area support */ void *ghcb_sa;
Signature · 1 line
2.31.1
PATCH 2/3 KVM: SVM: Add support for Hypervisor Feature support MSR protocol
In reply to Joerg RoedelFrom: Brijesh Singh <[email protected]>
Version 2 of the GHCB specification introduced advertisement of features that are supported by the Hypervisor.
--- arch/x86/include/asm/sev-common.h | 4 ++++ arch/x86/include/uapi/asm/svm.h | 1 + arch/x86/kvm/svm/sev.c | 12 ++++++++++++ arch/x86/kvm/svm/svm.h | 1 + 4 files changed, 18 insertions(+)
arch/x86/include/asm/sev-common.h +4 -0
@@ -60,6 +60,10 @@#define GHCB_MSR_HV_FT_REQ 0x080#define GHCB_MSR_HV_FT_RESP 0x081 +/* GHCB Hypervisor Feature Request/Response */ +#define GHCB_MSR_HV_FT_REQ 0x080 +#define GHCB_MSR_HV_FT_RESP 0x081 +#define GHCB_MSR_TERM_REQ 0x100#define GHCB_MSR_TERM_REASON_SET_POS 12#define GHCB_MSR_TERM_REASON_SET_MASK 0xf
arch/x86/include/uapi/asm/svm.h +1 -0
@@ -108,6 +108,7 @@#define SVM_VMGEXIT_AP_JUMP_TABLE 0x80000005#define SVM_VMGEXIT_SET_AP_JUMP_TABLE 0#define SVM_VMGEXIT_GET_AP_JUMP_TABLE 1 +#define SVM_VMGEXIT_HV_FT 0x8000fffd#define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff/* Exit code reserved for hypervisor/software use */
arch/x86/kvm/svm/sev.c +12 -0
@@ -2182,6 +2182,7 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)case SVM_VMGEXIT_AP_HLT_LOOP :case SVM_VMGEXIT_AP_JUMP_TABLE :case SVM_VMGEXIT_UNSUPPORTED_EVENT : +case SVM_VMGEXIT_HV_FT :break ;default : goto vmgexit_err;
@@ -2434,6 +2435,11 @@ static int sev_handle_vmgexit_msr_protocol(struct vcpu_svm *svm) GHCB_MSR_INFO_MASK, GHCB_MSR_INFO_POS);break ; } +case GHCB_MSR_HV_FT_REQ : { +set_ghcb_msr_bits (svm,GHCB_HV_FT_SUPPORTED ,GHCB_DATA_MASK ,GHCB_DATA_LOW ); +set_ghcb_msr_bits (svm,GHCB_MSR_HV_FT_RESP ,GHCB_MSR_INFO_MASK ,GHCB_MSR_INFO_POS ); +break ; + }case GHCB_MSR_TERM_REQ : {u64 reason_set, reason_code;
@@ -2549,6 +2555,12 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu) ret =1 ;break ; } +case SVM_VMGEXIT_HV_FT : { +ghcb_set_sw_exit_info_2 (ghcb,GHCB_HV_FT_SUPPORTED ); + + ret =1 ; +break ; + }case SVM_VMGEXIT_UNSUPPORTED_EVENT : vcpu_unimpl(vcpu, "vmgexit: unsupported event - exit_info_1=%#llx, exit_info_2=%#llx\n",
arch/x86/kvm/svm/svm.h +1 -0
@@ -546,6 +546,7 @@ void svm_vcpu_unblocking(struct kvm_vcpu *vcpu);#define GHCB_VERSION_MAX 1ULL#define GHCB_VERSION_MIN 1ULL +#define GHCB_HV_FT_SUPPORTED 0extern unsigned int max_sev_asid;
Signature · 1 line
2.31.1
Re: [PATCH 2/3] KVM: SVM: Add support for Hypervisor Feature support MSR protocol
Quoted 19 lines · Joerg Roedel
From: Brijesh Singh <[email protected]>
Version 2 of the GHCB specification introduced advertisement of features that are supported by the Hypervisor.
Signed-off-by Brijesh Singh <[email protected]>Signed-off-by Joerg Roedel <[email protected]>--- arch/x86/include/asm/sev-common.h | 4 ++++ arch/x86/include/uapi/asm/svm.h | 1 + arch/x86/kvm/svm/sev.c | 12 ++++++++++++ arch/x86/kvm/svm/svm.h | 1 + 4 files changed, 18 insertions(+)arch/x86/include/asm/sev-common.h +0
-0
arch/x86/include/asm/sev-common.h line 66
Quoted 7 lines
arch/x86/include/asm/sev-common.h +4
-0@@ -60,6 +60,10 @@#define GHCB_MSR_HV_FT_REQ 0x080#define GHCB_MSR_HV_FT_RESP 0x081 +/* GHCB Hypervisor Feature Request/Response */ +#define GHCB_MSR_HV_FT_REQ 0x080 +#define GHCB_MSR_HV_FT_RESP 0x081 +
Looks like some of these definitions are already present, since the new lines are the same as the lines above it.
Thanks,
Tom
Quoted 65 lines
arch/x86/include/asm/sev-common.h +0
-0#define GHCB_MSR_TERM_REQ 0x100#define GHCB_MSR_TERM_REASON_SET_POS 12#define GHCB_MSR_TERM_REASON_SET_MASK 0xfarch/x86/include/uapi/asm/svm.h +1
-0@@ -108,6 +108,7 @@#define SVM_VMGEXIT_AP_JUMP_TABLE 0x80000005#define SVM_VMGEXIT_SET_AP_JUMP_TABLE 0#define SVM_VMGEXIT_GET_AP_JUMP_TABLE 1 +#define SVM_VMGEXIT_HV_FT 0x8000fffd#define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff/* Exit code reserved for hypervisor/software use */ arch/x86/kvm/svm/sev.c +12
-0@@ -2182,6 +2182,7 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)case SVM_VMGEXIT_AP_HLT_LOOP :case SVM_VMGEXIT_AP_JUMP_TABLE :case SVM_VMGEXIT_UNSUPPORTED_EVENT : +case SVM_VMGEXIT_HV_FT :break ;default : goto vmgexit_err;@@ -2434,6 +2435,11 @@ static int sev_handle_vmgexit_msr_protocol(struct vcpu_svm *svm) GHCB_MSR_INFO_MASK, GHCB_MSR_INFO_POS);break ; } +case GHCB_MSR_HV_FT_REQ : { +set_ghcb_msr_bits (svm,GHCB_HV_FT_SUPPORTED ,GHCB_DATA_MASK ,GHCB_DATA_LOW ); +set_ghcb_msr_bits (svm,GHCB_MSR_HV_FT_RESP ,GHCB_MSR_INFO_MASK ,GHCB_MSR_INFO_POS ); +break ; + }case GHCB_MSR_TERM_REQ : {u64 reason_set, reason_code;@@ -2549,6 +2555,12 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu) ret =1 ;break ; } +case SVM_VMGEXIT_HV_FT : { +ghcb_set_sw_exit_info_2 (ghcb,GHCB_HV_FT_SUPPORTED ); + + ret =1 ; +break ; + }case SVM_VMGEXIT_UNSUPPORTED_EVENT : vcpu_unimpl(vcpu, "vmgexit: unsupported event - exit_info_1=%#llx, exit_info_2=%#llx\n",arch/x86/kvm/svm/svm.h +1
-0@@ -546,6 +546,7 @@ void svm_vcpu_unblocking(struct kvm_vcpu *vcpu);#define GHCB_VERSION_MAX 1ULL#define GHCB_VERSION_MIN 1ULL +#define GHCB_HV_FT_SUPPORTED 0extern unsigned int max_sev_asid;
Re: [PATCH 2/3] KVM: SVM: Add support for Hypervisor Feature support MSR protocol
Quoted 11 lines · Tom Lendacky
arch/x86/include/asm/sev-common.h line 66
Quoted 7 lines · Joerg Roedel
#define
GHCB_MSR_HV_FT_REQ0x080
#defineGHCB_MSR_HV_FT_RESP0x081arch/x86/include/asm/sev-common.h +4
-0+/* GHCB Hypervisor Feature Request/Response */ +#define GHCB_MSR_HV_FT_REQ 0x080 +#define GHCB_MSR_HV_FT_RESP 0x081 +Looks like some of these definitions are already present, since the new lines are the same as the lines above it.
Right, that is a rebasing artifact. Thanks for spotting it, I fix that up in the next version.
Regards,
Joerg
PATCH 3/3 KVM: SVM: Increase supported GHCB protocol version
In reply to Joerg RoedelFrom: Brijesh Singh <[email protected]>
Now that KVM has basic support for version 2 of the GHCB specification, bump the maximum supported protocol version. The SNP specific functions are still missing, but those are only required when the Hypervisor supports running SNP guests.
--- arch/x86/kvm/svm/svm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/svm/svm.h +1 -1
@@ -543,7 +543,7 @@ void svm_vcpu_unblocking(struct kvm_vcpu *vcpu);/* sev.c */ -#define GHCB_VERSION_MAX 1ULL +#define GHCB_VERSION_MAX 2ULL#define GHCB_VERSION_MIN 1ULL#define GHCB_HV_FT_SUPPORTED 0
Signature · 1 line
2.31.1