Reintegrate header branch
[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 #define JB_BP 0
13 #define JB_BX 1
14 #define JB_DI 2
15 #define JB_SI 3
16 #define JB_SP 4
17 #define JB_IP 5
18
19 #define PCOFF 0
20
21 #define JMPBUF 4
22
23 /*
24 * int
25 * _setjmp(jmp_buf env);
26 *
27 * Parameters:
28 * [ESP+04h] - jmp_buf env
29 * Registers:
30 * None
31 * Returns:
32 * 0
33 * Notes:
34 * Sets up the jmp_buf
35 */
36 .globl __setjmp
37 __setjmp:
38 xorl %eax, %eax
39 movl JMPBUF(%esp), %edx
40
41 /* Save registers. */
42 movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */
43 movl %ebx, (JB_BX*4)(%edx)
44 movl %edi, (JB_DI*4)(%edx)
45 movl %esi, (JB_SI*4)(%edx)
46 leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */
47 movl %ecx, (JB_SP*4)(%edx)
48 movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */
49 movl %ecx, (JB_IP*4)(%edx)
50 ret
51
52 /*
53 * int
54 * _setjmp3(jmp_buf env, int nb_args, ...);
55 *
56 * Parameters:
57 * [ESP+04h] - jmp_buf env
58 * Registers:
59 * None
60 * Returns:
61 * 0
62 * Notes:
63 * Sets up the jmp_buf
64 */
65 .globl __setjmp3
66 __setjmp3:
67 xorl %eax, %eax
68 movl JMPBUF(%esp), %edx
69
70 /* Save registers. */
71 movl %ebp, (JB_BP*4)(%edx) /* Save caller's frame pointer. */
72 movl %ebx, (JB_BX*4)(%edx)
73 movl %edi, (JB_DI*4)(%edx)
74 movl %esi, (JB_SI*4)(%edx)
75 leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */
76 movl %ecx, (JB_SP*4)(%edx)
77 movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */
78 movl %ecx, (JB_IP*4)(%edx)
79 ret
80
81 #define VAL 8
82
83 /*
84 * void
85 * longjmp(jmp_buf env, int value);
86 *
87 * Parameters:
88 * [ESP+04h] - jmp_buf setup by _setjmp
89 * [ESP+08h] - int value to return
90 * Registers:
91 * None
92 * Returns:
93 * Doesn't return
94 * Notes:
95 * Non-local goto
96 */
97 .globl _longjmp
98 _longjmp:
99 movl JMPBUF(%esp), %ecx /* User's jmp_buf in %ecx. */
100
101 movl VAL(%esp), %eax /* Second argument is return value. */
102 /* Save the return address now. */
103 movl (JB_IP*4)(%ecx), %edx
104 /* Restore registers. */
105 movl (JB_BP*4)(%ecx), %ebp
106 movl (JB_BX*4)(%ecx), %ebx
107 movl (JB_DI*4)(%ecx), %edi
108 movl (JB_SI*4)(%ecx), %esi
109 movl (JB_SP*4)(%ecx), %esp
110 /* Jump to saved PC. */
111 jmp *%edx