X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fpower%2Fcpu.c;h=a603f523afe2ed4477d52a37172ee6056353ff03;hb=9c920a8402f2bb9bd931801d429b65f4eb6a262b;hp=28ea6059f240cad6e79fb3c71711fba57f289592;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/arch/i386/power/cpu.c b/arch/i386/power/cpu.c index 28ea6059f..a603f523a 100644 --- a/arch/i386/power/cpu.c +++ b/arch/i386/power/cpu.c @@ -27,6 +27,7 @@ #include static struct saved_context saved_context; +static void fix_processor_context(void); unsigned long saved_context_eax, saved_context_ebx; unsigned long saved_context_ecx, saved_context_edx; @@ -36,38 +37,33 @@ unsigned long saved_context_eflags; extern void enable_sep_cpu(void *); -void __save_processor_state(struct saved_context *ctxt) +void save_processor_state(void) { kernel_fpu_begin(); /* * descriptor tables */ - asm volatile ("sgdt %0" : "=m" (ctxt->gdt_limit)); - asm volatile ("sidt %0" : "=m" (ctxt->idt_limit)); - asm volatile ("sldt %0" : "=m" (ctxt->ldt)); - asm volatile ("str %0" : "=m" (ctxt->tr)); + asm volatile ("sgdt %0" : "=m" (saved_context.gdt_limit)); + asm volatile ("sidt %0" : "=m" (saved_context.idt_limit)); + asm volatile ("sldt %0" : "=m" (saved_context.ldt)); + asm volatile ("str %0" : "=m" (saved_context.tr)); /* * segment registers */ - asm volatile ("movw %%es, %0" : "=m" (ctxt->es)); - asm volatile ("movw %%fs, %0" : "=m" (ctxt->fs)); - asm volatile ("movw %%gs, %0" : "=m" (ctxt->gs)); - asm volatile ("movw %%ss, %0" : "=m" (ctxt->ss)); + asm volatile ("movw %%es, %0" : "=m" (saved_context.es)); + asm volatile ("movw %%fs, %0" : "=m" (saved_context.fs)); + asm volatile ("movw %%gs, %0" : "=m" (saved_context.gs)); + asm volatile ("movw %%ss, %0" : "=m" (saved_context.ss)); /* * control registers */ - asm volatile ("movl %%cr0, %0" : "=r" (ctxt->cr0)); - asm volatile ("movl %%cr2, %0" : "=r" (ctxt->cr2)); - asm volatile ("movl %%cr3, %0" : "=r" (ctxt->cr3)); - asm volatile ("movl %%cr4, %0" : "=r" (ctxt->cr4)); -} - -void save_processor_state(void) -{ - __save_processor_state(&saved_context); + asm volatile ("movl %%cr0, %0" : "=r" (saved_context.cr0)); + asm volatile ("movl %%cr2, %0" : "=r" (saved_context.cr2)); + asm volatile ("movl %%cr3, %0" : "=r" (saved_context.cr3)); + asm volatile ("movl %%cr4, %0" : "=r" (saved_context.cr4)); } static void @@ -79,57 +75,32 @@ do_fpu_end(void) mxcsr_feature_mask_init(); } - -static void fix_processor_context(void) -{ - int cpu = smp_processor_id(); - - cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff; - - load_TR_desc(); /* This does ltr */ - load_LDT(¤t->active_mm->context); /* This does lldt */ - - /* - * Now maybe reload the debug registers - */ - if (current->thread.debugreg[7]){ - loaddebug(¤t->thread, 0); - loaddebug(¤t->thread, 1); - loaddebug(¤t->thread, 2); - loaddebug(¤t->thread, 3); - /* no 4 and 5 */ - loaddebug(¤t->thread, 6); - loaddebug(¤t->thread, 7); - } - -} - -void __restore_processor_state(struct saved_context *ctxt) +void restore_processor_state(void) { /* * control registers */ - asm volatile ("movl %0, %%cr4" :: "r" (ctxt->cr4)); - asm volatile ("movl %0, %%cr3" :: "r" (ctxt->cr3)); - asm volatile ("movl %0, %%cr2" :: "r" (ctxt->cr2)); - asm volatile ("movl %0, %%cr0" :: "r" (ctxt->cr0)); + asm volatile ("movl %0, %%cr4" :: "r" (saved_context.cr4)); + asm volatile ("movl %0, %%cr3" :: "r" (saved_context.cr3)); + asm volatile ("movl %0, %%cr2" :: "r" (saved_context.cr2)); + asm volatile ("movl %0, %%cr0" :: "r" (saved_context.cr0)); /* * segment registers */ - asm volatile ("movw %0, %%es" :: "r" (ctxt->es)); - asm volatile ("movw %0, %%fs" :: "r" (ctxt->fs)); - asm volatile ("movw %0, %%gs" :: "r" (ctxt->gs)); - asm volatile ("movw %0, %%ss" :: "r" (ctxt->ss)); + asm volatile ("movw %0, %%es" :: "r" (saved_context.es)); + asm volatile ("movw %0, %%fs" :: "r" (saved_context.fs)); + asm volatile ("movw %0, %%gs" :: "r" (saved_context.gs)); + asm volatile ("movw %0, %%ss" :: "r" (saved_context.ss)); /* * now restore the descriptor tables to their proper values * ltr is done i fix_processor_context(). */ - asm volatile ("lgdt %0" :: "m" (ctxt->gdt_limit)); - asm volatile ("lidt %0" :: "m" (ctxt->idt_limit)); - asm volatile ("lldt %0" :: "m" (ctxt->ldt)); + asm volatile ("lgdt %0" :: "m" (saved_context.gdt_limit)); + asm volatile ("lidt %0" :: "m" (saved_context.idt_limit)); + asm volatile ("lldt %0" :: "m" (saved_context.ldt)); /* * sysenter MSRs @@ -141,11 +112,29 @@ void __restore_processor_state(struct saved_context *ctxt) do_fpu_end(); } -void restore_processor_state(void) +static void fix_processor_context(void) { - __restore_processor_state(&saved_context); -} + int cpu = smp_processor_id(); + + cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff; + load_TR_desc(); /* This does ltr */ + load_LDT(¤t->active_mm->context); /* This does lldt */ + + /* + * Now maybe reload the debug registers + */ + if (current->thread.debugreg[7]){ + loaddebug(¤t->thread, 0); + loaddebug(¤t->thread, 1); + loaddebug(¤t->thread, 2); + loaddebug(¤t->thread, 3); + /* no 4 and 5 */ + loaddebug(¤t->thread, 6); + loaddebug(¤t->thread, 7); + } + +} EXPORT_SYMBOL(save_processor_state); EXPORT_SYMBOL(restore_processor_state);