X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Fswitch_i386.S;h=f00d447c1467093ed74dedc8c5722099efe0566c;hb=b8654961cd6761207f6fc880229b39314f6749e2;hp=b605c15edde69ee29af960b6f9ce9bdcf4f76fe2;hpb=32d1445272120a254d77ce8d1af1f527da7a2c17;p=bertos.git diff --git a/bertos/emul/switch_i386.S b/bertos/emul/switch_i386.S index b605c15e..f00d447c 100644 --- a/bertos/emul/switch_i386.S +++ b/bertos/emul/switch_i386.S @@ -30,10 +30,22 @@ * Copyright 1999, 2000, 2001 Bernie Innocenti * --> * - * \version $Id$ * \author Bernie Innocenti * * \brief i386 context switch + * + * x86 function calling convention: + * -------------------------------- + * arguments | callee-saved | extra caller-saved | return + * [callee-clobbered] | | [callee-clobbered] | + * ------------------------------------------------------------------------- + * eax edx ecx | ebx edi esi ebp [*] | | eax, edx + * + * [*] In the frame-pointers case rbp must hold a base address for the + * current stack frame. + * + * asm_switch_context() can be considered as a normal function call, so we need + * to save all the callee-clobbered registers minus the return registers. */ #ifdef __APPLE__ @@ -47,15 +59,11 @@ .globl SWITCH_CONTEXT SWITCH_CONTEXT: pushl %ebp - pushl %edi - pushl %esi - pushl %ebx - movl 0x24(%esp),%ebp /* ebp = save_sp */ + pushl %ecx + movl 0x10(%esp),%ebp /* ebp = save_sp */ movl %esp,(%ebp) /* *save_sp = esp */ - movl 0x20(%esp),%ebp /* ebp = new_sp */ + movl 0x0c(%esp),%ebp /* ebp = new_sp */ movl (%ebp),%esp /* esp = *new_sp */ - popl %ebx - popl %esi - popl %edi + popl %ecx popl %ebp ret