diff options
author | Ed Swierk <eswierk@aristanetworks.com> | 2009-10-15 18:21:43 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-03 02:32:18 -0500 |
commit | ffde22ac53b6d6b1d7206f1172176a667eead778 (patch) | |
tree | 16ab77d364ba26928136e6d18463845941b6dd2c /include/linux/kvm.h | |
parent | 94c30d9ca6fd00a69e367b91b6e13572c41938c5 (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.h | 16 |
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 | ||
495 | struct 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 | ||
493 | struct kvm_irqfd { | 508 | struct 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 |