From: Marcelo Tosatti <mtosatti@redhat.com>
To: kvm@vger.kernel.org, qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Eduardo Habkost <ehabkost@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>
Subject: [patch 1/2] target-i386: support "invariant tsc" flag
Date: Tue, 22 Apr 2014 16:10:43 -0300 [thread overview]
Message-ID: <20140422191200.328459410@amt.cnet> (raw)
In-Reply-To: 20140422191042.005048158@amt.cnet
[-- Attachment #1: 01_qemu-cpuid-invariant.patch --]
[-- Type: TEXT/PLAIN, Size: 4214 bytes --]
Expose "Invariant TSC" flag, if KVM is enabled. From Intel documentation:
17.13.1 Invariant TSC The time stamp counter in newer processors may
support an enhancement, referred to as invariant TSC. Processorâs
support for invariant TSC is indicated by CPUID.80000007H:EDX[8].
The invariant TSC will run at a constant rate in all ACPI P-, C-.
and T-states. This is the architectural behavior moving forward. On
processors with invariant TSC support, the OS may use the TSC for wall
clock timer services (instead of ACPI or HPET timers). TSC reads are
much more efficient and do not incur the overhead associated with a ring
transition or access to a platform resource.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Index: qemu-invariant-tsc/target-i386/cpu.c
===================================================================
--- qemu-invariant-tsc.orig/target-i386/cpu.c
+++ qemu-invariant-tsc/target-i386/cpu.c
@@ -262,6 +262,17 @@ static const char *cpuid_7_0_ebx_feature
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
+static const char *cpuid_apm_edx_feature_name[] = {
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ "invtsc", NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+};
+
typedef struct FeatureWordInfo {
const char **feat_names;
uint32_t cpuid_eax; /* Input EAX for CPUID */
@@ -305,6 +316,11 @@ static FeatureWordInfo feature_word_info
.cpuid_needs_ecx = true, .cpuid_ecx = 0,
.cpuid_reg = R_EBX,
},
+ [FEAT_8000_0007_EDX] = {
+ .feat_names = cpuid_apm_edx_feature_name,
+ .cpuid_eax = 0x80000007,
+ .cpuid_reg = R_EDX,
+ },
};
typedef struct X86RegisterInfo32 {
@@ -1740,6 +1756,7 @@ static void x86_cpu_parse_featurestr(CPU
env->features[FEAT_1_ECX] |= plus_features[FEAT_1_ECX];
env->features[FEAT_8000_0001_EDX] |= plus_features[FEAT_8000_0001_EDX];
env->features[FEAT_8000_0001_ECX] |= plus_features[FEAT_8000_0001_ECX];
+ env->features[FEAT_8000_0007_EDX] |= plus_features[FEAT_8000_0007_EDX];
env->features[FEAT_C000_0001_EDX] |= plus_features[FEAT_C000_0001_EDX];
env->features[FEAT_KVM] |= plus_features[FEAT_KVM];
env->features[FEAT_SVM] |= plus_features[FEAT_SVM];
@@ -1748,6 +1765,7 @@ static void x86_cpu_parse_featurestr(CPU
env->features[FEAT_1_ECX] &= ~minus_features[FEAT_1_ECX];
env->features[FEAT_8000_0001_EDX] &= ~minus_features[FEAT_8000_0001_EDX];
env->features[FEAT_8000_0001_ECX] &= ~minus_features[FEAT_8000_0001_ECX];
+ env->features[FEAT_8000_0007_EDX] &= ~minus_features[FEAT_8000_0007_EDX];
env->features[FEAT_C000_0001_EDX] &= ~minus_features[FEAT_C000_0001_EDX];
env->features[FEAT_KVM] &= ~minus_features[FEAT_KVM];
env->features[FEAT_SVM] &= ~minus_features[FEAT_SVM];
@@ -2333,6 +2351,17 @@ void cpu_x86_cpuid(CPUX86State *env, uin
(AMD_ENC_ASSOC(L3_ASSOCIATIVITY) << 12) | \
(L3_LINES_PER_TAG << 8) | (L3_LINE_SIZE);
break;
+ case 0x80000007:
+ *eax = 0;
+ *ebx = 0;
+ *ecx = 0;
+
+ if (kvm_enabled()) {
+ *edx = env->features[FEAT_8000_0007_EDX];
+ } else {
+ *edx = 0;
+ }
+ break;
case 0x80000008:
/* virtual & phys address size in low 2 bytes. */
/* XXX: This value must match the one used in the MMU code. */
Index: qemu-invariant-tsc/target-i386/cpu.h
===================================================================
--- qemu-invariant-tsc.orig/target-i386/cpu.h
+++ qemu-invariant-tsc/target-i386/cpu.h
@@ -398,6 +398,7 @@ typedef enum FeatureWord {
FEAT_7_0_EBX, /* CPUID[EAX=7,ECX=0].EBX */
FEAT_8000_0001_EDX, /* CPUID[8000_0001].EDX */
FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */
+ FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */
FEAT_C000_0001_EDX, /* CPUID[C000_0001].EDX */
FEAT_KVM, /* CPUID[4000_0001].EAX (KVM_CPUID_FEATURES) */
FEAT_SVM, /* CPUID[8000_000A].EDX */
next prev parent reply other threads:[~2014-04-22 19:13 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-22 19:10 [patch 0/2] expose invariant tsc flag for kvm guests Marcelo Tosatti
2014-04-22 19:10 ` Marcelo Tosatti [this message]
2014-04-23 0:26 ` [patch 1/2] target-i386: support "invariant tsc" flag Paolo Bonzini
2014-04-23 1:11 ` Eduardo Habkost
2014-04-22 19:10 ` [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed Marcelo Tosatti
2014-04-22 19:28 ` Marcelo Tosatti
2014-04-22 20:38 ` Eduardo Habkost
2014-04-22 21:27 ` Marcelo Tosatti
2014-04-23 1:14 ` Eduardo Habkost
2014-04-24 20:42 ` Paolo Bonzini
2014-04-24 20:57 ` Eduardo Habkost
2014-04-24 22:57 ` Paolo Bonzini
2014-04-24 23:18 ` Eduardo Habkost
2014-04-25 21:08 ` Paolo Bonzini
2014-04-28 15:46 ` Eduardo Habkost
2014-04-28 19:06 ` Paolo Bonzini
2014-04-28 19:23 ` Eduardo Habkost
2014-04-29 6:22 ` Paolo Bonzini
2014-04-29 14:29 ` Eduardo Habkost
2014-04-23 18:20 ` [patch 0/2] expose invariant tsc flag for kvm guests (v2) Marcelo Tosatti
2014-04-23 18:20 ` [patch 1/2] target-i386: support "invariant tsc" flag Marcelo Tosatti
2014-04-23 19:04 ` Eduardo Habkost
2014-04-23 18:20 ` [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed Marcelo Tosatti
2014-04-23 19:09 ` Eduardo Habkost
2014-04-23 21:04 ` target-i386: block migration and savevm if invariant tsc is exposed (v3) Marcelo Tosatti
2014-04-24 19:21 ` Eduardo Habkost
2014-04-24 21:32 ` Marcelo Tosatti
2014-04-25 20:38 ` Eduardo Habkost
2014-04-25 22:47 ` [PATCH] savevm: check vmsd for migratability status Marcelo Tosatti
2014-04-28 20:36 ` Eduardo Habkost
2014-04-30 0:39 ` [PATCH] savevm: check vmsd for migratability status (v2) Marcelo Tosatti
2014-04-30 15:47 ` [Qemu-devel] " Eduardo Habkost
2014-04-25 22:47 ` target-i386: block migration and savevm if invariant tsc is exposed (v3) Marcelo Tosatti
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=20140422191200.328459410@amt.cnet \
--to=mtosatti@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@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