#include <linux/kvm_host.h>
#include <trace/events/kvm.h>
+#include <xen/interface/xen.h>
#include "trace.h"
+static int kvm_xen_shared_info_init(struct kvm *kvm, gfn_t gfn)
+{
+ int ret;
+
+ ret = kvm_gfn_to_hva_cache_init(kvm, &kvm->arch.xen.shinfo_cache,
+ gfn_to_gpa(gfn), PAGE_SIZE);
+ if (ret)
+ return ret;
+
+ kvm->arch.xen.shinfo_set = true;
+ return 0;
+}
+
int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
{
int r = -ENOENT;
kvm->arch.xen.long_mode = !!data->u.long_mode;
r = 0;
break;
+
+ case KVM_XEN_ATTR_TYPE_SHARED_INFO:
+ r = kvm_xen_shared_info_init(kvm, data->u.shared_info.gfn);
+ break;
+
default:
break;
}
data->u.long_mode = kvm->arch.xen.long_mode;
r = 0;
break;
+
+ case KVM_XEN_ATTR_TYPE_SHARED_INFO:
+ if (kvm->arch.xen.shinfo_set) {
+ data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_cache.gpa);
+ r = 0;
+ }
+ break;
+
default:
break;
}
int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
int kvm_xen_hvm_config(struct kvm_vcpu *vcpu, u64 data);
-void kvm_xen_destroy_vm(struct kvm *kvm);
static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm)
{
union {
__u8 long_mode;
+ struct {
+ __u64 gfn;
+ } shared_info;
__u64 pad[4];
} u;
};
#define KVM_XEN_ATTR_TYPE_LONG_MODE 0x0
+#define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x1
/* Secure Encrypted Virtualization command */
enum sev_cmd_id {