Merge branch 'kvm-guest-sev-migration' into kvm-master
[platform/kernel/linux-starfive.git] / arch / x86 / kernel / kvm.c
index a672a2e..41e2965 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/nmi.h>
 #include <linux/swait.h>
 #include <linux/syscore_ops.h>
+#include <linux/cc_platform.h>
 #include <linux/efi.h>
 #include <asm/timer.h>
 #include <asm/cpu.h>
@@ -420,7 +421,7 @@ static void __init sev_map_percpu_data(void)
 {
        int cpu;
 
-       if (!sev_active())
+       if (!cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT))
                return;
 
        for_each_possible_cpu(cpu) {
@@ -559,7 +560,7 @@ static int __init setup_efi_kvm_sev_migration(void)
        unsigned long size;
        bool enabled;
 
-       if (!sev_active() ||
+       if (!cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) ||
            !kvm_para_has_feature(KVM_FEATURE_MIGRATION_CONTROL))
                return 0;
 
@@ -866,14 +867,39 @@ static void kvm_sev_hc_page_enc_status(unsigned long pfn, int npages, bool enc)
 
 static void __init kvm_init_platform(void)
 {
-       if (sev_active() &&
+       if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) &&
            kvm_para_has_feature(KVM_FEATURE_MIGRATION_CONTROL)) {
                unsigned long nr_pages;
+               int i;
 
                pv_ops.mmu.notify_page_enc_status_changed =
                        kvm_sev_hc_page_enc_status;
 
                /*
+                * Reset the host's shared pages list related to kernel
+                * specific page encryption status settings before we load a
+                * new kernel by kexec. Reset the page encryption status
+                * during early boot intead of just before kexec to avoid SMP
+                * races during kvm_pv_guest_cpu_reboot().
+                * NOTE: We cannot reset the complete shared pages list
+                * here as we need to retain the UEFI/OVMF firmware
+                * specific settings.
+                */
+
+               for (i = 0; i < e820_table->nr_entries; i++) {
+                       struct e820_entry *entry = &e820_table->entries[i];
+
+                       if (entry->type != E820_TYPE_RAM)
+                               continue;
+
+                       nr_pages = DIV_ROUND_UP(entry->size, PAGE_SIZE);
+
+                       kvm_sev_hypercall3(KVM_HC_MAP_GPA_RANGE, entry->addr,
+                                      nr_pages,
+                                      KVM_MAP_GPA_RANGE_ENCRYPTED | KVM_MAP_GPA_RANGE_PAGE_SZ_4K);
+               }
+
+               /*
                 * Ensure that _bss_decrypted section is marked as decrypted in the
                 * shared pages list.
                 */