diff options
author | Dan Kenigsberg <danken@qumranet.com> | 2007-11-21 10:10:04 -0500 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 10:53:13 -0500 |
commit | 0771671749b59a507b6da4efb931c44d9691e248 (patch) | |
tree | 8d73e81194c7522ad9c0754201c5199b79e2bb98 /include/linux | |
parent | 6d4e4c4fca5be806b888d606894d914847e82d78 (diff) |
KVM: Enhance guest cpuid management
The current cpuid management suffers from several problems, which inhibit
passing through the host feature set to the guest:
- No way to tell which features the host supports
While some features can be supported with no changes to kvm, others
need explicit support. That means kvm needs to vet the feature set
before it is passed to the guest.
- No support for indexed or stateful cpuid entries
Some cpuid entries depend on ecx as well as on eax, or on internal
state in the processor (running cpuid multiple times with the same
input returns different output). The current cpuid machinery only
supports keying on eax.
- No support for save/restore/migrate
The internal state above needs to be exposed to userspace so it can
be saved or migrated.
This patch adds extended cpuid support by means of three new ioctls:
- KVM_GET_SUPPORTED_CPUID: get all cpuid entries the host (and kvm)
supports
- KVM_SET_CPUID2: sets the vcpu's cpuid table
- KVM_GET_CPUID2: gets the vcpu's cpuid table, including hidden state
[avi: fix original KVM_SET_CPUID not removing nx on non-nx hosts as it did
before]
Signed-off-by: Dan Kenigsberg <danken@qumranet.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/kvm.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index fd4f900fcce3..b751552f2e30 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -224,6 +224,7 @@ struct kvm_signal_mask { | |||
224 | #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2 | 224 | #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2 |
225 | #define KVM_CAP_USER_MEMORY 3 | 225 | #define KVM_CAP_USER_MEMORY 3 |
226 | #define KVM_CAP_SET_TSS_ADDR 4 | 226 | #define KVM_CAP_SET_TSS_ADDR 4 |
227 | #define KVM_CAP_EXT_CPUID 5 | ||
227 | 228 | ||
228 | /* | 229 | /* |
229 | * ioctls for VM fds | 230 | * ioctls for VM fds |
@@ -241,6 +242,7 @@ struct kvm_signal_mask { | |||
241 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) | 242 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) |
242 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) | 243 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) |
243 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) | 244 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) |
245 | #define KVM_GET_SUPPORTED_CPUID _IOWR(KVMIO, 0x48, struct kvm_cpuid2) | ||
244 | /* Device model IOC */ | 246 | /* Device model IOC */ |
245 | #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) | 247 | #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) |
246 | #define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) | 248 | #define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) |
@@ -266,5 +268,7 @@ struct kvm_signal_mask { | |||
266 | #define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu) | 268 | #define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu) |
267 | #define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state) | 269 | #define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state) |
268 | #define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state) | 270 | #define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state) |
271 | #define KVM_SET_CPUID2 _IOW(KVMIO, 0x90, struct kvm_cpuid2) | ||
272 | #define KVM_GET_CPUID2 _IOWR(KVMIO, 0x91, struct kvm_cpuid2) | ||
269 | 273 | ||
270 | #endif | 274 | #endif |