Revision 486bd5a2

b/target-i386/kvm.c
36 36
int kvm_arch_init_vcpu(CPUState *env)
37 37
{
38 38
    struct {
39
        struct kvm_cpuid cpuid;
40
        struct kvm_cpuid_entry entries[100];
39
        struct kvm_cpuid2 cpuid;
40
        struct kvm_cpuid_entry2 entries[100];
41 41
    } __attribute__((packed)) cpuid_data;
42
    uint32_t limit, i, cpuid_i;
42
    uint32_t limit, i, j, cpuid_i;
43 43
    uint32_t eax, ebx, ecx, edx;
44 44

  
45 45
    cpuid_i = 0;
......
48 48
    limit = eax;
49 49

  
50 50
    for (i = 0; i <= limit; i++) {
51
        struct kvm_cpuid_entry *c = &cpuid_data.entries[cpuid_i++];
52

  
53
        cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
54
        c->function = i;
55
        c->eax = eax;
56
        c->ebx = ebx;
57
        c->ecx = ecx;
58
        c->edx = edx;
51
        struct kvm_cpuid_entry2 *c = &cpuid_data.entries[cpuid_i++];
52

  
53
        switch (i) {
54
        case 4:
55
        case 0xb:
56
        case 0xd:
57
            for (j = 0; ; j++) {
58
                cpu_x86_cpuid(env, i, j, &eax, &ebx, &ecx, &edx);
59
                c->function = i;
60
                c->flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
61
                c->index = j;
62
                c->eax = eax;
63
                c->ebx = ebx;
64
                c->ecx = ecx;
65
                c->edx = edx;
66
                c = &cpuid_data.entries[++cpuid_i];
67

  
68
                if (i == 4 && eax == 0)
69
                    break;
70
                if (i == 0xb && !(ecx & 0xff00))
71
                    break;
72
                if (i == 0xd && eax == 0)
73
                    break;
74
            }
75
            break;
76
        default:
77
            cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
78
            c->function = i;
79
            c->eax = eax;
80
            c->ebx = ebx;
81
            c->ecx = ecx;
82
            c->edx = edx;
83
            break;
84
        }
59 85
    }
60

  
61 86
    cpu_x86_cpuid(env, 0x80000000, 0, &eax, &ebx, &ecx, &edx);
62 87
    limit = eax;
63 88

  
64 89
    for (i = 0x80000000; i <= limit; i++) {
65
        struct kvm_cpuid_entry *c = &cpuid_data.entries[cpuid_i++];
90
        struct kvm_cpuid_entry2 *c = &cpuid_data.entries[cpuid_i++];
66 91

  
67 92
        cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx);
68 93
        c->function = i;
......
74 99

  
75 100
    cpuid_data.cpuid.nent = cpuid_i;
76 101

  
77
    return kvm_vcpu_ioctl(env, KVM_SET_CPUID, &cpuid_data);
102
    return kvm_vcpu_ioctl(env, KVM_SET_CPUID2, &cpuid_data);
78 103
}
79 104

  
80 105
static int kvm_has_msr_star(CPUState *env)

Also available in: Unified diff