/** * \file * * * \version $Id$ * \author Bernie Innocenti * * \brief i386 context switch */ #ifdef __APPLE__ // This workaround is necessary to compile under OS X assembler. #define SWITCH_CONTEXT _asm_switch_context #else #define SWITCH_CONTEXT asm_switch_context #endif /* void asm_switch_context(void ** new_sp [sp+4], void ** save_sp [sp+8]) */ .globl SWITCH_CONTEXT SWITCH_CONTEXT: pushl %ebp pushl %edi pushl %esi pushl %ebx movl 0x24(%esp),%ebp /* ebp = save_sp */ movl %esp,(%ebp) /* *save_sp = esp */ movl 0x20(%esp),%ebp /* ebp = new_sp */ movl (%ebp),%esp /* esp = *new_sp */ popl %ebx popl %esi popl %edi popl %ebp ret