diff options
author | Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> | 2006-06-26 07:59:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:48:22 -0400 |
commit | 0080e667550db5ae8c9318181500c413b99ff164 (patch) | |
tree | 3d6d162f0017aaa7c6049e785bbcdfc18dbc23ae /arch/x86_64/kernel/setup.c | |
parent | e77deacb7b078156fcadf27b838a4ce1a65eda04 (diff) |
[PATCH] x86_64: i386/x86-64 Add nmi watchdog support for new Intel CPUs
Intel now has support for Architectural Performance Monitoring Counters
( Refer to IA-32 Intel Architecture Software Developer's Manual
http://www.intel.com/design/pentium4/manuals/253669.htm ). This
feature is present starting from Intel Core Duo and Intel Core Solo processors.
What this means is, the performance monitoring counters and some performance
monitoring events are now defined in an architectural way (using cpuid).
And there will be no need to check for family/model etc for these architectural
events.
Below is the patch to use this performance counters in nmi watchdog driver.
Patch handles both i386 and x86-64 kernels.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64/kernel/setup.c')
-rw-r--r-- | arch/x86_64/kernel/setup.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 2a5fce0fd1c4..594642a6c037 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
@@ -988,6 +988,13 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) | |||
988 | unsigned n; | 988 | unsigned n; |
989 | 989 | ||
990 | init_intel_cacheinfo(c); | 990 | init_intel_cacheinfo(c); |
991 | if (c->cpuid_level > 9 ) { | ||
992 | unsigned eax = cpuid_eax(10); | ||
993 | /* Check for version and the number of counters */ | ||
994 | if ((eax & 0xff) && (((eax>>8) & 0xff) > 1)) | ||
995 | set_bit(X86_FEATURE_ARCH_PERFMON, &c->x86_capability); | ||
996 | } | ||
997 | |||
991 | n = c->extended_cpuid_level; | 998 | n = c->extended_cpuid_level; |
992 | if (n >= 0x80000008) { | 999 | if (n >= 0x80000008) { |
993 | unsigned eax = cpuid_eax(0x80000008); | 1000 | unsigned eax = cpuid_eax(0x80000008); |