@@ -332,11 +332,12 @@ static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int version, u8
332332 return __enc_payload (snp_dev , req , payload , sz );
333333}
334334
335- static int __handle_guest_request (struct snp_guest_dev * snp_dev , u64 exit_code , __u64 * fw_err )
335+ static int __handle_guest_request (struct snp_guest_dev * snp_dev , u64 exit_code ,
336+ struct snp_guest_request_ioctl * rio )
336337{
337- unsigned long err = 0xff , override_err = 0 ;
338338 unsigned long req_start = jiffies ;
339339 unsigned int override_npages = 0 ;
340+ u64 override_err = 0 ;
340341 int rc ;
341342
342343retry_request :
@@ -346,7 +347,7 @@ static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
346347 * sequence number must be incremented or the VMPCK must be deleted to
347348 * prevent reuse of the IV.
348349 */
349- rc = snp_issue_guest_request (exit_code , & snp_dev -> input , & err );
350+ rc = snp_issue_guest_request (exit_code , & snp_dev -> input , rio );
350351 switch (rc ) {
351352 case - ENOSPC :
352353 /*
@@ -364,7 +365,7 @@ static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
364365 * request buffer size was too small and give the caller the
365366 * required buffer size.
366367 */
367- override_err = SNP_GUEST_REQ_INVALID_LEN ;
368+ override_err = SNP_GUEST_VMM_ERR ( SNP_GUEST_VMM_ERR_INVALID_LEN ) ;
368369
369370 /*
370371 * If this call to the firmware succeeds, the sequence number can
@@ -377,7 +378,7 @@ static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
377378 goto retry_request ;
378379
379380 /*
380- * The host may return SNP_GUEST_REQ_ERR_EBUSY if the request has been
381+ * The host may return SNP_GUEST_VMM_ERR_BUSY if the request has been
381382 * throttled. Retry in the driver to avoid returning and reusing the
382383 * message sequence number on a different message.
383384 */
@@ -398,27 +399,29 @@ static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
398399 */
399400 snp_inc_msg_seqno (snp_dev );
400401
401- if (fw_err )
402- * fw_err = override_err ?: err ;
402+ if (override_err ) {
403+ rio -> exitinfo2 = override_err ;
404+
405+ /*
406+ * If an extended guest request was issued and the supplied certificate
407+ * buffer was not large enough, a standard guest request was issued to
408+ * prevent IV reuse. If the standard request was successful, return -EIO
409+ * back to the caller as would have originally been returned.
410+ */
411+ if (!rc && override_err == SNP_GUEST_VMM_ERR (SNP_GUEST_VMM_ERR_INVALID_LEN ))
412+ rc = - EIO ;
413+ }
403414
404415 if (override_npages )
405416 snp_dev -> input .data_npages = override_npages ;
406417
407- /*
408- * If an extended guest request was issued and the supplied certificate
409- * buffer was not large enough, a standard guest request was issued to
410- * prevent IV reuse. If the standard request was successful, return -EIO
411- * back to the caller as would have originally been returned.
412- */
413- if (!rc && override_err == SNP_GUEST_REQ_INVALID_LEN )
414- return - EIO ;
415-
416418 return rc ;
417419}
418420
419- static int handle_guest_request (struct snp_guest_dev * snp_dev , u64 exit_code , int msg_ver ,
420- u8 type , void * req_buf , size_t req_sz , void * resp_buf ,
421- u32 resp_sz , __u64 * fw_err )
421+ static int handle_guest_request (struct snp_guest_dev * snp_dev , u64 exit_code ,
422+ struct snp_guest_request_ioctl * rio , u8 type ,
423+ void * req_buf , size_t req_sz , void * resp_buf ,
424+ u32 resp_sz )
422425{
423426 u64 seqno ;
424427 int rc ;
@@ -432,7 +435,7 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
432435 memset (snp_dev -> response , 0 , sizeof (struct snp_guest_msg ));
433436
434437 /* Encrypt the userspace provided payload in snp_dev->secret_request. */
435- rc = enc_payload (snp_dev , seqno , msg_ver , type , req_buf , req_sz );
438+ rc = enc_payload (snp_dev , seqno , rio -> msg_version , type , req_buf , req_sz );
436439 if (rc )
437440 return rc ;
438441
@@ -443,12 +446,16 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
443446 memcpy (snp_dev -> request , & snp_dev -> secret_request ,
444447 sizeof (snp_dev -> secret_request ));
445448
446- rc = __handle_guest_request (snp_dev , exit_code , fw_err );
449+ rc = __handle_guest_request (snp_dev , exit_code , rio );
447450 if (rc ) {
448- if (rc == - EIO && * fw_err == SNP_GUEST_REQ_INVALID_LEN )
451+ if (rc == - EIO &&
452+ rio -> exitinfo2 == SNP_GUEST_VMM_ERR (SNP_GUEST_VMM_ERR_INVALID_LEN ))
449453 return rc ;
450454
451- dev_alert (snp_dev -> dev , "Detected error from ASP request. rc: %d, fw_err: %llu\n" , rc , * fw_err );
455+ dev_alert (snp_dev -> dev ,
456+ "Detected error from ASP request. rc: %d, exitinfo2: 0x%llx\n" ,
457+ rc , rio -> exitinfo2 );
458+
452459 snp_disable_vmpck (snp_dev );
453460 return rc ;
454461 }
@@ -488,9 +495,9 @@ static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_request_io
488495 if (!resp )
489496 return - ENOMEM ;
490497
491- rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg -> msg_version ,
498+ rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg ,
492499 SNP_MSG_REPORT_REQ , & req , sizeof (req ), resp -> data ,
493- resp_len , & arg -> fw_err );
500+ resp_len );
494501 if (rc )
495502 goto e_free ;
496503
@@ -528,9 +535,8 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque
528535 if (copy_from_user (& req , (void __user * )arg -> req_data , sizeof (req )))
529536 return - EFAULT ;
530537
531- rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg -> msg_version ,
532- SNP_MSG_KEY_REQ , & req , sizeof (req ), buf , resp_len ,
533- & arg -> fw_err );
538+ rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg ,
539+ SNP_MSG_KEY_REQ , & req , sizeof (req ), buf , resp_len );
534540 if (rc )
535541 return rc ;
536542
@@ -590,12 +596,12 @@ static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_reques
590596 return - ENOMEM ;
591597
592598 snp_dev -> input .data_npages = npages ;
593- ret = handle_guest_request (snp_dev , SVM_VMGEXIT_EXT_GUEST_REQUEST , arg -> msg_version ,
599+ ret = handle_guest_request (snp_dev , SVM_VMGEXIT_EXT_GUEST_REQUEST , arg ,
594600 SNP_MSG_REPORT_REQ , & req .data ,
595- sizeof (req .data ), resp -> data , resp_len , & arg -> fw_err );
601+ sizeof (req .data ), resp -> data , resp_len );
596602
597603 /* If certs length is invalid then copy the returned length */
598- if (arg -> fw_err == SNP_GUEST_REQ_INVALID_LEN ) {
604+ if (arg -> vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN ) {
599605 req .certs_len = snp_dev -> input .data_npages << PAGE_SHIFT ;
600606
601607 if (copy_to_user ((void __user * )arg -> req_data , & req , sizeof (req )))
@@ -630,7 +636,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long
630636 if (copy_from_user (& input , argp , sizeof (input )))
631637 return - EFAULT ;
632638
633- input .fw_err = 0xff ;
639+ input .exitinfo2 = 0xff ;
634640
635641 /* Message version must be non-zero */
636642 if (!input .msg_version )
@@ -661,7 +667,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long
661667
662668 mutex_unlock (& snp_cmd_mutex );
663669
664- if (input .fw_err && copy_to_user (argp , & input , sizeof (input )))
670+ if (input .exitinfo2 && copy_to_user (argp , & input , sizeof (input )))
665671 return - EFAULT ;
666672
667673 return ret ;
0 commit comments