diff options
author | Keir Fraser <keir@xen.org> | 2011-01-26 09:04:36 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2011-01-26 09:04:36 +0000 |
commit | 5254df9090db75d2f90ba0167f94e56219f34815 (patch) | |
tree | 50cd88da62676fe822f06b946e2996cf1f9e3fb6 | |
parent | 2b8b5dab10e6fc6aa272cd5c61eb838546745ff7 (diff) | |
download | xen-5254df9090db75d2f90ba0167f94e56219f34815.tar.gz xen-5254df9090db75d2f90ba0167f94e56219f34815.tar.bz2 xen-5254df9090db75d2f90ba0167f94e56219f34815.zip |
x86: blacklist new AMD CPUID bits for PV domains
there are some new CPUID bits (and leaves) which Dom0 and PV domains
should not see to avoid trouble, since we don't emulate the features.
The most prominent one is a topology leaf, which contains information
specific to the physical CPU, not the virtual one. To avoid confusion
(and possibly crashes) due to a confused Dom0 scheduler simply disable
these bits.
Signed-off-by: Andre Przywara <andre.przywara@amd.com>
Signed-off-by: Keir Fraser <keir@xen.org>
xen-unstable changeset: 22815:4785c70c2b6d
xen-unstable date: Wed Jan 26 08:45:40 2011 +0000
-rw-r--r-- | tools/libxc/xc_cpufeature.h | 5 | ||||
-rw-r--r-- | tools/libxc/xc_cpuid_x86.c | 5 | ||||
-rw-r--r-- | xen/arch/x86/traps.c | 5 | ||||
-rw-r--r-- | xen/include/asm-x86/cpufeature.h | 5 |
4 files changed, 20 insertions, 0 deletions
diff --git a/tools/libxc/xc_cpufeature.h b/tools/libxc/xc_cpufeature.h index 397cfbcb15..96ba4a66b5 100644 --- a/tools/libxc/xc_cpufeature.h +++ b/tools/libxc/xc_cpufeature.h @@ -114,5 +114,10 @@ #define X86_FEATURE_SSE5 (6*32+ 11) /* AMD Streaming SIMD Extensions-5 */ #define X86_FEATURE_SKINIT (6*32+ 12) /* SKINIT, STGI/CLGI, DEV */ #define X86_FEATURE_WDT (6*32+ 13) /* Watchdog Timer */ +#define X86_FEATURE_LWP (6*32+15) /* Light Weight Profiling */ +#define X86_FEATURE_FMA4 (6*32+16) /* 4 operands MAC instructions */ +#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */ +#define X86_FEATURE_TBM (6*32+21) /* trailing bit manipulations */ +#define X86_FEATURE_TOPOEXT (6*32+22) /* topology extensions CPUID leafs */ #endif /* __LIBXC_CPUFEATURE_H */ diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index 54174a297d..ebb0ef6118 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -341,11 +341,16 @@ static void xc_cpuid_pv_policy( clear_bit(X86_FEATURE_IBS, regs[2]); clear_bit(X86_FEATURE_SKINIT, regs[2]); clear_bit(X86_FEATURE_WDT, regs[2]); + clear_bit(X86_FEATURE_LWP, regs[2]); + clear_bit(X86_FEATURE_NODEID_MSR, regs[2]); + clear_bit(X86_FEATURE_TOPOEXT, regs[2]); break; case 5: /* MONITOR/MWAIT */ case 0xa: /* Architectural Performance Monitor Features */ case 0x8000000a: /* SVM revision and features */ case 0x8000001b: /* Instruction Based Sampling */ + case 0x8000001c: /* Light Weight Profiling */ + case 0x8000001e: /* Extended topology reporting */ regs[0] = regs[1] = regs[2] = regs[3] = 0; break; } diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index ce5edf564a..53c240c69e 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -813,11 +813,16 @@ static void pv_cpuid(struct cpu_user_regs *regs) __clear_bit(X86_FEATURE_IBS % 32, &c); __clear_bit(X86_FEATURE_SKINIT % 32, &c); __clear_bit(X86_FEATURE_WDT % 32, &c); + __clear_bit(X86_FEATURE_LWP % 32, &c); + __clear_bit(X86_FEATURE_NODEID_MSR % 32, &c); + __clear_bit(X86_FEATURE_TOPOEXT % 32, &c); break; case 5: /* MONITOR/MWAIT */ case 0xa: /* Architectural Performance Monitor Features */ case 0x8000000a: /* SVM revision and features */ case 0x8000001b: /* Instruction Based Sampling */ + case 0x8000001c: /* Light Weight Profiling */ + case 0x8000001e: /* Extended topology reporting */ a = b = c = d = 0; break; default: diff --git a/xen/include/asm-x86/cpufeature.h b/xen/include/asm-x86/cpufeature.h index 6e7b398341..cfe05593dc 100644 --- a/xen/include/asm-x86/cpufeature.h +++ b/xen/include/asm-x86/cpufeature.h @@ -129,6 +129,11 @@ #define X86_FEATURE_SSE5 (6*32+ 11) /* AMD Streaming SIMD Extensions-5 */ #define X86_FEATURE_SKINIT (6*32+ 12) /* SKINIT, STGI/CLGI, DEV */ #define X86_FEATURE_WDT (6*32+ 13) /* Watchdog Timer */ +#define X86_FEATURE_LWP (6*32+15) /* Light Weight Profiling */ +#define X86_FEATURE_FMA4 (6*32+16) /* 4 operands MAC instructions */ +#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */ +#define X86_FEATURE_TBM (6*32+21) /* trailing bit manipulations */ +#define X86_FEATURE_TOPOEXT (6*32+22) /* topology extensions CPUID leafs */ #define cpu_has(c, bit) test_bit(bit, (c)->x86_capability) #define boot_cpu_has(bit) test_bit(bit, boot_cpu_data.x86_capability) |