|
36 | 36 | #define GHCB_VERSION_MAX 1ULL
|
37 | 37 | #define GHCB_VERSION_MIN 1ULL
|
38 | 38 |
|
| 39 | +#define GHCB_HV_FT_SUPPORTED GHCB_HV_FT_SNP |
| 40 | + |
39 | 41 | /* enable/disable SEV support */
|
40 | 42 | static bool sev_enabled = true;
|
41 | 43 | module_param_named(sev, sev_enabled, bool, 0444);
|
@@ -2701,6 +2703,7 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)
|
2701 | 2703 | case SVM_VMGEXIT_AP_HLT_LOOP:
|
2702 | 2704 | case SVM_VMGEXIT_AP_JUMP_TABLE:
|
2703 | 2705 | case SVM_VMGEXIT_UNSUPPORTED_EVENT:
|
| 2706 | + case SVM_VMGEXIT_HV_FEATURES: |
2704 | 2707 | break;
|
2705 | 2708 | default:
|
2706 | 2709 | reason = GHCB_ERR_INVALID_EVENT;
|
@@ -2961,6 +2964,12 @@ static int sev_handle_vmgexit_msr_protocol(struct vcpu_svm *svm)
|
2961 | 2964 | GHCB_MSR_INFO_MASK,
|
2962 | 2965 | GHCB_MSR_INFO_POS);
|
2963 | 2966 | break;
|
| 2967 | + case GHCB_MSR_HV_FT_REQ: |
| 2968 | + set_ghcb_msr_bits(svm, GHCB_HV_FT_SUPPORTED, |
| 2969 | + GHCB_MSR_HV_FT_MASK, GHCB_MSR_HV_FT_POS); |
| 2970 | + set_ghcb_msr_bits(svm, GHCB_MSR_HV_FT_RESP, |
| 2971 | + GHCB_MSR_INFO_MASK, GHCB_MSR_INFO_POS); |
| 2972 | + break; |
2964 | 2973 | case GHCB_MSR_TERM_REQ: {
|
2965 | 2974 | u64 reason_set, reason_code;
|
2966 | 2975 |
|
@@ -3085,6 +3094,11 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu)
|
3085 | 3094 | ret = 1;
|
3086 | 3095 | break;
|
3087 | 3096 | }
|
| 3097 | + case SVM_VMGEXIT_HV_FEATURES: |
| 3098 | + ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, GHCB_HV_FT_SUPPORTED); |
| 3099 | + |
| 3100 | + ret = 1; |
| 3101 | + break; |
3088 | 3102 | case SVM_VMGEXIT_UNSUPPORTED_EVENT:
|
3089 | 3103 | vcpu_unimpl(vcpu,
|
3090 | 3104 | "vmgexit: unsupported event - exit_info_1=%#llx, exit_info_2=%#llx\n",
|
|
0 commit comments