aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-04-30 03:56:41 -0400
committerIngo Molnar <mingo@elte.hu>2010-04-30 03:56:44 -0400
commit3ca50496c2677a2b3fdd3ede86660fd1433beac6 (patch)
tree97a76d8479a8d8a96e04ed0694b8dbf89457bfcc /arch/x86/kernel
parent462b04e28a7ec1339c892117c3f20a40e55d0e83 (diff)
parent66f41d4c5c8a5deed66fdcc84509376c9a0bf9d8 (diff)
Merge commit 'v2.6.34-rc6' into perf/core
Merge reason: update to the latest -rc. Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/apb_timer.c2
-rw-r--r--arch/x86/kernel/cpu/intel.c21
-rw-r--r--arch/x86/kernel/cpu/vmware.c2
-rw-r--r--arch/x86/kernel/process_64.c4
4 files changed, 26 insertions, 3 deletions
diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c
index ff469e470059..a35347501d36 100644
--- a/arch/x86/kernel/apb_timer.c
+++ b/arch/x86/kernel/apb_timer.c
@@ -429,7 +429,7 @@ static int apbt_cpuhp_notify(struct notifier_block *n,
429 429
430static __init int apbt_late_init(void) 430static __init int apbt_late_init(void)
431{ 431{
432 if (disable_apbt_percpu) 432 if (disable_apbt_percpu || !apb_timer_block_enabled)
433 return 0; 433 return 0;
434 /* This notifier should be called after workqueue is ready */ 434 /* This notifier should be called after workqueue is ready */
435 hotcpu_notifier(apbt_cpuhp_notify, -20); 435 hotcpu_notifier(apbt_cpuhp_notify, -20);
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index d72377c41c76..f5e5390d3459 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -46,6 +46,27 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
46 (c->x86 == 0x6 && c->x86_model >= 0x0e)) 46 (c->x86 == 0x6 && c->x86_model >= 0x0e))
47 set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); 47 set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
48 48
49 /*
50 * Atom erratum AAE44/AAF40/AAG38/AAH41:
51 *
52 * A race condition between speculative fetches and invalidating
53 * a large page. This is worked around in microcode, but we
54 * need the microcode to have already been loaded... so if it is
55 * not, recommend a BIOS update and disable large pages.
56 */
57 if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2) {
58 u32 ucode, junk;
59
60 wrmsr(MSR_IA32_UCODE_REV, 0, 0);
61 sync_core();
62 rdmsr(MSR_IA32_UCODE_REV, junk, ucode);
63
64 if (ucode < 0x20e) {
65 printk(KERN_WARNING "Atom PSE erratum detected, BIOS microcode update recommended\n");
66 clear_cpu_cap(c, X86_FEATURE_PSE);
67 }
68 }
69
49#ifdef CONFIG_X86_64 70#ifdef CONFIG_X86_64
50 set_cpu_cap(c, X86_FEATURE_SYSENTER32); 71 set_cpu_cap(c, X86_FEATURE_SYSENTER32);
51#else 72#else
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index 1cbed97b59cf..dfdb4dba2320 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -22,6 +22,7 @@
22 */ 22 */
23 23
24#include <linux/dmi.h> 24#include <linux/dmi.h>
25#include <linux/module.h>
25#include <asm/div64.h> 26#include <asm/div64.h>
26#include <asm/vmware.h> 27#include <asm/vmware.h>
27#include <asm/x86_init.h> 28#include <asm/x86_init.h>
@@ -101,6 +102,7 @@ int vmware_platform(void)
101 102
102 return 0; 103 return 0;
103} 104}
105EXPORT_SYMBOL(vmware_platform);
104 106
105/* 107/*
106 * VMware hypervisor takes care of exporting a reliable TSC to the guest. 108 * VMware hypervisor takes care of exporting a reliable TSC to the guest.
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index cc4258f2beb5..50cc84ac0a0d 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -275,12 +275,12 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
275 275
276 set_tsk_thread_flag(p, TIF_FORK); 276 set_tsk_thread_flag(p, TIF_FORK);
277 277
278 p->thread.fs = me->thread.fs;
279 p->thread.gs = me->thread.gs;
280 p->thread.io_bitmap_ptr = NULL; 278 p->thread.io_bitmap_ptr = NULL;
281 279
282 savesegment(gs, p->thread.gsindex); 280 savesegment(gs, p->thread.gsindex);
281 p->thread.gs = p->thread.gsindex ? 0 : me->thread.gs;
283 savesegment(fs, p->thread.fsindex); 282 savesegment(fs, p->thread.fsindex);
283 p->thread.fs = p->thread.fsindex ? 0 : me->thread.fs;
284 savesegment(es, p->thread.es); 284 savesegment(es, p->thread.es);
285 savesegment(ds, p->thread.ds); 285 savesegment(ds, p->thread.ds);
286 286