aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/i387.c11
-rw-r--r--arch/i386/kernel/process.c20
-rw-r--r--arch/i386/kernel/setup.c14
3 files changed, 13 insertions, 32 deletions
diff --git a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c
index b817168d9c62..d75524758daf 100644
--- a/arch/i386/kernel/i387.c
+++ b/arch/i386/kernel/i387.c
@@ -82,17 +82,6 @@ void kernel_fpu_begin(void)
82} 82}
83EXPORT_SYMBOL_GPL(kernel_fpu_begin); 83EXPORT_SYMBOL_GPL(kernel_fpu_begin);
84 84
85void restore_fpu( struct task_struct *tsk )
86{
87 if ( cpu_has_fxsr ) {
88 asm volatile( "fxrstor %0"
89 : : "m" (tsk->thread.i387.fxsave) );
90 } else {
91 asm volatile( "frstor %0"
92 : : "m" (tsk->thread.i387.fsave) );
93 }
94}
95
96/* 85/*
97 * FPU tag word conversions. 86 * FPU tag word conversions.
98 */ 87 */
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
index ba243a4cc119..d9492058aaf3 100644
--- a/arch/i386/kernel/process.c
+++ b/arch/i386/kernel/process.c
@@ -700,23 +700,27 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
700 700
701 /* 701 /*
702 * Restore %fs and %gs if needed. 702 * Restore %fs and %gs if needed.
703 *
704 * Glibc normally makes %fs be zero, and %gs is one of
705 * the TLS segments.
703 */ 706 */
704 if (unlikely(prev->fs | prev->gs | next->fs | next->gs)) { 707 if (unlikely(prev->fs | next->fs))
705 loadsegment(fs, next->fs); 708 loadsegment(fs, next->fs);
709
710 if (prev->gs | next->gs)
706 loadsegment(gs, next->gs); 711 loadsegment(gs, next->gs);
707 }
708 712
709 /* 713 /*
710 * Now maybe reload the debug registers 714 * Now maybe reload the debug registers
711 */ 715 */
712 if (unlikely(next->debugreg[7])) { 716 if (unlikely(next->debugreg[7])) {
713 set_debugreg(current->thread.debugreg[0], 0); 717 set_debugreg(next->debugreg[0], 0);
714 set_debugreg(current->thread.debugreg[1], 1); 718 set_debugreg(next->debugreg[1], 1);
715 set_debugreg(current->thread.debugreg[2], 2); 719 set_debugreg(next->debugreg[2], 2);
716 set_debugreg(current->thread.debugreg[3], 3); 720 set_debugreg(next->debugreg[3], 3);
717 /* no 4 and 5 */ 721 /* no 4 and 5 */
718 set_debugreg(current->thread.debugreg[6], 6); 722 set_debugreg(next->debugreg[6], 6);
719 set_debugreg(current->thread.debugreg[7], 7); 723 set_debugreg(next->debugreg[7], 7);
720 } 724 }
721 725
722 if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) 726 if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr))
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index 7306353c520e..af4de58cab54 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -1414,7 +1414,7 @@ static struct nop {
1414 This runs before SMP is initialized to avoid SMP problems with 1414 This runs before SMP is initialized to avoid SMP problems with
1415 self modifying code. This implies that assymetric systems where 1415 self modifying code. This implies that assymetric systems where
1416 APs have less capabilities than the boot processor are not handled. 1416 APs have less capabilities than the boot processor are not handled.
1417 In this case boot with "noreplacement". */ 1417 Tough. Make sure you disable such features by hand. */
1418void apply_alternatives(void *start, void *end) 1418void apply_alternatives(void *start, void *end)
1419{ 1419{
1420 struct alt_instr *a; 1420 struct alt_instr *a;
@@ -1442,24 +1442,12 @@ void apply_alternatives(void *start, void *end)
1442 } 1442 }
1443} 1443}
1444 1444
1445static int no_replacement __initdata = 0;
1446
1447void __init alternative_instructions(void) 1445void __init alternative_instructions(void)
1448{ 1446{
1449 extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; 1447 extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
1450 if (no_replacement)
1451 return;
1452 apply_alternatives(__alt_instructions, __alt_instructions_end); 1448 apply_alternatives(__alt_instructions, __alt_instructions_end);
1453} 1449}
1454 1450
1455static int __init noreplacement_setup(char *s)
1456{
1457 no_replacement = 1;
1458 return 0;
1459}
1460
1461__setup("noreplacement", noreplacement_setup);
1462
1463static char * __init machine_specific_memory_setup(void); 1451static char * __init machine_specific_memory_setup(void);
1464 1452
1465#ifdef CONFIG_MCA 1453#ifdef CONFIG_MCA