mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 04:11:30 +00:00
114 lines
2.5 KiB
ArmAsm
114 lines
2.5 KiB
ArmAsm
/*
|
|
* 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 <asm.inc>
|
|
|
|
#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
|