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