diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/i386/kernel/i387.c | 11 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 20 | ||||
-rw-r--r-- | arch/i386/kernel/setup.c | 14 |
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 | } |
83 | EXPORT_SYMBOL_GPL(kernel_fpu_begin); | 83 | EXPORT_SYMBOL_GPL(kernel_fpu_begin); |
84 | 84 | ||
85 | void 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. */ |
1418 | void apply_alternatives(void *start, void *end) | 1418 | void 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 | ||
1445 | static int no_replacement __initdata = 0; | ||
1446 | |||
1447 | void __init alternative_instructions(void) | 1445 | void __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 | ||
1455 | static int __init noreplacement_setup(char *s) | ||
1456 | { | ||
1457 | no_replacement = 1; | ||
1458 | return 0; | ||
1459 | } | ||
1460 | |||
1461 | __setup("noreplacement", noreplacement_setup); | ||
1462 | |||
1463 | static char * __init machine_specific_memory_setup(void); | 1451 | static char * __init machine_specific_memory_setup(void); |
1464 | 1452 | ||
1465 | #ifdef CONFIG_MCA | 1453 | #ifdef CONFIG_MCA |