diff options
Diffstat (limited to 'arch/i386/kernel/process.c')
-rw-r--r-- | arch/i386/kernel/process.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 23ae198dbbc3..cfae587bf7d2 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -670,14 +670,6 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
670 | load_TLS(next, cpu); | 670 | load_TLS(next, cpu); |
671 | 671 | ||
672 | /* | 672 | /* |
673 | * Restore %gs if needed (which is common) | ||
674 | */ | ||
675 | if (prev->gs | next->gs) | ||
676 | loadsegment(gs, next->gs); | ||
677 | |||
678 | write_pda(pcurrent, next_p); | ||
679 | |||
680 | /* | ||
681 | * Now maybe handle debug registers and/or IO bitmaps | 673 | * Now maybe handle debug registers and/or IO bitmaps |
682 | */ | 674 | */ |
683 | if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW) | 675 | if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW) |
@@ -686,6 +678,15 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
686 | 678 | ||
687 | disable_tsc(prev_p, next_p); | 679 | disable_tsc(prev_p, next_p); |
688 | 680 | ||
681 | /* | ||
682 | * Leave lazy mode, flushing any hypercalls made here. | ||
683 | * This must be done before restoring TLS segments so | ||
684 | * the GDT and LDT are properly updated, and must be | ||
685 | * done before math_state_restore, so the TS bit is up | ||
686 | * to date. | ||
687 | */ | ||
688 | arch_leave_lazy_cpu_mode(); | ||
689 | |||
689 | /* If the task has used fpu the last 5 timeslices, just do a full | 690 | /* If the task has used fpu the last 5 timeslices, just do a full |
690 | * restore of the math state immediately to avoid the trap; the | 691 | * restore of the math state immediately to avoid the trap; the |
691 | * chances of needing FPU soon are obviously high now | 692 | * chances of needing FPU soon are obviously high now |
@@ -693,6 +694,14 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
693 | if (next_p->fpu_counter > 5) | 694 | if (next_p->fpu_counter > 5) |
694 | math_state_restore(); | 695 | math_state_restore(); |
695 | 696 | ||
697 | /* | ||
698 | * Restore %gs if needed (which is common) | ||
699 | */ | ||
700 | if (prev->gs | next->gs) | ||
701 | loadsegment(gs, next->gs); | ||
702 | |||
703 | write_pda(pcurrent, next_p); | ||
704 | |||
696 | return prev_p; | 705 | return prev_p; |
697 | } | 706 | } |
698 | 707 | ||