Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: x86/xen: register shared_info page

Add KVM_XEN_ATTR_TYPE_SHARED_INFO to allow hypervisor to know where the
guest's shared info page is.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>

authored by

Joao Martins and committed by
David Woodhouse
13ffb97a 1ea9f2ed

+43 -5
+2
arch/x86/include/asm/kvm_host.h
··· 908 908 /* Xen emulation context */ 909 909 struct kvm_xen { 910 910 bool long_mode; 911 + bool shinfo_set; 912 + struct gfn_to_hva_cache shinfo_cache; 911 913 }; 912 914 913 915 enum kvm_irqchip_mode {
+37 -5
arch/x86/kvm/xen.c
··· 13 13 #include <linux/kvm_host.h> 14 14 15 15 #include <trace/events/kvm.h> 16 + #include <xen/interface/xen.h> 16 17 17 18 #include "trace.h" 18 19 19 20 DEFINE_STATIC_KEY_DEFERRED_FALSE(kvm_xen_enabled, HZ); 20 21 22 + static int kvm_xen_shared_info_init(struct kvm *kvm, gfn_t gfn) 23 + { 24 + int ret; 25 + int idx = srcu_read_lock(&kvm->srcu); 26 + 27 + ret = kvm_gfn_to_hva_cache_init(kvm, &kvm->arch.xen.shinfo_cache, 28 + gfn_to_gpa(gfn), PAGE_SIZE); 29 + if (!ret) { 30 + kvm->arch.xen.shinfo_set = true; 31 + } 32 + 33 + srcu_read_unlock(&kvm->srcu, idx); 34 + return ret; 35 + } 36 + 21 37 int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data) 22 38 { 23 39 int r = -ENOENT; 40 + 41 + mutex_lock(&kvm->lock); 24 42 25 43 mutex_unlock(&kvm->lock); 26 44 27 45 switch (data->type) { 28 46 case KVM_XEN_ATTR_TYPE_LONG_MODE: 29 - if (!IS_ENABLED(CONFIG_64BIT) && data->u.long_mode) 30 - return -EINVAL; 31 - 32 - kvm->arch.xen.long_mode = !!data->u.long_mode; 33 - r = 0; 47 + if (!IS_ENABLED(CONFIG_64BIT) && data->u.long_mode) { 48 + r = -EINVAL; 49 + } else { 50 + kvm->arch.xen.long_mode = !!data->u.long_mode; 51 + r = 0; 52 + } 34 53 break; 54 + 55 + case KVM_XEN_ATTR_TYPE_SHARED_INFO: 56 + r = kvm_xen_shared_info_init(kvm, data->u.shared_info.gfn); 57 + break; 58 + 35 59 default: 36 60 break; 37 61 } ··· 75 51 data->u.long_mode = kvm->arch.xen.long_mode; 76 52 r = 0; 77 53 break; 54 + 55 + case KVM_XEN_ATTR_TYPE_SHARED_INFO: 56 + if (kvm->arch.xen.shinfo_set) { 57 + data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_cache.gpa); 58 + r = 0; 59 + } 60 + break; 61 + 78 62 default: 79 63 break; 80 64 }
+4
include/uapi/linux/kvm.h
··· 1595 1595 __u16 pad[3]; 1596 1596 union { 1597 1597 __u8 long_mode; 1598 + struct { 1599 + __u64 gfn; 1600 + } shared_info; 1598 1601 __u64 pad[8]; 1599 1602 } u; 1600 1603 }; 1601 1604 1602 1605 #define KVM_XEN_ATTR_TYPE_LONG_MODE 0x0 1606 + #define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x1 1603 1607 1604 1608 /* Secure Encrypted Virtualization command */ 1605 1609 enum sev_cmd_id {