On Mon, Jan 12, 2009 at 10:39:31PM +0200, Muli Ben-Yehuda wrote:
> On Mon, Jan 12, 2009 at 10:49:25AM +0000, Amit Shah wrote:
> > +           case 0xd:
> > +                   vcpu->arch.cpuid_entries[i].index = count++;
> 
> Isn't this using count uninitialized?

Oops, that's right.

Here's the refreshed patch.

Thanks,
Amit.

>From 0708401594924e2d8ca7bcc1512624a8a0a6e79d Mon Sep 17 00:00:00 2001
From: Amit Shah <[email protected]>
Date: Mon, 12 Jan 2009 15:59:37 +0530
Subject: [PATCH] KVM: x86: Store multiple cpuid entries for a single function

CPUID functions 4, 0xb and 0xd behave differently for different values of ECX.
Store these values if userspace passes them.

Signed-off-by: Amit Shah <[email protected]>
---
 arch/x86/kvm/x86.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 06b44fb..4d731fd 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1126,7 +1126,7 @@ static int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
                                    struct kvm_cpuid *cpuid,
                                    struct kvm_cpuid_entry __user *entries)
 {
-       int r, i;
+       int r, i, count;
        struct kvm_cpuid_entry *cpuid_entries;
 
        r = -E2BIG;
@@ -1140,14 +1140,27 @@ static int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu 
*vcpu,
        if (copy_from_user(cpuid_entries, entries,
                           cpuid->nent * sizeof(struct kvm_cpuid_entry)))
                goto out_free;
+       count = 0;
        for (i = 0; i < cpuid->nent; i++) {
                vcpu->arch.cpuid_entries[i].function = 
cpuid_entries[i].function;
                vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax;
                vcpu->arch.cpuid_entries[i].ebx = cpuid_entries[i].ebx;
                vcpu->arch.cpuid_entries[i].ecx = cpuid_entries[i].ecx;
                vcpu->arch.cpuid_entries[i].edx = cpuid_entries[i].edx;
-               vcpu->arch.cpuid_entries[i].index = 0;
-               vcpu->arch.cpuid_entries[i].flags = 0;
+               switch (cpuid_entries[i].function) {
+               case 4:
+               case 0xb:
+               case 0xd:
+                       vcpu->arch.cpuid_entries[i].index = count++;
+                       vcpu->arch.cpuid_entries[i].flags =
+                               KVM_CPUID_FLAG_SIGNIFICANT_INDEX;
+                       break;
+               default:
+                       vcpu->arch.cpuid_entries[i].index = 0;
+                       vcpu->arch.cpuid_entries[i].flags = 0;
+               }
+               if (cpuid_entries[i].function != cpuid_entries[i+1].function)
+                       count = 0;
                vcpu->arch.cpuid_entries[i].padding[0] = 0;
                vcpu->arch.cpuid_entries[i].padding[1] = 0;
                vcpu->arch.cpuid_entries[i].padding[2] = 0;
-- 
1.6.0.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to