diff options
author | Borislav Petkov <borislav.petkov@amd.com> | 2009-12-11 12:14:40 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-12-11 13:59:21 -0500 |
commit | 505422517d3f126bb939439e9d15dece94e11d2c (patch) | |
tree | a2d58c0b3cdf2b1c6b66eee6d78a283224ae1ac3 /arch/x86/include | |
parent | 5c6baba84e1ac6a79b266b40e17e692aab6604a1 (diff) |
x86, msr: Add support for non-contiguous cpumasks
The current rd/wrmsr_on_cpus helpers assume that the supplied
cpumasks are contiguous. However, there are machines out there
like some K8 multinode Opterons which have a non-contiguous core
enumeration on each node (e.g. cores 0,2 on node 0 instead of 0,1), see
http://www.gossamer-threads.com/lists/linux/kernel/1160268.
This patch fixes out-of-bounds writes (see URL above) by adding per-CPU
msr structs which are used on the respective cores.
Additionally, two helpers, msrs_{alloc,free}, are provided for use by
the callers of the MSR accessors.
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Aristeu Rozanski <aris@redhat.com>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Doug Thompson <dougthompson@xmission.com>
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
LKML-Reference: <20091211171440.GD31998@aftab>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/msr.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 5bef931f8b14..2d228fc9b4b7 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h | |||
@@ -244,6 +244,9 @@ do { \ | |||
244 | 244 | ||
245 | #define write_rdtscp_aux(val) wrmsr(0xc0000103, (val), 0) | 245 | #define write_rdtscp_aux(val) wrmsr(0xc0000103, (val), 0) |
246 | 246 | ||
247 | struct msr *msrs_alloc(void); | ||
248 | void msrs_free(struct msr *msrs); | ||
249 | |||
247 | #ifdef CONFIG_SMP | 250 | #ifdef CONFIG_SMP |
248 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); | 251 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); |
249 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); | 252 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); |