diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-06-13 16:29:25 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-06-13 16:29:25 +0000 |
commit | db7d4daea91e105e3859cf461d7e53b9b77454b2 (patch) | |
tree | 9bb65b95440af09e8aca63abe56970dd3360cc57 /include/asm-i386/system.h | |
parent | 9c1c01ead627bdda9211c9abd5b758d6c687d8ac (diff) |
Merge with Linux 2.2.8.
Diffstat (limited to 'include/asm-i386/system.h')
-rw-r--r-- | include/asm-i386/system.h | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/include/asm-i386/system.h b/include/asm-i386/system.h index 6dd4b33f0..ebdb8b790 100644 --- a/include/asm-i386/system.h +++ b/include/asm-i386/system.h @@ -9,30 +9,24 @@ struct task_struct; /* one of the stranger aspects of C forward declarations.. */ extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next)); -/* - * We do most of the task switching in C, but we need - * to do the EIP/ESP switch in assembly.. - */ -#define switch_to(prev,next) do { \ - unsigned long eax, edx, ecx; \ - asm volatile("pushl %%ebx\n\t" \ - "pushl %%esi\n\t" \ +#define switch_to(prev,next,last) do { \ + asm volatile("pushl %%esi\n\t" \ "pushl %%edi\n\t" \ "pushl %%ebp\n\t" \ "movl %%esp,%0\n\t" /* save ESP */ \ - "movl %5,%%esp\n\t" /* restore ESP */ \ + "movl %3,%%esp\n\t" /* restore ESP */ \ "movl $1f,%1\n\t" /* save EIP */ \ - "pushl %6\n\t" /* restore EIP */ \ + "pushl %4\n\t" /* restore EIP */ \ "jmp __switch_to\n" \ "1:\t" \ "popl %%ebp\n\t" \ "popl %%edi\n\t" \ "popl %%esi\n\t" \ - "popl %%ebx" \ :"=m" (prev->tss.esp),"=m" (prev->tss.eip), \ - "=a" (eax), "=d" (edx), "=c" (ecx) \ + "=b" (last) \ :"m" (next->tss.esp),"m" (next->tss.eip), \ - "a" (prev), "d" (next)); \ + "a" (prev), "d" (next), \ + "b" (prev)); \ } while (0) #define _set_base(addr,base) do { unsigned long __pr; \ |