kvm: Emulate MOVBE
This basically came from the need to be able to boot 32-bit Atom SMP guests on an AMD host, i.e. a host which doesn't support MOVBE. As a matter of fact, qemu has since recently received MOVBE support but we cannot share that with kvm emulation and thus we have to do this in the host. We're waay faster in kvm anyway. :-) So, we piggyback on the #UD path and emulate the MOVBE functionality. With it, an 8-core SMP guest boots in under 6 seconds. Also, requesting MOVBE emulation needs to happen explicitly to work, i.e. qemu -cpu n270,+movbe... Just FYI, a fairly straight-forward boot of a MOVBE-enabled 3.9-rc6+ kernel in kvm executes MOVBE ~60K times. Signed-off-by: Andre Przywara <andre@andrep.de> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:

committed by
Paolo Bonzini

parent
0bc5eedb82
commit
84cffe499b
@@ -222,6 +222,22 @@ static bool supported_xcr0_bit(unsigned bit)
|
||||
static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry,
|
||||
u32 func, u32 index, int *nent, int maxnent)
|
||||
{
|
||||
switch (func) {
|
||||
case 0:
|
||||
entry->eax = 1; /* only one leaf currently */
|
||||
++*nent;
|
||||
break;
|
||||
case 1:
|
||||
entry->ecx = F(MOVBE);
|
||||
++*nent;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
entry->function = func;
|
||||
entry->index = index;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -593,7 +609,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid,
|
||||
return -EINVAL;
|
||||
|
||||
r = -ENOMEM;
|
||||
cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent);
|
||||
cpuid_entries = vzalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent);
|
||||
if (!cpuid_entries)
|
||||
goto out;
|
||||
|
||||
|
Reference in New Issue
Block a user