Skip to content

Commit

Permalink
Fix x86 feature modifications for features that set multiple bits
Browse files Browse the repository at this point in the history
QEMU allows adding or removing cpu features by using the syntax '-cpu +feature'
or '-cpu -feature'.  Some cpuid features cause more than one bit to be set or
cleared; but QEMU stops after just one bit has been modified, causing the
feature bits to be inconsistent.

Fix by allowing all feature bits corresponding to a given name to be set.

Signed-off-by: Avi Kivity <[email protected]>
Signed-off-by: Anthony Liguori <[email protected]>
  • Loading branch information
avikivity authored and Anthony Liguori committed May 8, 2009
1 parent c6fa82c commit 02b049d
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions target-i386/helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,28 +66,31 @@ static void add_flagname_to_bitmaps(char *flagname, uint32_t *features,
uint32_t *ext3_features)
{
int i;
int found = 0;

for ( i = 0 ; i < 32 ; i++ )
if (feature_name[i] && !strcmp (flagname, feature_name[i])) {
*features |= 1 << i;
return;
found = 1;
}
for ( i = 0 ; i < 32 ; i++ )
if (ext_feature_name[i] && !strcmp (flagname, ext_feature_name[i])) {
*ext_features |= 1 << i;
return;
found = 1;
}
for ( i = 0 ; i < 32 ; i++ )
if (ext2_feature_name[i] && !strcmp (flagname, ext2_feature_name[i])) {
*ext2_features |= 1 << i;
return;
found = 1;
}
for ( i = 0 ; i < 32 ; i++ )
if (ext3_feature_name[i] && !strcmp (flagname, ext3_feature_name[i])) {
*ext3_features |= 1 << i;
return;
found = 1;
}
fprintf(stderr, "CPU feature %s not found\n", flagname);
if (!found) {
fprintf(stderr, "CPU feature %s not found\n", flagname);
}
}

typedef struct x86_def_t {
Expand Down

0 comments on commit 02b049d

Please sign in to comment.