Revision bb0300dc target-i386/helper.c

b/target-i386/helper.c
58 58
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
59 59
};
60 60

  
61
static const char *kvm_feature_name[] = {
62
    "kvmclock", "kvm_nopiodelay", "kvm_mmu", NULL, NULL, NULL, NULL, NULL,
63
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
64
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
65
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
66
};
67

  
61 68
static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features,
62 69
                                    uint32_t *ext_features,
63 70
                                    uint32_t *ext2_features,
64
                                    uint32_t *ext3_features)
71
                                    uint32_t *ext3_features,
72
                                    uint32_t *kvm_features)
65 73
{
66 74
    int i;
67 75
    int found = 0;
......
86 94
            *ext3_features |= 1 << i;
87 95
            found = 1;
88 96
        }
97
    for ( i = 0 ; i < 32 ; i++ )
98
        if (kvm_feature_name[i] && !strcmp (flagname, kvm_feature_name[i])) {
99
            *kvm_features |= 1 << i;
100
            found = 1;
101
        }
102

  
89 103
    if (!found) {
90 104
        fprintf(stderr, "CPU feature %s not found\n", flagname);
91 105
    }
......
98 112
    int family;
99 113
    int model;
100 114
    int stepping;
101
    uint32_t features, ext_features, ext2_features, ext3_features;
115
    uint32_t features, ext_features, ext2_features, ext3_features, kvm_features;
102 116
    uint32_t xlevel;
103 117
    char model_id[48];
104 118
    int vendor_override;
......
375 389

  
376 390
    char *s = strdup(cpu_model);
377 391
    char *featurestr, *name = strtok(s, ",");
378
    uint32_t plus_features = 0, plus_ext_features = 0, plus_ext2_features = 0, plus_ext3_features = 0;
379
    uint32_t minus_features = 0, minus_ext_features = 0, minus_ext2_features = 0, minus_ext3_features = 0;
392
    uint32_t plus_features = 0, plus_ext_features = 0, plus_ext2_features = 0, plus_ext3_features = 0, plus_kvm_features = 0;
393
    uint32_t minus_features = 0, minus_ext_features = 0, minus_ext2_features = 0, minus_ext3_features = 0, minus_kvm_features = 0;
380 394
    uint32_t numvalue;
381 395

  
382 396
    def = NULL;
......
394 408
        memcpy(x86_cpu_def, def, sizeof(*def));
395 409
    }
396 410

  
411
    plus_kvm_features = ~0; /* not supported bits will be filtered out later */
412

  
397 413
    add_flagname_to_bitmaps("hypervisor", &plus_features,
398
        &plus_ext_features, &plus_ext2_features, &plus_ext3_features);
414
        &plus_ext_features, &plus_ext2_features, &plus_ext3_features,
415
        &plus_kvm_features);
399 416

  
400 417
    featurestr = strtok(NULL, ",");
401 418

  
402 419
    while (featurestr) {
403 420
        char *val;
404 421
        if (featurestr[0] == '+') {
405
            add_flagname_to_bitmaps(featurestr + 1, &plus_features, &plus_ext_features, &plus_ext2_features, &plus_ext3_features);
422
            add_flagname_to_bitmaps(featurestr + 1, &plus_features, &plus_ext_features, &plus_ext2_features, &plus_ext3_features, &plus_kvm_features);
406 423
        } else if (featurestr[0] == '-') {
407
            add_flagname_to_bitmaps(featurestr + 1, &minus_features, &minus_ext_features, &minus_ext2_features, &minus_ext3_features);
424
            add_flagname_to_bitmaps(featurestr + 1, &minus_features, &minus_ext_features, &minus_ext2_features, &minus_ext3_features, &minus_kvm_features);
408 425
        } else if ((val = strchr(featurestr, '='))) {
409 426
            *val = 0; val++;
410 427
            if (!strcmp(featurestr, "family")) {
......
481 498
    x86_cpu_def->ext_features |= plus_ext_features;
482 499
    x86_cpu_def->ext2_features |= plus_ext2_features;
483 500
    x86_cpu_def->ext3_features |= plus_ext3_features;
501
    x86_cpu_def->kvm_features |= plus_kvm_features;
484 502
    x86_cpu_def->features &= ~minus_features;
485 503
    x86_cpu_def->ext_features &= ~minus_ext_features;
486 504
    x86_cpu_def->ext2_features &= ~minus_ext2_features;
487 505
    x86_cpu_def->ext3_features &= ~minus_ext3_features;
506
    x86_cpu_def->kvm_features &= ~minus_kvm_features;
488 507
    free(s);
489 508
    return 0;
490 509

  
......
529 548
    env->cpuid_ext_features = def->ext_features;
530 549
    env->cpuid_ext2_features = def->ext2_features;
531 550
    env->cpuid_xlevel = def->xlevel;
532
    env->cpuid_ext3_features = def->ext3_features;
551
    env->cpuid_kvm_features = def->kvm_features;
533 552
    {
534 553
        const char *model_id = def->model_id;
535 554
        int c, len, i;

Also available in: Unified diff