On 02/03/2017 16:18, Brijesh Singh wrote:
+static int __sev_dbg_decrypt_page(struct kvm *kvm, unsigned long src,
+ void *dst, int *error)
+{
+ inpages = sev_pin_memory(src, PAGE_SIZE, &npages);
+ if (!inpages) {
+ ret = -ENOMEM;
+ goto err_1;
+ }
+
+ data->handle = sev_get_handle(kvm);
+ data->dst_addr = __psp_pa(dst);
+ data->src_addr = __sev_page_pa(inpages[0]);
+ data->length = PAGE_SIZE;
+
+ ret = sev_issue_cmd(kvm, SEV_CMD_DBG_DECRYPT, data, error);
+ if (ret)
+ printk(KERN_ERR "SEV: DEBUG_DECRYPT %d (%#010x)\n",
+ ret, *error);
+ sev_unpin_memory(inpages, npages);
+err_1:
+ kfree(data);
+ return ret;
+}
+
+static int sev_dbg_decrypt(struct kvm *kvm, struct kvm_sev_cmd *argp)
+{
+ void *data;
+ int ret, offset, len;
+ struct kvm_sev_dbg debug;
+
+ if (!sev_guest(kvm))
+ return -ENOTTY;
+
+ if (copy_from_user(&debug, (void *)argp->data,
+ sizeof(struct kvm_sev_dbg)))
+ return -EFAULT;
+ /*
+ * TODO: add support for decrypting length which crosses the
+ * page boundary.
+ */
+ offset = debug.src_addr & (PAGE_SIZE - 1);
+ if (offset + debug.length > PAGE_SIZE)
+ return -EINVAL;
+
Please do add it, it doesn't seem very different from what you're doing
in LAUNCH_UPDATE_DATA. There's no need for a separate
__sev_dbg_decrypt_page function, you can just pin/unpin here and do a
per-page loop as in LAUNCH_UPDATE_DATA.