KVM: SVM: Mark SEV launch secret pages as dirty.
authorCfir Cohen <cfir@google.com>
Sat, 8 Aug 2020 00:37:46 +0000 (17:37 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 28 Sep 2020 11:57:24 +0000 (07:57 -0400)
The LAUNCH_SECRET command performs encryption of the
launch secret memory contents. Mark pinned pages as
dirty, before unpinning them.
This matches the logic in sev_launch_update_data().

Signed-off-by: Cfir Cohen <cfir@google.com>
Message-Id: <20200808003746.66687-1-cfir@google.com>
Reviewed-by: Brijesh Singh <brijesh.singh@amd.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/sev.c

index 7bf7bf734979488ac0f1cf10808f32ce3be882a9..bb0e89c79a04b5ddab53884099f01b90c072ce70 100644 (file)
@@ -856,7 +856,7 @@ static int sev_launch_secret(struct kvm *kvm, struct kvm_sev_cmd *argp)
        struct kvm_sev_launch_secret params;
        struct page **pages;
        void *blob, *hdr;
-       unsigned long n;
+       unsigned long n, i;
        int ret, offset;
 
        if (!sev_guest(kvm))
@@ -869,6 +869,14 @@ static int sev_launch_secret(struct kvm *kvm, struct kvm_sev_cmd *argp)
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
+       /*
+        * The LAUNCH_SECRET command will perform in-place encryption of the
+        * memory content (i.e it will write the same memory region with C=1).
+        * It's possible that the cache may contain the data with C=0, i.e.,
+        * unencrypted so invalidate it first.
+        */
+       sev_clflush_pages(pages, n);
+
        /*
         * The secret must be copied into contiguous memory region, lets verify
         * that userspace memory pages are contiguous before we issue command.
@@ -914,6 +922,11 @@ e_free_blob:
 e_free:
        kfree(data);
 e_unpin_memory:
+       /* content of memory is updated, mark pages dirty */
+       for (i = 0; i < n; i++) {
+               set_page_dirty_lock(pages[i]);
+               mark_page_accessed(pages[i]);
+       }
        sev_unpin_memory(kvm, pages, n);
        return ret;
 }