tangled
alpha
login
or
join now
huwcampbell.com
/
reactos
0
fork
atom
Reactos
0
fork
atom
overview
issues
pulls
pipelines
[CRT] Cleanup old setjmp
Timo Kreuzer
7 months ago
f18ebe2b
6d321562
-366
6 changed files
expand all
collapse all
unified
split
sdk
lib
crt
crt.cmake
libcntpr.cmake
setjmp
amd64
setjmp.s
arm
setjmp.s
i386
setjmp.s
setjmp.cmake
-1
sdk/lib/crt/crt.cmake
···
23
23
24
24
list(APPEND CRT_ASM_SOURCE
25
25
${CRT_EXCEPT_ASM_SOURCE}
26
26
-
${CRT_SETJMP_ASM_SOURCE}
27
26
${CRT_STDLIB_ASM_SOURCE}
28
27
${CRT_STRING_ASM_SOURCE}
29
28
${CRT_WINE_ASM_SOURCE}
-1
sdk/lib/crt/libcntpr.cmake
···
18
18
${LIBCNTPR_FLOAT_ASM_SOURCE}
19
19
${LIBCNTPR_MATH_ASM_SOURCE}
20
20
${LIBCNTPR_MEM_ASM_SOURCE}
21
21
-
${LIBCNTPR_SETJMP_ASM_SOURCE}
22
21
${LIBCNTPR_STRING_ASM_SOURCE}
23
22
)
24
23
-169
sdk/lib/crt/setjmp/amd64/setjmp.s
···
1
1
-
/*
2
2
-
* COPYRIGHT: See COPYING in the top level directory
3
3
-
* PROJECT: ReactOS system libraries
4
4
-
* PURPOSE: Implementation of _setjmp/longjmp
5
5
-
* FILE: lib/sdk/crt/setjmp/amd64/setjmp.s
6
6
-
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7
7
-
*/
8
8
-
9
9
-
/* INCLUDES ******************************************************************/
10
10
-
11
11
-
#include <asm.inc>
12
12
-
#include <ksamd64.inc>
13
13
-
14
14
-
#define JUMP_BUFFER_Frame 0 /* 0x00 */
15
15
-
#define JUMP_BUFFER_Rbx 8 /* 0x08 */
16
16
-
#define JUMP_BUFFER_Rsp 16 /* 0x10 */
17
17
-
#define JUMP_BUFFER_Rbp 24 /* 0x18 */
18
18
-
#define JUMP_BUFFER_Rsi 32 /* 0x20 */
19
19
-
#define JUMP_BUFFER_Rdi 40 /* 0x28 */
20
20
-
#define JUMP_BUFFER_R12 48 /* 0x30 */
21
21
-
#define JUMP_BUFFER_R13 56 /* 0x38 */
22
22
-
#define JUMP_BUFFER_R14 64 /* 0x40 */
23
23
-
#define JUMP_BUFFER_R15 72 /* 0x48 */
24
24
-
#define JUMP_BUFFER_Rip 80 /* 0x50 */
25
25
-
#define JUMP_BUFFER_Spare 88 /* 0x58 */
26
26
-
#define JUMP_BUFFER_Xmm6 96 /* 0x60 */
27
27
-
#define JUMP_BUFFER_Xmm7 112 /* 0x70 */
28
28
-
#define JUMP_BUFFER_Xmm8 128 /* 0x80 */
29
29
-
#define JUMP_BUFFER_Xmm9 144 /* 0x90 */
30
30
-
#define JUMP_BUFFER_Xmm10 160 /* 0xa0 */
31
31
-
#define JUMP_BUFFER_Xmm11 176 /* 0xb0 */
32
32
-
#define JUMP_BUFFER_Xmm12 192 /* 0xc0 */
33
33
-
#define JUMP_BUFFER_Xmm13 208 /* 0xd0 */
34
34
-
#define JUMP_BUFFER_Xmm14 224 /* 0xe0 */
35
35
-
#define JUMP_BUFFER_Xmm15 240 /* 0xf0 */
36
36
-
37
37
-
38
38
-
/* FUNCTIONS ******************************************************************/
39
39
-
.code64
40
40
-
41
41
-
/*!
42
42
-
* int _setjmp(jmp_buf env);
43
43
-
*
44
44
-
* \param <rcx> - jmp_buf env
45
45
-
* \return 0
46
46
-
* \note Sets up the jmp_buf
47
47
-
*/
48
48
-
PUBLIC _setjmp
49
49
-
FUNC _setjmp
50
50
-
51
51
-
.endprolog
52
52
-
53
53
-
/* Load rsp as it was before the call into rax */
54
54
-
lea rax, [rsp + 8]
55
55
-
/* Load return address into r8 */
56
56
-
mov r8, [rsp]
57
57
-
mov qword ptr [rcx + JUMP_BUFFER_Frame], 0
58
58
-
mov [rcx + JUMP_BUFFER_Rbx], rbx
59
59
-
mov [rcx + JUMP_BUFFER_Rbp], rbp
60
60
-
mov [rcx + JUMP_BUFFER_Rsi], rsi
61
61
-
mov [rcx + JUMP_BUFFER_Rdi], rdi
62
62
-
mov [rcx + JUMP_BUFFER_R12], r12
63
63
-
mov [rcx + JUMP_BUFFER_R13], r13
64
64
-
mov [rcx + JUMP_BUFFER_R14], r14
65
65
-
mov [rcx + JUMP_BUFFER_R15], r15
66
66
-
mov [rcx + JUMP_BUFFER_Rsp], rax
67
67
-
mov [rcx + JUMP_BUFFER_Rip], r8
68
68
-
movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6
69
69
-
movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7
70
70
-
movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8
71
71
-
movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9
72
72
-
movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10
73
73
-
movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11
74
74
-
movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12
75
75
-
movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13
76
76
-
movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14
77
77
-
movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15
78
78
-
xor rax, rax
79
79
-
ret
80
80
-
ENDFUNC
81
81
-
82
82
-
/*!
83
83
-
* int _setjmpex(jmp_buf _Buf,void *_Ctx);
84
84
-
*
85
85
-
* \param <rcx> - jmp_buf env
86
86
-
* \param <rdx> - frame
87
87
-
* \return 0
88
88
-
* \note Sets up the jmp_buf
89
89
-
*/
90
90
-
PUBLIC _setjmpex
91
91
-
FUNC _setjmpex
92
92
-
93
93
-
.endprolog
94
94
-
95
95
-
/* Load rsp as it was before the call into rax */
96
96
-
lea rax, [rsp + 8]
97
97
-
/* Load return address into r8 */
98
98
-
mov r8, [rsp]
99
99
-
mov [rcx + JUMP_BUFFER_Frame], rdx
100
100
-
mov [rcx + JUMP_BUFFER_Rbx], rbx
101
101
-
mov [rcx + JUMP_BUFFER_Rbp], rbp
102
102
-
mov [rcx + JUMP_BUFFER_Rsi], rsi
103
103
-
mov [rcx + JUMP_BUFFER_Rdi], rdi
104
104
-
mov [rcx + JUMP_BUFFER_R12], r12
105
105
-
mov [rcx + JUMP_BUFFER_R13], r13
106
106
-
mov [rcx + JUMP_BUFFER_R14], r14
107
107
-
mov [rcx + JUMP_BUFFER_R15], r15
108
108
-
mov [rcx + JUMP_BUFFER_Rsp], rax
109
109
-
mov [rcx + JUMP_BUFFER_Rip], r8
110
110
-
movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6
111
111
-
movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7
112
112
-
movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8
113
113
-
movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9
114
114
-
movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10
115
115
-
movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11
116
116
-
movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12
117
117
-
movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13
118
118
-
movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14
119
119
-
movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15
120
120
-
xor rax, rax
121
121
-
ret
122
122
-
ENDFUNC
123
123
-
124
124
-
125
125
-
/*!
126
126
-
* void longjmp(jmp_buf env, int value);
127
127
-
*
128
128
-
* \param <rcx> - jmp_buf setup by _setjmp
129
129
-
* \param <rdx> - int value to return
130
130
-
* \return Doesn't return
131
131
-
* \note Non-local goto
132
132
-
*/
133
133
-
PUBLIC longjmp
134
134
-
FUNC longjmp
135
135
-
136
136
-
.endprolog
137
137
-
138
138
-
// FIXME: handle frame
139
139
-
140
140
-
mov rbx, [rcx + JUMP_BUFFER_Rbx]
141
141
-
mov rbp, [rcx + JUMP_BUFFER_Rbp]
142
142
-
mov rsi, [rcx + JUMP_BUFFER_Rsi]
143
143
-
mov rdi, [rcx + JUMP_BUFFER_Rdi]
144
144
-
mov r12, [rcx + JUMP_BUFFER_R12]
145
145
-
mov r13, [rcx + JUMP_BUFFER_R13]
146
146
-
mov r14, [rcx + JUMP_BUFFER_R14]
147
147
-
mov r15, [rcx + JUMP_BUFFER_R15]
148
148
-
mov rsp, [rcx + JUMP_BUFFER_Rsp]
149
149
-
mov r8, [rcx + JUMP_BUFFER_Rip]
150
150
-
movdqa xmm6, [rcx + JUMP_BUFFER_Xmm6]
151
151
-
movdqa xmm7, [rcx + JUMP_BUFFER_Xmm7]
152
152
-
movdqa xmm8, [rcx + JUMP_BUFFER_Xmm8]
153
153
-
movdqa xmm9, [rcx + JUMP_BUFFER_Xmm9]
154
154
-
movdqa xmm10, [rcx + JUMP_BUFFER_Xmm10]
155
155
-
movdqa xmm11, [rcx + JUMP_BUFFER_Xmm11]
156
156
-
movdqa xmm12, [rcx + JUMP_BUFFER_Xmm12]
157
157
-
movdqa xmm13, [rcx + JUMP_BUFFER_Xmm13]
158
158
-
movdqa xmm14, [rcx + JUMP_BUFFER_Xmm14]
159
159
-
movdqa xmm15, [rcx + JUMP_BUFFER_Xmm15]
160
160
-
161
161
-
/* return param2 or 1 if it was 0 */
162
162
-
mov rax, rdx
163
163
-
test rax, rax
164
164
-
jnz l2
165
165
-
inc rax
166
166
-
l2: jmp r8
167
167
-
ENDFUNC
168
168
-
169
169
-
END
-64
sdk/lib/crt/setjmp/arm/setjmp.s
···
1
1
-
/*
2
2
-
* COPYRIGHT: BSD - See COPYING.ARM in the top level directory
3
3
-
* PROJECT: ReactOS CRT library
4
4
-
* PURPOSE: Implementation of _setjmp / longjmp
5
5
-
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
6
6
-
*/
7
7
-
8
8
-
/* INCLUDES ******************************************************************/
9
9
-
10
10
-
#include <kxarm.h>
11
11
-
12
12
-
/* CODE **********************************************************************/
13
13
-
TEXTAREA
14
14
-
15
15
-
LEAF_ENTRY _setjmpex
16
16
-
17
17
-
/* Store r1 (->Frame) and r4 - r11 */
18
18
-
stmia r0!, {r1,r4-r11}
19
19
-
20
20
-
/* Store sp (->Sp), lr (->Pc), fp (->Fpscr) */
21
21
-
mov r1, sp
22
22
-
stmia r0!, {r1,lr,fp}
23
23
-
24
24
-
/* Store NEON registers */
25
25
-
vst1.64 {d0}, [r0]!
26
26
-
vst1.64 {d1}, [r0]!
27
27
-
vst1.64 {d2}, [r0]!
28
28
-
vst1.64 {d3}, [r0]!
29
29
-
vst1.64 {d4}, [r0]!
30
30
-
vst1.64 {d5}, [r0]!
31
31
-
vst1.64 {d6}, [r0]!
32
32
-
vst1.64 {d7}, [r0]!
33
33
-
34
34
-
/* Return 0 */
35
35
-
mov r0, #0
36
36
-
bx lr
37
37
-
LEAF_END _setjmpex
38
38
-
39
39
-
IMPORT _setjmp, WEAK _setjmpex
40
40
-
IMPORT setjmp, WEAK _setjmpex
41
41
-
42
42
-
LEAF_ENTRY longjmp
43
43
-
44
44
-
ldmia r0!, {r1,r4-r11}
45
45
-
ldmia r0!, {r1,lr,fp}
46
46
-
mov sp, r1
47
47
-
48
48
-
/* Load NEON registers */
49
49
-
vld1.64 {d0}, [r0]!
50
50
-
vld1.64 {d1}, [r0]!
51
51
-
vld1.64 {d2}, [r0]!
52
52
-
vld1.64 {d3}, [r0]!
53
53
-
vld1.64 {d4}, [r0]!
54
54
-
vld1.64 {d5}, [r0]!
55
55
-
vld1.64 {d6}, [r0]!
56
56
-
vld1.64 {d7}, [r0]!
57
57
-
58
58
-
/* Return 1 */
59
59
-
mov r0, #1
60
60
-
bx lr
61
61
-
LEAF_END longjmp
62
62
-
63
63
-
END
64
64
-
/* EOF */
-113
sdk/lib/crt/setjmp/i386/setjmp.s
···
1
1
-
/*
2
2
-
* COPYRIGHT: See COPYING in the top level directory
3
3
-
* PROJECT: ReactOS system libraries
4
4
-
* PURPOSE: Implementation of _setjmp/longjmp
5
5
-
* FILE: lib/sdk/crt/setjmp/i386/setjmp.s
6
6
-
* PROGRAMMER: Ge van Geldorp (ge@gse.nl)
7
7
-
* NOTES: Implementation is not complete, see Wine source for a more
8
8
-
* complete implementation
9
9
-
*/
10
10
-
11
11
-
#include <asm.inc>
12
12
-
13
13
-
#define JB_BP 0
14
14
-
#define JB_BX 1
15
15
-
#define JB_DI 2
16
16
-
#define JB_SI 3
17
17
-
#define JB_SP 4
18
18
-
#define JB_IP 5
19
19
-
20
20
-
#define PCOFF 0
21
21
-
22
22
-
#define JMPBUF 4
23
23
-
24
24
-
.code
25
25
-
/*
26
26
-
* int
27
27
-
* _setjmp(jmp_buf env);
28
28
-
*
29
29
-
* Parameters:
30
30
-
* [ESP+04h] - jmp_buf env
31
31
-
* Registers:
32
32
-
* None
33
33
-
* Returns:
34
34
-
* 0
35
35
-
* Notes:
36
36
-
* Sets up the jmp_buf
37
37
-
*/
38
38
-
PUBLIC __setjmp
39
39
-
__setjmp:
40
40
-
xor eax, eax
41
41
-
mov edx, JMPBUF[esp]
42
42
-
43
43
-
/* Save registers. */
44
44
-
mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
45
45
-
mov [edx + JB_BX*4], ebx
46
46
-
mov [edx + JB_DI*4], edi
47
47
-
mov [edx + JB_SI*4], esi
48
48
-
lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
49
49
-
mov [edx + JB_SP*4], ecx
50
50
-
mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
51
51
-
mov [edx + JB_IP*4], ecx
52
52
-
ret
53
53
-
54
54
-
/*
55
55
-
* int
56
56
-
* _setjmp3(jmp_buf env, int nb_args, ...);
57
57
-
*
58
58
-
* Parameters:
59
59
-
* [ESP+04h] - jmp_buf env
60
60
-
* Registers:
61
61
-
* None
62
62
-
* Returns:
63
63
-
* 0
64
64
-
* Notes:
65
65
-
* Sets up the jmp_buf
66
66
-
*/
67
67
-
PUBLIC __setjmp3
68
68
-
__setjmp3:
69
69
-
xor eax, eax
70
70
-
mov edx, JMPBUF[esp]
71
71
-
72
72
-
/* Save registers. */
73
73
-
mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
74
74
-
mov [edx + JB_BX*4], ebx
75
75
-
mov [edx + JB_DI*4], edi
76
76
-
mov [edx + JB_SI*4], esi
77
77
-
lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
78
78
-
mov [edx + JB_SP*4], ecx
79
79
-
mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
80
80
-
mov [edx + JB_IP*4], ecx
81
81
-
ret
82
82
-
83
83
-
/*
84
84
-
* void
85
85
-
* longjmp(jmp_buf env, int value);
86
86
-
*
87
87
-
* Parameters:
88
88
-
* [ESP+04h] - jmp_buf setup by _setjmp
89
89
-
* [ESP+08h] - int value to return
90
90
-
* Registers:
91
91
-
* None
92
92
-
* Returns:
93
93
-
* Doesn't return
94
94
-
* Notes:
95
95
-
* Non-local goto
96
96
-
*/
97
97
-
PUBLIC _longjmp
98
98
-
_longjmp:
99
99
-
mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */
100
100
-
101
101
-
mov eax, [esp + 8] /* Second argument is return value. */
102
102
-
/* Save the return address now. */
103
103
-
mov edx, [ecx + JB_IP*4]
104
104
-
/* Restore registers. */
105
105
-
mov ebp, [ecx + JB_BP*4]
106
106
-
mov ebx, [ecx + JB_BX*4]
107
107
-
mov edi, [ecx + JB_DI*4]
108
108
-
mov esi, [ecx + JB_SI*4]
109
109
-
mov esp, [ecx + JB_SP*4]
110
110
-
/* Jump to saved PC. */
111
111
-
jmp edx
112
112
-
113
113
-
END
-18
sdk/lib/crt/setjmp/setjmp.cmake
···
1
1
-
2
2
-
if(ARCH STREQUAL "i386")
3
3
-
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
4
4
-
setjmp/i386/setjmp.s
5
5
-
)
6
6
-
elseif(ARCH STREQUAL "amd64")
7
7
-
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
8
8
-
setjmp/amd64/setjmp.s
9
9
-
)
10
10
-
elseif(ARCH STREQUAL "arm")
11
11
-
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
12
12
-
setjmp/arm/setjmp.s
13
13
-
)
14
14
-
endif()
15
15
-
16
16
-
list(APPEND CRT_SETJMP_ASM_SOURCE
17
17
-
${LIBCNTPR_SETJMP_ASM_SOURCE}
18
18
-
)