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