[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch 1/2] target-i386: support "invariant tsc" flag
From: |
Marcelo Tosatti |
Subject: |
[Qemu-devel] [patch 1/2] target-i386: support "invariant tsc" flag |
Date: |
Wed, 23 Apr 2014 15:20:03 -0300 |
User-agent: |
quilt/0.60-1 |
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 <address@hidden>
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 {
@@ -580,6 +596,7 @@ struct X86CPUDefinition {
CPUID_7_0_EBX_FSGSBASE, CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
CPUID_7_0_EBX_ERMS, CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
CPUID_7_0_EBX_RDSEED */
+#define TCG_APM_FEATURES 0
static X86CPUDefinition builtin_x86_defs[] = {
{
@@ -1740,6 +1757,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 +1766,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 +2352,12 @@ 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;
+ *edx = env->features[FEAT_8000_0007_EDX];
+ break;
case 0x80000008:
/* virtual & phys address size in low 2 bytes. */
/* XXX: This value must match the one used in the MMU code. */
@@ -2598,6 +2623,7 @@ static void x86_cpu_realizefn(DeviceStat
);
env->features[FEAT_8000_0001_ECX] &= TCG_EXT3_FEATURES;
env->features[FEAT_SVM] &= TCG_SVM_FEATURES;
+ env->features[FEAT_8000_0007_EDX] &= TCG_APM_FEATURES;
} else {
KVMState *s = kvm_state;
if ((cpu->check_cpuid || cpu->enforce_cpuid)
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 */
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, (continued)
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Paolo Bonzini, 2014/04/24
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Eduardo Habkost, 2014/04/24
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Paolo Bonzini, 2014/04/25
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Eduardo Habkost, 2014/04/28
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Paolo Bonzini, 2014/04/28
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Eduardo Habkost, 2014/04/28
[Qemu-devel] [patch 1/2] target-i386: support "invariant tsc" flag, Marcelo Tosatti, 2014/04/22
[Qemu-devel] [patch 0/2] expose invariant tsc flag for kvm guests (v2), Marcelo Tosatti, 2014/04/23
- [Qemu-devel] [patch 1/2] target-i386: support "invariant tsc" flag,
Marcelo Tosatti <=
- [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Marcelo Tosatti, 2014/04/23
- Re: [Qemu-devel] [patch 2/2] target-i386: block migration and savevm if invariant tsc is exposed, Eduardo Habkost, 2014/04/23
- [Qemu-devel] target-i386: block migration and savevm if invariant tsc is exposed (v3), Marcelo Tosatti, 2014/04/23
- Re: [Qemu-devel] target-i386: block migration and savevm if invariant tsc is exposed (v3), Eduardo Habkost, 2014/04/24
- Re: [Qemu-devel] target-i386: block migration and savevm if invariant tsc is exposed (v3), Marcelo Tosatti, 2014/04/25
- Re: [Qemu-devel] target-i386: block migration and savevm if invariant tsc is exposed (v3), Eduardo Habkost, 2014/04/25
- Re: [Qemu-devel] target-i386: block migration and savevm if invariant tsc is exposed (v3), Marcelo Tosatti, 2014/04/25
- [Qemu-devel] [PATCH] savevm: check vmsd for migratability status, Marcelo Tosatti, 2014/04/25
- Re: [Qemu-devel] [PATCH] savevm: check vmsd for migratability status, Eduardo Habkost, 2014/04/28