[CRT]
[reactos.git] / reactos / lib / sdk / crt / setjmp / i386 / setjmp.s
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * PURPOSE: Implementation of _setjmp/longjmp
6 * FILE: lib/msvcrt/i386/setjmp.s
7 * PROGRAMMER: Ge van Geldorp (ge@gse.nl)
8 * NOTES: Implementation is not complete, see Wine source for a more
9 * complete implementation
10 */
11
12 #include <asm.inc>
13
14 #define JB_BP 0
15 #define JB_BX 1
16 #define JB_DI 2
17 #define JB_SI 3
18 #define JB_SP 4
19 #define JB_IP 5
20
21 #define PCOFF 0
22
23 #define JMPBUF 4
24
25 .code
26 /*
27 * int
28 * _setjmp(jmp_buf env);
29 *
30 * Parameters:
31 * [ESP+04h] - jmp_buf env
32 * Registers:
33 * None
34 * Returns:
35 * 0
36 * Notes:
37 * Sets up the jmp_buf
38 */
39 PUBLIC __setjmp
40 __setjmp:
41 xor eax, eax
42 mov edx, JMPBUF[esp]
43
44 /* Save registers. */
45 mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
46 mov [edx + JB_BX*4], ebx
47 mov [edx + JB_DI*4], edi
48 mov [edx + JB_SI*4], esi
49 lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
50 mov [edx + JB_SP*4], ecx
51 mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
52 mov [edx + JB_IP*4], ecx
53 ret
54
55 /*
56 * int
57 * _setjmp3(jmp_buf env, int nb_args, ...);
58 *
59 * Parameters:
60 * [ESP+04h] - jmp_buf env
61 * Registers:
62 * None
63 * Returns:
64 * 0
65 * Notes:
66 * Sets up the jmp_buf
67 */
68 PUBLIC __setjmp3
69 __setjmp3:
70 xor eax, eax
71 mov edx, JMPBUF[esp]
72
73 /* Save registers. */
74 mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
75 mov [edx + JB_BX*4], ebx
76 mov [edx + JB_DI*4], edi
77 mov [edx + JB_SI*4], esi
78 lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
79 mov [edx + JB_SP*4], ecx
80 mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
81 mov [edx + JB_IP*4], ecx
82 ret
83
84 /*
85 * void
86 * longjmp(jmp_buf env, int value);
87 *
88 * Parameters:
89 * [ESP+04h] - jmp_buf setup by _setjmp
90 * [ESP+08h] - int value to return
91 * Registers:
92 * None
93 * Returns:
94 * Doesn't return
95 * Notes:
96 * Non-local goto
97 */
98 PUBLIC _longjmp
99 _longjmp:
100 mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */
101
102 mov eax, [esp + 8] /* Second argument is return value. */
103 /* Save the return address now. */
104 mov edx, [ecx + JB_IP*4]
105 /* Restore registers. */
106 mov ebp, [ecx + JB_BP*4]
107 mov ebx, [ecx + JB_BX*4]
108 mov edi, [ecx + JB_DI*4]
109 mov esi, [ecx + JB_SI*4]
110 mov esp, [ecx + JB_SP*4]
111 /* Jump to saved PC. */
112 jmp edx
113
114 END