X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Fswitch_i386.S;h=f00d447c1467093ed74dedc8c5722099efe0566c;hb=56f2c002c50338f23f1b969ba51a43b0eb24f3da;hp=0b2f0937e07c2fed3251a32fc4d5c723aa7a249e;hpb=8ae4e430b21973bae9a6bc26b6fd5e08bd07c4c7;p=bertos.git diff --git a/bertos/emul/switch_i386.S b/bertos/emul/switch_i386.S index 0b2f0937..f00d447c 100644 --- a/bertos/emul/switch_i386.S +++ b/bertos/emul/switch_i386.S @@ -26,54 +26,44 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2004 Develer S.r.l. (http://www.develer.com/) + * Copyright 2004, 2008 Develer S.r.l. (http://www.develer.com/) * Copyright 1999, 2000, 2001 Bernie Innocenti - * This file is part of DevLib - See devlib/README for information. * --> * - * \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__ - //This workaround is necessary to compile under OS X assembler. + // This workaround is necessary to compile under OS X assembler. #define SWITCH_CONTEXT _asm_switch_context - #define SWITCH_VERSION _asm_switch_version #else #define SWITCH_CONTEXT asm_switch_context - #define SWITCH_VERSION asm_switch_version #endif -/* void asm_switch_context(void ** new_sp, void ** save_sp) */ +/* void asm_switch_context(void ** new_sp [sp+4], void ** save_sp [sp+8]) */ .globl SWITCH_CONTEXT SWITCH_CONTEXT: - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi pushl %ebp - 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 %ebp - popl %edi - popl %esi - popl %edx popl %ecx - popl %ebx - popl %eax - ret - -/* int asm_switch_version(void) */ -.globl SWITCH_VERSION -SWITCH_VERSION: - mov $1,%eax + popl %ebp ret -