x86/sev: Change snp_guest_issue_request()'s fw_err argument
[linux-2.6-microblaze.git] / drivers / virt / coco / sev-guest / sev-guest.c
index 0c7b47a..97dbe71 100644 (file)
@@ -332,11 +332,12 @@ static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int version, u8
        return __enc_payload(snp_dev, req, payload, sz);
 }
 
-static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, __u64 *fw_err)
+static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
+                                 struct snp_guest_request_ioctl *rio)
 {
-       unsigned long err = 0xff, override_err = 0;
        unsigned long req_start = jiffies;
        unsigned int override_npages = 0;
+       u64 override_err = 0;
        int rc;
 
 retry_request:
@@ -346,7 +347,7 @@ retry_request:
         * sequence number must be incremented or the VMPCK must be deleted to
         * prevent reuse of the IV.
         */
-       rc = snp_issue_guest_request(exit_code, &snp_dev->input, &err);
+       rc = snp_issue_guest_request(exit_code, &snp_dev->input, rio);
        switch (rc) {
        case -ENOSPC:
                /*
@@ -364,7 +365,7 @@ retry_request:
                 * request buffer size was too small and give the caller the
                 * required buffer size.
                 */
-               override_err    = SNP_GUEST_REQ_INVALID_LEN;
+               override_err = SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN);
 
                /*
                 * If this call to the firmware succeeds, the sequence number can
@@ -377,7 +378,7 @@ retry_request:
                goto retry_request;
 
        /*
-        * The host may return SNP_GUEST_REQ_ERR_EBUSY if the request has been
+        * The host may return SNP_GUEST_VMM_ERR_BUSY if the request has been
         * throttled. Retry in the driver to avoid returning and reusing the
         * message sequence number on a different message.
         */
@@ -398,27 +399,29 @@ retry_request:
         */
        snp_inc_msg_seqno(snp_dev);
 
-       if (fw_err)
-               *fw_err = override_err ?: err;
+       if (override_err) {
+               rio->exitinfo2 = override_err;
+
+               /*
+                * If an extended guest request was issued and the supplied certificate
+                * buffer was not large enough, a standard guest request was issued to
+                * prevent IV reuse. If the standard request was successful, return -EIO
+                * back to the caller as would have originally been returned.
+                */
+               if (!rc && override_err == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN))
+                       rc = -EIO;
+       }
 
        if (override_npages)
                snp_dev->input.data_npages = override_npages;
 
-       /*
-        * If an extended guest request was issued and the supplied certificate
-        * buffer was not large enough, a standard guest request was issued to
-        * prevent IV reuse. If the standard request was successful, return -EIO
-        * back to the caller as would have originally been returned.
-        */
-       if (!rc && override_err == SNP_GUEST_REQ_INVALID_LEN)
-               return -EIO;
-
        return rc;
 }
 
-static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, int msg_ver,
-                               u8 type, void *req_buf, size_t req_sz, void *resp_buf,
-                               u32 resp_sz, __u64 *fw_err)
+static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code,
+                               struct snp_guest_request_ioctl *rio, u8 type,
+                               void *req_buf, size_t req_sz, void *resp_buf,
+                               u32 resp_sz)
 {
        u64 seqno;
        int rc;
@@ -432,7 +435,7 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
        memset(snp_dev->response, 0, sizeof(struct snp_guest_msg));
 
        /* Encrypt the userspace provided payload in snp_dev->secret_request. */
-       rc = enc_payload(snp_dev, seqno, msg_ver, type, req_buf, req_sz);
+       rc = enc_payload(snp_dev, seqno, rio->msg_version, type, req_buf, req_sz);
        if (rc)
                return rc;
 
@@ -443,12 +446,16 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
        memcpy(snp_dev->request, &snp_dev->secret_request,
               sizeof(snp_dev->secret_request));
 
-       rc = __handle_guest_request(snp_dev, exit_code, fw_err);
+       rc = __handle_guest_request(snp_dev, exit_code, rio);
        if (rc) {
-               if (rc == -EIO && *fw_err == SNP_GUEST_REQ_INVALID_LEN)
+               if (rc == -EIO &&
+                   rio->exitinfo2 == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN))
                        return rc;
 
-               dev_alert(snp_dev->dev, "Detected error from ASP request. rc: %d, fw_err: %llu\n", rc, *fw_err);
+               dev_alert(snp_dev->dev,
+                         "Detected error from ASP request. rc: %d, exitinfo2: 0x%llx\n",
+                         rc, rio->exitinfo2);
+
                snp_disable_vmpck(snp_dev);
                return rc;
        }
@@ -488,9 +495,9 @@ static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_request_io
        if (!resp)
                return -ENOMEM;
 
-       rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg->msg_version,
+       rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg,
                                  SNP_MSG_REPORT_REQ, &req, sizeof(req), resp->data,
-                                 resp_len, &arg->fw_err);
+                                 resp_len);
        if (rc)
                goto e_free;
 
@@ -528,9 +535,8 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque
        if (copy_from_user(&req, (void __user *)arg->req_data, sizeof(req)))
                return -EFAULT;
 
-       rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg->msg_version,
-                                 SNP_MSG_KEY_REQ, &req, sizeof(req), buf, resp_len,
-                                 &arg->fw_err);
+       rc = handle_guest_request(snp_dev, SVM_VMGEXIT_GUEST_REQUEST, arg,
+                                 SNP_MSG_KEY_REQ, &req, sizeof(req), buf, resp_len);
        if (rc)
                return rc;
 
@@ -590,12 +596,12 @@ cmd:
                return -ENOMEM;
 
        snp_dev->input.data_npages = npages;
-       ret = handle_guest_request(snp_dev, SVM_VMGEXIT_EXT_GUEST_REQUEST, arg->msg_version,
+       ret = handle_guest_request(snp_dev, SVM_VMGEXIT_EXT_GUEST_REQUEST, arg,
                                   SNP_MSG_REPORT_REQ, &req.data,
-                                  sizeof(req.data), resp->data, resp_len, &arg->fw_err);
+                                  sizeof(req.data), resp->data, resp_len);
 
        /* If certs length is invalid then copy the returned length */
-       if (arg->fw_err == SNP_GUEST_REQ_INVALID_LEN) {
+       if (arg->vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN) {
                req.certs_len = snp_dev->input.data_npages << PAGE_SHIFT;
 
                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
        if (copy_from_user(&input, argp, sizeof(input)))
                return -EFAULT;
 
-       input.fw_err = 0xff;
+       input.exitinfo2 = 0xff;
 
        /* Message version must be non-zero */
        if (!input.msg_version)
@@ -661,7 +667,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long
 
        mutex_unlock(&snp_cmd_mutex);
 
-       if (input.fw_err && copy_to_user(argp, &input, sizeof(input)))
+       if (input.exitinfo2 && copy_to_user(argp, &input, sizeof(input)))
                return -EFAULT;
 
        return ret;