Revision f8bb0565
b/target-i386/kvm.c | ||
---|---|---|
411 | 411 |
} |
412 | 412 |
} |
413 | 413 |
|
414 |
#define KVM_MAX_CPUID_ENTRIES 100 |
|
414 | 415 |
int kvm_arch_init_vcpu(CPUState *cs) |
415 | 416 |
{ |
416 | 417 |
struct { |
417 | 418 |
struct kvm_cpuid2 cpuid; |
418 |
struct kvm_cpuid_entry2 entries[100];
|
|
419 |
struct kvm_cpuid_entry2 entries[KVM_MAX_CPUID_ENTRIES];
|
|
419 | 420 |
} QEMU_PACKED cpuid_data; |
420 | 421 |
X86CPU *cpu = X86_CPU(cs); |
421 | 422 |
CPUX86State *env = &cpu->env; |
... | ... | |
502 | 503 |
cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused); |
503 | 504 |
|
504 | 505 |
for (i = 0; i <= limit; i++) { |
506 |
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) { |
|
507 |
fprintf(stderr, "unsupported level value: 0x%x\n", limit); |
|
508 |
abort(); |
|
509 |
} |
|
505 | 510 |
c = &cpuid_data.entries[cpuid_i++]; |
506 | 511 |
|
507 | 512 |
switch (i) { |
... | ... | |
516 | 521 |
times = c->eax & 0xff; |
517 | 522 |
|
518 | 523 |
for (j = 1; j < times; ++j) { |
524 |
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) { |
|
525 |
fprintf(stderr, "cpuid_data is full, no space for " |
|
526 |
"cpuid(eax:2):eax & 0xf = 0x%x\n", times); |
|
527 |
abort(); |
|
528 |
} |
|
519 | 529 |
c = &cpuid_data.entries[cpuid_i++]; |
520 | 530 |
c->function = i; |
521 | 531 |
c->flags = KVM_CPUID_FLAG_STATEFUL_FUNC; |
... | ... | |
544 | 554 |
if (i == 0xd && c->eax == 0) { |
545 | 555 |
continue; |
546 | 556 |
} |
557 |
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) { |
|
558 |
fprintf(stderr, "cpuid_data is full, no space for " |
|
559 |
"cpuid(eax:0x%x,ecx:0x%x)\n", i, j); |
|
560 |
abort(); |
|
561 |
} |
|
547 | 562 |
c = &cpuid_data.entries[cpuid_i++]; |
548 | 563 |
} |
549 | 564 |
break; |
... | ... | |
557 | 572 |
cpu_x86_cpuid(env, 0x80000000, 0, &limit, &unused, &unused, &unused); |
558 | 573 |
|
559 | 574 |
for (i = 0x80000000; i <= limit; i++) { |
575 |
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) { |
|
576 |
fprintf(stderr, "unsupported xlevel value: 0x%x\n", limit); |
|
577 |
abort(); |
|
578 |
} |
|
560 | 579 |
c = &cpuid_data.entries[cpuid_i++]; |
561 | 580 |
|
562 | 581 |
c->function = i; |
... | ... | |
569 | 588 |
cpu_x86_cpuid(env, 0xC0000000, 0, &limit, &unused, &unused, &unused); |
570 | 589 |
|
571 | 590 |
for (i = 0xC0000000; i <= limit; i++) { |
591 |
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) { |
|
592 |
fprintf(stderr, "unsupported xlevel2 value: 0x%x\n", limit); |
|
593 |
abort(); |
|
594 |
} |
|
572 | 595 |
c = &cpuid_data.entries[cpuid_i++]; |
573 | 596 |
|
574 | 597 |
c->function = i; |
Also available in: Unified diff