From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: ehabkost@redhat.com, afaerber@suse.de
Subject: [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time
Date: Thu, 27 Dec 2012 15:59:24 +0100 [thread overview]
Message-ID: <1356620376-23501-9-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1356620376-23501-1-git-send-email-imammedo@redhat.com>
kvm_check_features_against_host() should be called when features can't be changed
and when features are convereted to properties it would be possible to change them
until realize time, so correct way is to call kvm_check_features_against_host() in
x86_cpu_realize()
- calling kvm_check_features_against_host() makes sense only when qemu is compiled
--enable-kvm, so move it inside CONFIG_KVM ifdef and compile it and
other kvm specific functions only if CONFIG_KVM is defined to avoid *-user target
build breakage.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
- squash in ifdef-ing kvm specific functions into this patch
---
target-i386/cpu.c | 27 +++++++++++++++------------
1 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 97cce89..d93bf5a 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -862,7 +862,6 @@ static int cpu_x86_fill_model_id(char *str)
}
return 0;
}
-#endif
/* Fill a x86_def_t struct with information about the host CPU, and
* the CPU features supported by the host hardware + host kernel
@@ -871,7 +870,6 @@ static int cpu_x86_fill_model_id(char *str)
*/
static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
{
-#ifdef CONFIG_KVM
KVMState *s = kvm_state;
uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
@@ -930,7 +928,6 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
* unsupported ones later.
*/
x86_cpu_def->svm_features = -1;
-#endif /* CONFIG_KVM */
}
static int unavailable_host_feature(struct model_features_t *f, uint32_t mask)
@@ -954,19 +951,20 @@ static int unavailable_host_feature(struct model_features_t *f, uint32_t mask)
*
* This function may be called only if KVM is enabled.
*/
-static int kvm_check_features_against_host(x86_def_t *guest_def)
+static int kvm_check_features_against_host(X86CPU *cpu)
{
+ CPUX86State *env = &cpu->env;
x86_def_t host_def;
uint32_t mask;
int rv, i;
struct model_features_t ft[] = {
- {&guest_def->features, &host_def.features,
+ {&env->cpuid_features, &host_def.features,
~0, feature_name, 0x00000000},
- {&guest_def->ext_features, &host_def.ext_features,
+ {&env->cpuid_ext_features, &host_def.ext_features,
~CPUID_EXT_HYPERVISOR, ext_feature_name, 0x00000001},
- {&guest_def->ext2_features, &host_def.ext2_features,
+ {&env->cpuid_ext2_features, &host_def.ext2_features,
~PPRO_FEATURES, ext2_feature_name, 0x80000000},
- {&guest_def->ext3_features, &host_def.ext3_features,
+ {&env->cpuid_ext3_features, &host_def.ext3_features,
~CPUID_EXT3_SVM, ext3_feature_name, 0x80000001}};
assert(kvm_enabled());
@@ -981,6 +979,7 @@ static int kvm_check_features_against_host(x86_def_t *guest_def)
}
return rv;
}
+#endif /* CONFIG_KVM */
static void x86_cpuid_version_get_family(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
@@ -1273,7 +1272,9 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *name)
}
}
if (kvm_enabled() && name && strcmp(name, "host") == 0) {
+#ifdef CONFIG_KVM
kvm_cpu_fill_host(x86_cpu_def);
+#endif
} else if (!def) {
return -1;
} else {
@@ -1428,10 +1429,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features)
x86_cpu_def->kvm_features &= ~minus_kvm_features;
x86_cpu_def->svm_features &= ~minus_svm_features;
x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_7_0_ebx_features;
- if (check_cpuid && kvm_enabled()) {
- if (kvm_check_features_against_host(x86_cpu_def) && enforce_cpuid)
- goto error;
- }
return 0;
error:
@@ -2106,6 +2103,12 @@ void x86_cpu_realize(Object *obj, Error **errp)
env->cpuid_svm_features &= TCG_SVM_FEATURES;
} else {
#ifdef CONFIG_KVM
+ if (check_cpuid && kvm_check_features_against_host(cpu)
+ && enforce_cpuid) {
+ error_setg(errp, "Host's CPU doesn't support requested features");
+ return;
+ }
+
filter_features_for_kvm(cpu);
#endif
}
--
1.7.1
next prev parent reply other threads:[~2012-12-27 15:01 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-27 14:59 [Qemu-devel] [PATCH 00/20 v3] x86 CPU cleanup (wave 2) Igor Mammedov
2012-12-27 14:59 ` [Qemu-devel] [PATCH 01/20] target-i386: filter out not TCG features if running without kvm at realize time Igor Mammedov
2012-12-27 18:41 ` Eduardo Habkost
2012-12-27 19:15 ` Igor Mammedov
2012-12-27 19:36 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 02/20] target-i386: sanitize AMD's ext2_features " Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 03/20] target-i386: explicitly set vendor for each built-in cpudef Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 04/20] target-i386: setting default 'vendor' is obsolete, remove it Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 05/20] target-i386: move setting defaults out of cpu_x86_parse_featurestr() Igor Mammedov
2012-12-27 18:43 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 06/20] target-i386: move out CPU features initialization in separate func Igor Mammedov
2012-12-27 18:44 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 07/20] target-i386: cpu_x86_register() consolidate freeing resources Igor Mammedov
2012-12-27 18:45 ` Eduardo Habkost
2012-12-27 14:59 ` Igor Mammedov [this message]
2012-12-27 18:55 ` [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 09/20] target-i386: add x86cpu_vendor_words2str() Igor Mammedov
2012-12-27 18:56 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t Igor Mammedov
2012-12-27 18:57 ` Eduardo Habkost
2012-12-28 17:39 ` Eduardo Habkost
2012-12-28 20:01 ` Igor Mammedov
2012-12-27 14:59 ` [Qemu-devel] [PATCH 11/20] target-i386: remove vendor_override field from CPUX86State Igor Mammedov
2012-12-27 19:00 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 12/20] target-i386: prepare cpu_x86_parse_featurestr() to return a set of key, value property pairs Igor Mammedov
2012-12-27 19:16 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 13/20] target-i386: set custom 'vendor' without intermediate x86_def_t Igor Mammedov
2012-12-27 19:22 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 14/20] target-i386: print depricated warning if xlevel < 0x80000000 Igor Mammedov
2012-12-27 19:09 ` Eduardo Habkost
2012-12-27 19:18 ` Igor Mammedov
2012-12-27 14:59 ` [Qemu-devel] [PATCH 15/20] target-i386: set custom 'xlevel' without intermediate x86_def_t Igor Mammedov
2012-12-27 19:30 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 16/20] target-i386: set custom 'level' " Igor Mammedov
2012-12-27 19:32 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 17/20] target-i386: set custom 'model-id' " Igor Mammedov
2012-12-27 19:34 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 18/20] target-i386: set custom 'stepping' " Igor Mammedov
2012-12-27 19:34 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 19/20] target-i386: set custom 'model' " Igor Mammedov
2012-12-27 19:35 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 20/20] target-i386: set custom 'family' " Igor Mammedov
2012-12-27 19:36 ` Eduardo Habkost
-- strict thread matches above, loose matches on Subject: below --
2012-12-28 20:01 [Qemu-devel] [PATCH 00/20 v4] x86 CPU cleanup (wave 2) Igor Mammedov
2012-12-28 20:01 ` [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1356620376-23501-9-git-send-email-imammedo@redhat.com \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).