/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * PURPOSE: Implementation of _setjmp/longjmp * FILE: lib/sdk/crt/setjmp/i386/setjmp.s * PROGRAMMER: Ge van Geldorp (ge@gse.nl) * NOTES: Implementation is not complete, see Wine source for a more * complete implementation */ #include #define JB_BP 0 #define JB_BX 1 #define JB_DI 2 #define JB_SI 3 #define JB_SP 4 #define JB_IP 5 #define PCOFF 0 #define JMPBUF 4 .code /* * int * _setjmp(jmp_buf env); * * Parameters: * [ESP+04h] - jmp_buf env * Registers: * None * Returns: * 0 * Notes: * Sets up the jmp_buf */ PUBLIC __setjmp __setjmp: xor eax, eax mov edx, JMPBUF[esp] /* Save registers. */ mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */ mov [edx + JB_BX*4], ebx mov [edx + JB_DI*4], edi mov [edx + JB_SI*4], esi lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */ mov [edx + JB_SP*4], ecx mov ecx, PCOFF[esp] /* Save PC we are returning to now. */ mov [edx + JB_IP*4], ecx ret /* * int * _setjmp3(jmp_buf env, int nb_args, ...); * * Parameters: * [ESP+04h] - jmp_buf env * Registers: * None * Returns: * 0 * Notes: * Sets up the jmp_buf */ PUBLIC __setjmp3 __setjmp3: xor eax, eax mov edx, JMPBUF[esp] /* Save registers. */ mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */ mov [edx + JB_BX*4], ebx mov [edx + JB_DI*4], edi mov [edx + JB_SI*4], esi lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */ mov [edx + JB_SP*4], ecx mov ecx, PCOFF[esp] /* Save PC we are returning to now. */ mov [edx + JB_IP*4], ecx ret /* * void * longjmp(jmp_buf env, int value); * * Parameters: * [ESP+04h] - jmp_buf setup by _setjmp * [ESP+08h] - int value to return * Registers: * None * Returns: * Doesn't return * Notes: * Non-local goto */ PUBLIC _longjmp _longjmp: mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */ mov eax, [esp + 8] /* Second argument is return value. */ /* Save the return address now. */ mov edx, [ecx + JB_IP*4] /* Restore registers. */ mov ebp, [ecx + JB_BP*4] mov ebx, [ecx + JB_BX*4] mov edi, [ecx + JB_DI*4] mov esi, [ecx + JB_SI*4] mov esp, [ecx + JB_SP*4] /* Jump to saved PC. */ jmp edx END