swsusp updates
Hi!
This uses "better" constraints that do not go through the register unneccessarily. Please apply,
Pavel
arch/i386/kernel/suspend.c +23 -25
@@ -54,10 +54,10 @@/* * 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" (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));/* * save the general registers.
@@ -67,22 +67,22 @@* It's really not necessary, and kinda fishy (check the assembly output), * so it's avoided. */ - asmvolatile ("movl %%esp, (%0)" :"=m" (saved_context.esp)); - asmvolatile ("movl %%eax, (%0)" :"=m" (saved_context.eax)); - asmvolatile ("movl %%ebx, (%0)" :"=m" (saved_context.ebx)); - asmvolatile ("movl %%ecx, (%0)" :"=m" (saved_context.ecx)); - asmvolatile ("movl %%edx, (%0)" :"=m" (saved_context.edx)); - asmvolatile ("movl %%ebp, (%0)" :"=m" (saved_context.ebp)); - asmvolatile ("movl %%esi, (%0)" :"=m" (saved_context.esi)); - asmvolatile ("movl %%edi, (%0)" :"=m" (saved_context.edi)); - + asmvolatile ("movl %%esp, %0" :"=m" (saved_context.esp)); + asmvolatile ("movl %%eax, %0" :"=m" (saved_context.eax)); + asmvolatile ("movl %%ebx, %0" :"=m" (saved_context.ebx)); + asmvolatile ("movl %%ecx, %0" :"=m" (saved_context.ecx)); + asmvolatile ("movl %%edx, %0" :"=m" (saved_context.edx)); + asmvolatile ("movl %%ebp, %0" :"=m" (saved_context.ebp)); + asmvolatile ("movl %%esi, %0" :"=m" (saved_context.esi)); + asmvolatile ("movl %%edi, %0" :"=m" (saved_context.edi)); +/* FIXME: Need to save XMM0..XMM15? */ /* * segment registers */ - asmvolatile ("movw %%es, %0" :"=r" (saved_context.es)); - asmvolatile ("movw %%fs, %0" :"=r" (saved_context.fs)); - asmvolatile ("movw %%gs, %0" :"=r" (saved_context.gs)); - asmvolatile ("movw %%ss, %0" :"=r" (saved_context.ss)); + 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));/* * control registers
@@ -95,7 +95,7 @@/* * eflags */ - asmvolatile ("pushfl ; popl (%0)" :"=m" (saved_context.eflags)); + asmvolatile ("pushfl ; popl %0" :"=m" (saved_context.eflags)); } static void
@@ -125,9 +125,7 @@/* * first restore %ds, so we can access our data properly */ - asmvolatile (".align 4" ); - asmvolatile ("movw %0, %%ds" ::"r" ((u16 )__KERNEL_DS)); - + asmvolatile ("movw %0, %%ds" ::"r" (__KERNEL_DS));/* * control registers
@@ -136,7 +134,7 @@ asmvolatile ("movl %0, %%cr3" ::"r" (saved_context.cr3)); asmvolatile ("movl %0, %%cr2" ::"r" (saved_context.cr2)); asmvolatile ("movl %0, %%cr0" ::"r" (saved_context.cr0)); - +/* * segment registers */
@@ -167,9 +165,9 @@* 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" (saved_context.gdt_limit)); + asmvolatile ("lidt %0" ::"m" (saved_context.idt_limit)); + asmvolatile ("lldt %0" ::"m" (saved_context.ldt));fix_processor_context ();
include/asm-i386/suspend.h +15 -15
@@ -15,22 +15,22 @@/* image of the saved processor state */ struct saved_context { -u32 eax, ebx, ecx, edx; -u32 esp, ebp, esi, edi; -u16 es, fs, gs, ss; -u32 cr0, cr2, cr3, cr4; +unsigned long eax, ebx, ecx, edx; +unsigned long esp, ebp, esi, edi; +u16 es, fs, gs, ss; +unsigned long cr0, cr2, cr3, cr4;u16 gdt_pad;u16 gdt_limit; -u32 gdt_base; +unsigned long gdt_base;u16 idt_pad;u16 idt_limit; -u32 idt_base; +unsigned long idt_base;u16 ldt;u16 tss; -u32 tr; -u32 safety; -u32 return_address; -u32 eflags; +unsigned long tr; +unsigned long safety; +unsigned long return_address; +unsigned long eflags; } __attribute__((packed));#define loaddebug (thread,register) \
@@ -52,11 +52,11 @@static inline void acpi_save_register_state (unsigned long return_point) { saved_eip = return_point; - asmvolatile ("movl %%esp,(%0)" :"=m" (saved_esp)); - asmvolatile ("movl %%ebp,(%0)" :"=m" (saved_ebp)); - asmvolatile ("movl %%ebx,(%0)" :"=m" (saved_ebx)); - asmvolatile ("movl %%edi,(%0)" :"=m" (saved_edi)); - asmvolatile ("movl %%esi,(%0)" :"=m" (saved_esi)); + asmvolatile ("movl %%esp,%0" :"=m" (saved_esp)); + asmvolatile ("movl %%ebp,%0" :"=m" (saved_ebp)); + asmvolatile ("movl %%ebx,%0" :"=m" (saved_ebx)); + asmvolatile ("movl %%edi,%0" :"=m" (saved_edi)); + asmvolatile ("movl %%esi,%0" :"=m" (saved_esi)); }#define acpi_restore_register_state () do {} while (0)
Signature · 2 lines
Worst form of spam? Adding advertisment signatures ala sourceforge.net. What goes next? Inserting advertisment *into* email?