aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kvm.h
diff options
context:
space:
mode:
authorEd Swierk <eswierk@aristanetworks.com>2009-10-15 18:21:43 -0400
committerAvi Kivity <avi@redhat.com>2009-12-03 02:32:18 -0500
commitffde22ac53b6d6b1d7206f1172176a667eead778 (patch)
tree16ab77d364ba26928136e6d18463845941b6dd2c /include/linux/kvm.h
parent94c30d9ca6fd00a69e367b91b6e13572c41938c5 (diff)
KVM: Xen PV-on-HVM guest support
Support for Xen PV-on-HVM guests can be implemented almost entirely in userspace, except for handling one annoying MSR that maps a Xen hypercall blob into guest address space. A generic mechanism to delegate MSR writes to userspace seems overkill and risks encouraging similar MSR abuse in the future. Thus this patch adds special support for the Xen HVM MSR. I implemented a new ioctl, KVM_XEN_HVM_CONFIG, that lets userspace tell KVM which MSR the guest will write to, as well as the starting address and size of the hypercall blobs (one each for 32-bit and 64-bit) that userspace has loaded from files. When the guest writes to the MSR, KVM copies one page of the blob from userspace to the guest. I've tested this patch with a hacked-up version of Gerd's userspace code, booting a number of guests (CentOS 5.3 i386 and x86_64, and FreeBSD 8.0-RC1 amd64) and exercising PV network and block devices. [jan: fix i386 build warning] [avi: future proof abi with a flags field] Signed-off-by: Ed Swierk <eswierk@aristanetworks.com> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'include/linux/kvm.h')
-rw-r--r--include/linux/kvm.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index f8f8900fc5ec..b694c1d2f918 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -436,6 +436,9 @@ struct kvm_ioeventfd {
436#endif 436#endif
437#define KVM_CAP_IOEVENTFD 36 437#define KVM_CAP_IOEVENTFD 36
438#define KVM_CAP_SET_IDENTITY_MAP_ADDR 37 438#define KVM_CAP_SET_IDENTITY_MAP_ADDR 37
439#ifdef __KVM_HAVE_XEN_HVM
440#define KVM_CAP_XEN_HVM 38
441#endif
439 442
440#ifdef KVM_CAP_IRQ_ROUTING 443#ifdef KVM_CAP_IRQ_ROUTING
441 444
@@ -488,6 +491,18 @@ struct kvm_x86_mce {
488}; 491};
489#endif 492#endif
490 493
494#ifdef KVM_CAP_XEN_HVM
495struct kvm_xen_hvm_config {
496 __u32 flags;
497 __u32 msr;
498 __u64 blob_addr_32;
499 __u64 blob_addr_64;
500 __u8 blob_size_32;
501 __u8 blob_size_64;
502 __u8 pad2[30];
503};
504#endif
505
491#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0) 506#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
492 507
493struct kvm_irqfd { 508struct kvm_irqfd {
@@ -546,6 +561,7 @@ struct kvm_irqfd {
546#define KVM_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config) 561#define KVM_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config)
547#define KVM_SET_BOOT_CPU_ID _IO(KVMIO, 0x78) 562#define KVM_SET_BOOT_CPU_ID _IO(KVMIO, 0x78)
548#define KVM_IOEVENTFD _IOW(KVMIO, 0x79, struct kvm_ioeventfd) 563#define KVM_IOEVENTFD _IOW(KVMIO, 0x79, struct kvm_ioeventfd)
564#define KVM_XEN_HVM_CONFIG _IOW(KVMIO, 0x7a, struct kvm_xen_hvm_config)
549 565
550/* 566/*
551 * ioctls for vcpu fds 567 * ioctls for vcpu fds