1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/* SPDX-License-Identifier: LGPL-2.1 */
/* SPDX-FileCopyrightText: 2021 Jules Maselbas <jmaselbas@kalray.eu>, Kalray Inc. */
#define REG_SIZE 8
#include <linux/linkage.h>
/* jmp_buf layout:
* [0] = $ra, $sp, $cs, $r14,
* [4] = $r20, $r21, $r22, $r23,
* [8] = $r24, $r25, $r26, $r27,
* [12] = $r28, $r29, $r30, $r31,
* [16] = $r18, $r19,
* [18] = $lc, $le, $ls, xxxx
*/
/**
* int initjmp(jmp_buf jmp, void __noreturn (*func)(void), void *stack_top);
*/
ENTRY(initjmp)
/* store $ra */
sd (0 * REG_SIZE)[$r0] = $r1
;;
/* store $sp */
sd (1 * REG_SIZE)[$r0] = $r2
make $r0 = 0
ret
;;
ENDPROC(initjmp)
/**
* int setjmp(jmp_buf jmp);
*/
ENTRY(setjmp)
sq (16 * REG_SIZE)[$r0] = $r18r19
get $r40 = $ra
copyd $r41 = $sp
;;
so (4 * REG_SIZE)[$r0] = $r20r21r22r23
get $r42 = $cs
copyd $r43 = $r14
;;
so (0 * REG_SIZE)[$r0] = $r40r41r42r43
get $r40 = $lc
;;
so (8 * REG_SIZE)[$r0] = $r24r25r26r27
get $r41 = $le
;;
so (12 * REG_SIZE)[$r0] = $r28r29r30r31
get $r42 = $ls
;;
so (18 * REG_SIZE)[$r0] = $r40r41r42r43
make $r0 = 0
ret
;;
ENDPROC(setjmp)
/**
* void longjmp(jmp_buf jmp, int ret);
*/
ENTRY(longjmp)
lo $r40r41r42r43 = (0 * REG_SIZE)[$r0]
;;
lo $r44r45r46r47 = (18 * REG_SIZE)[$r0]
set $ra = $r40
copyd $sp = $r41
;;
lo $r20r21r22r23 = (4 * REG_SIZE)[$r0]
set $cs = $r42
copyd $r14 = $r43
;;
lo $r24r25r26r27 = (8 * REG_SIZE)[$r0]
set $lc = $r44
;;
lo $r28r29r30r31 = (12 * REG_SIZE)[$r0]
set $le = $r45
;;
lq $r18r19 = (16 * REG_SIZE)[$r0]
set $ls = $r46
;;
/* According to man, if retval is equal to 0, then we should return 1 */
maxud $r0 = $r1, 1
ret
;;
ENDPROC(longjmp)
|