/** * \file * * * \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. #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 %ecx movl 0x10(%esp),%ebp /* ebp = save_sp */ movl %esp,(%ebp) /* *save_sp = esp */ movl 0x0c(%esp),%ebp /* ebp = new_sp */ movl (%ebp),%esp /* esp = *new_sp */ popl %ecx popl %ebp ret