Glauber Costa 230a700
From cf6c4edfab98f587405ec61cd727ad70eeb9984e Mon Sep 17 00:00:00 2001
Glauber Costa 230a700
From: Avi Kivity <avi@redhat.com>
Glauber Costa 230a700
Date: Sun, 3 May 2009 17:04:03 +0300
Glauber Costa 230a700
Subject: [PATCH STABLE 2/3] Fix x86 feature modifications for features that set multiple bits
Glauber Costa 230a700
Glauber Costa 230a700
QEMU allows adding or removing cpu features by using the syntax '-cpu +feature'
Glauber Costa 230a700
or '-cpu -feature'.  Some cpuid features cause more than one bit to be set or
Glauber Costa 230a700
cleared; but QEMU stops after just one bit has been modified, causing the
Glauber Costa 230a700
feature bits to be inconsistent.
Glauber Costa 230a700
Glauber Costa 230a700
Fix by allowing all feature bits corresponding to a given name to be set.
Glauber Costa 230a700
Glauber Costa 230a700
Signed-off-by: Avi Kivity <avi@redhat.com>
Glauber Costa 230a700
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Glauber Costa 230a700
Signed-off-by: Glauber Costa <glommer@redhat.com>
Glauber Costa 230a700
---
Glauber Costa 230a700
 target-i386/helper.c |   13 ++++++++-----
Glauber Costa 230a700
 1 files changed, 8 insertions(+), 5 deletions(-)
Glauber Costa 230a700
Glauber Costa 230a700
Index: qemu-kvm-0.10.4/target-i386/helper.c
Glauber Costa 230a700
===================================================================
Glauber Costa 230a700
--- qemu-kvm-0.10.4.orig/target-i386/helper.c
Glauber Costa 230a700
+++ qemu-kvm-0.10.4/target-i386/helper.c
Glauber Costa 230a700
@@ -68,28 +68,31 @@ static void add_flagname_to_bitmaps(char
Glauber Costa 230a700
                                     uint32_t *ext3_features)
Glauber Costa 230a700
 {
Glauber Costa 230a700
     int i;
Glauber Costa 230a700
+    int found = 0;
Glauber Costa 230a700
 
Glauber Costa 230a700
     for ( i = 0 ; i < 32 ; i++ ) 
Glauber Costa 230a700
         if (feature_name[i] && !strcmp (flagname, feature_name[i])) {
Glauber Costa 230a700
             *features |= 1 << i;
Glauber Costa 230a700
-            return;
Glauber Costa 230a700
+            found = 1;
Glauber Costa 230a700
         }
Glauber Costa 230a700
     for ( i = 0 ; i < 32 ; i++ ) 
Glauber Costa 230a700
         if (ext_feature_name[i] && !strcmp (flagname, ext_feature_name[i])) {
Glauber Costa 230a700
             *ext_features |= 1 << i;
Glauber Costa 230a700
-            return;
Glauber Costa 230a700
+            found = 1;
Glauber Costa 230a700
         }
Glauber Costa 230a700
     for ( i = 0 ; i < 32 ; i++ ) 
Glauber Costa 230a700
         if (ext2_feature_name[i] && !strcmp (flagname, ext2_feature_name[i])) {
Glauber Costa 230a700
             *ext2_features |= 1 << i;
Glauber Costa 230a700
-            return;
Glauber Costa 230a700
+            found = 1;
Glauber Costa 230a700
         }
Glauber Costa 230a700
     for ( i = 0 ; i < 32 ; i++ ) 
Glauber Costa 230a700
         if (ext3_feature_name[i] && !strcmp (flagname, ext3_feature_name[i])) {
Glauber Costa 230a700
             *ext3_features |= 1 << i;
Glauber Costa 230a700
-            return;
Glauber Costa 230a700
+            found = 1;
Glauber Costa 230a700
         }
Glauber Costa 230a700
-    fprintf(stderr, "CPU feature %s not found\n", flagname);
Glauber Costa 230a700
+    if (!found) {
Glauber Costa 230a700
+        fprintf(stderr, "CPU feature %s not found\n", flagname);
Glauber Costa 230a700
+    }
Glauber Costa 230a700
 }
Glauber Costa 230a700
 
Glauber Costa 230a700
 extern const char *cpu_vendor_string;