swsusp: shuffle cpu.c to make it usable for smp suspend
Hi!
This moves fix_processor_context() so that additional prototype is not needed, and adds context * to processor state saving functions, so that they can be used on SMP. It should be done this way from the beggining. Please consider applying,
Signed-off-by Pavel Machek <[email protected]>
Pavel
arch/i386/power/cpu.c +60 -49
@@ -27,7 +27,6 @@#include <asm/tlbflush.h> 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;
@@ -37,33 +36,38 @@extern void enable_sep_cpu (void *); -void save_processor_state (void ) +void __save_processor_state (struct saved_context *ctxt) {kernel_fpu_begin ();/* * descriptor tables */ - asmvolatile ("sgdt %0" :"=m" (saved_context.gdt_limit)); - asmvolatile ("sidt %0" :"=m" (saved_context.idt_limit)); - asmvolatile ("sldt %0" :"=m" (saved_context.ldt)); - asmvolatile ("str %0" :"=m" (saved_context.tr)); + asmvolatile ("sgdt %0" :"=m" (ctxt->gdt_limit)); + asmvolatile ("sidt %0" :"=m" (ctxt->idt_limit)); + asmvolatile ("sldt %0" :"=m" (ctxt->ldt)); + asmvolatile ("str %0" :"=m" (ctxt->tr));/* * segment registers */ - asmvolatile ("movw %%es, %0" :"=m" (saved_context.es)); - asmvolatile ("movw %%fs, %0" :"=m" (saved_context.fs)); - asmvolatile ("movw %%gs, %0" :"=m" (saved_context.gs)); - asmvolatile ("movw %%ss, %0" :"=m" (saved_context.ss)); + asmvolatile ("movw %%es, %0" :"=m" (ctxt->es)); + asmvolatile ("movw %%fs, %0" :"=m" (ctxt->fs)); + asmvolatile ("movw %%gs, %0" :"=m" (ctxt->gs)); + asmvolatile ("movw %%ss, %0" :"=m" (ctxt->ss));/* * control registers */ - asmvolatile ("movl %%cr0, %0" :"=r" (saved_context.cr0)); - asmvolatile ("movl %%cr2, %0" :"=r" (saved_context.cr2)); - asmvolatile ("movl %%cr3, %0" :"=r" (saved_context.cr3)); - asmvolatile ("movl %%cr4, %0" :"=r" (saved_context.cr4)); + asmvolatile ("movl %%cr0, %0" :"=r" (ctxt->cr0)); + asmvolatile ("movl %%cr2, %0" :"=r" (ctxt->cr2)); + asmvolatile ("movl %%cr3, %0" :"=r" (ctxt->cr3)); + asmvolatile ("movl %%cr4, %0" :"=r" (ctxt->cr4)); +} + +void save_processor_state (void ) +{ +__save_processor_state (&saved_context); } static void
@@ -75,32 +79,59 @@mxcsr_feature_mask_init (); } -void restore_processor_state (void ) + +static void fix_processor_context (void ) +{ +int cpu =smp_processor_id (); +struct tss_struct * t = init_tss + cpu; + +set_tss_desc (cpu,t);/* This just modifies memory; should not be necessary. But... This is necessary, because 386 hardware has concept of busy TSS or some similar stupidity. */ + 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) {/* * control registers */ - asmvolatile ("movl %0, %%cr4" ::"r" (saved_context.cr4)); - asmvolatile ("movl %0, %%cr3" ::"r" (saved_context.cr3)); - asmvolatile ("movl %0, %%cr2" ::"r" (saved_context.cr2)); - asmvolatile ("movl %0, %%cr0" ::"r" (saved_context.cr0)); + asmvolatile ("movl %0, %%cr4" ::"r" (ctxt->cr4)); + asmvolatile ("movl %0, %%cr3" ::"r" (ctxt->cr3)); + asmvolatile ("movl %0, %%cr2" ::"r" (ctxt->cr2)); + asmvolatile ("movl %0, %%cr0" ::"r" (ctxt->cr0));/* * segment registers */ - asmvolatile ("movw %0, %%es" ::"r" (saved_context.es)); - asmvolatile ("movw %0, %%fs" ::"r" (saved_context.fs)); - asmvolatile ("movw %0, %%gs" ::"r" (saved_context.gs)); - asmvolatile ("movw %0, %%ss" ::"r" (saved_context.ss)); + asmvolatile ("movw %0, %%es" ::"r" (ctxt->es)); + asmvolatile ("movw %0, %%fs" ::"r" (ctxt->fs)); + asmvolatile ("movw %0, %%gs" ::"r" (ctxt->gs)); + asmvolatile ("movw %0, %%ss" ::"r" (ctxt->ss));/* * now restore the descriptor tables to their proper values * ltr is done i fix_processor_context(). */ - asmvolatile ("lgdt %0" ::"m" (saved_context.gdt_limit)); - asmvolatile ("lidt %0" ::"m" (saved_context.idt_limit)); - asmvolatile ("lldt %0" ::"m" (saved_context.ldt)); + asmvolatile ("lgdt %0" ::"m" (ctxt->gdt_limit)); + asmvolatile ("lidt %0" ::"m" (ctxt->idt_limit)); + asmvolatile ("lldt %0" ::"m" (ctxt->ldt));/* * sysenter MSRs
@@ -112,31 +143,11 @@do_fpu_end (); } -static void fix_processor_context (void ) +void restore_processor_state (void ) { -int cpu =smp_processor_id (); -struct tss_struct * t = init_tss + cpu; - -set_tss_desc (cpu,t);/* This just modifies memory; should not be necessary. But... This is necessary, because 386 hardware has concept of busy TSS or some similar stupidity. */ - 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 ); - } - +__restore_processor_state (&saved_context); } +EXPORT_SYMBOL (save_processor_state);EXPORT_SYMBOL (restore_processor_state);
Signature · 2 lines
People were complaining that M$ turns users into beta-testers... ...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!