@@ -3270,11 +3270,6 @@ void sev_free_vcpu(struct kvm_vcpu *vcpu)
32703270 kvfree (svm -> sev_es .ghcb_sa );
32713271}
32723272
3273- static u64 kvm_get_cached_sw_exit_code (struct vmcb_control_area * control )
3274- {
3275- return (((u64 )control -> exit_code_hi ) << 32 ) | control -> exit_code ;
3276- }
3277-
32783273static void dump_ghcb (struct vcpu_svm * svm )
32793274{
32803275 struct vmcb_control_area * control = & svm -> vmcb -> control ;
@@ -3296,7 +3291,7 @@ static void dump_ghcb(struct vcpu_svm *svm)
32963291 */
32973292 pr_err ("GHCB (GPA=%016llx) snapshot:\n" , svm -> vmcb -> control .ghcb_gpa );
32983293 pr_err ("%-20s%016llx is_valid: %u\n" , "sw_exit_code" ,
3299- kvm_get_cached_sw_exit_code ( control ) , kvm_ghcb_sw_exit_code_is_valid (svm ));
3294+ control -> exit_code , kvm_ghcb_sw_exit_code_is_valid (svm ));
33003295 pr_err ("%-20s%016llx is_valid: %u\n" , "sw_exit_info_1" ,
33013296 control -> exit_info_1 , kvm_ghcb_sw_exit_info_1_is_valid (svm ));
33023297 pr_err ("%-20s%016llx is_valid: %u\n" , "sw_exit_info_2" ,
@@ -3330,7 +3325,6 @@ static void sev_es_sync_from_ghcb(struct vcpu_svm *svm)
33303325 struct vmcb_control_area * control = & svm -> vmcb -> control ;
33313326 struct kvm_vcpu * vcpu = & svm -> vcpu ;
33323327 struct ghcb * ghcb = svm -> sev_es .ghcb ;
3333- u64 exit_code ;
33343328
33353329 /*
33363330 * The GHCB protocol so far allows for the following data
@@ -3364,9 +3358,7 @@ static void sev_es_sync_from_ghcb(struct vcpu_svm *svm)
33643358 __kvm_emulate_msr_write (vcpu , MSR_IA32_XSS , kvm_ghcb_get_xss (svm ));
33653359
33663360 /* Copy the GHCB exit information into the VMCB fields */
3367- exit_code = kvm_ghcb_get_sw_exit_code (svm );
3368- control -> exit_code = lower_32_bits (exit_code );
3369- control -> exit_code_hi = upper_32_bits (exit_code );
3361+ control -> exit_code = kvm_ghcb_get_sw_exit_code (svm );
33703362 control -> exit_info_1 = kvm_ghcb_get_sw_exit_info_1 (svm );
33713363 control -> exit_info_2 = kvm_ghcb_get_sw_exit_info_2 (svm );
33723364 svm -> sev_es .sw_scratch = kvm_ghcb_get_sw_scratch_if_valid (svm );
@@ -3379,15 +3371,8 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)
33793371{
33803372 struct vmcb_control_area * control = & svm -> vmcb -> control ;
33813373 struct kvm_vcpu * vcpu = & svm -> vcpu ;
3382- u64 exit_code ;
33833374 u64 reason ;
33843375
3385- /*
3386- * Retrieve the exit code now even though it may not be marked valid
3387- * as it could help with debugging.
3388- */
3389- exit_code = kvm_get_cached_sw_exit_code (control );
3390-
33913376 /* Only GHCB Usage code 0 is supported */
33923377 if (svm -> sev_es .ghcb -> ghcb_usage ) {
33933378 reason = GHCB_ERR_INVALID_USAGE ;
@@ -3401,7 +3386,7 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)
34013386 !kvm_ghcb_sw_exit_info_2_is_valid (svm ))
34023387 goto vmgexit_err ;
34033388
3404- switch (exit_code ) {
3389+ switch (control -> exit_code ) {
34053390 case SVM_EXIT_READ_DR7 :
34063391 break ;
34073392 case SVM_EXIT_WRITE_DR7 :
@@ -3502,15 +3487,19 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)
35023487 return 0 ;
35033488
35043489vmgexit_err :
3490+ /*
3491+ * Print the exit code even though it may not be marked valid as it
3492+ * could help with debugging.
3493+ */
35053494 if (reason == GHCB_ERR_INVALID_USAGE ) {
35063495 vcpu_unimpl (vcpu , "vmgexit: ghcb usage %#x is not valid\n" ,
35073496 svm -> sev_es .ghcb -> ghcb_usage );
35083497 } else if (reason == GHCB_ERR_INVALID_EVENT ) {
35093498 vcpu_unimpl (vcpu , "vmgexit: exit code %#llx is not valid\n" ,
3510- exit_code );
3499+ control -> exit_code );
35113500 } else {
35123501 vcpu_unimpl (vcpu , "vmgexit: exit code %#llx input is not valid\n" ,
3513- exit_code );
3502+ control -> exit_code );
35143503 dump_ghcb (svm );
35153504 }
35163505
@@ -4349,7 +4338,7 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu)
43494338{
43504339 struct vcpu_svm * svm = to_svm (vcpu );
43514340 struct vmcb_control_area * control = & svm -> vmcb -> control ;
4352- u64 ghcb_gpa , exit_code ;
4341+ u64 ghcb_gpa ;
43534342 int ret ;
43544343
43554344 /* Validate the GHCB */
@@ -4391,8 +4380,7 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu)
43914380
43924381 svm_vmgexit_success (svm , 0 );
43934382
4394- exit_code = kvm_get_cached_sw_exit_code (control );
4395- switch (exit_code ) {
4383+ switch (control -> exit_code ) {
43964384 case SVM_VMGEXIT_MMIO_READ :
43974385 ret = setup_vmgexit_scratch (svm , true, control -> exit_info_2 );
43984386 if (ret )
@@ -4484,7 +4472,7 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu)
44844472 ret = - EINVAL ;
44854473 break ;
44864474 default :
4487- ret = svm_invoke_exit_handler (vcpu , exit_code );
4475+ ret = svm_invoke_exit_handler (vcpu , control -> exit_code );
44884476 }
44894477
44904478 return ret ;
0 commit comments