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