blob: 1a8fce3fd42cbb3e5784cd54da832434111c0485 (
plain)
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
|
/*
* This file is subject to the terms and conditions of the LGPL V2.1
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2018 Kalray Inc.
*/
#include <sysdep.h>
#define _SETJMP_H
#define _ASM
#include <bits/setjmp.h>
#include <libc-symbols.h>
/**
* Simply save the user context to $r0 (jmpbuf)
*
* This function has the following prototype:
* int __sigsetjmp (r0 = jmp_buf env, r1 = int savemask)
* At the end, we call sigjmp_save
* int __sigjmp_save (sigjmp_buf env, int savemask)
* which will save signal mask if needed (set by setjmp/_setjmp)
*
* NOTE: since r0 and r1 are used by __sigjmp_save, we must not
* clobber them during this function
*/
ENTRY(__sigsetjmp)
/* Save r20r21r22r23 */
so (JMPBUF_REGS_OFFSET + QUAD_REG_SIZE)[$r0] = $r20r21r22r23
get $r40 = $ra
;;
/* Save r24r25r26r27 */
so (JMPBUF_REGS_OFFSET + 2 * QUAD_REG_SIZE) [$r0] = $r24r25r26r27
get $r41 = $cs
;;
copyd $r36 = $sp
copyd $r37 = $r14
copyd $r38 = $r18
copyd $r39 = $r19
;;
/* Save r12(sp) r14 r18 r19 stored in $r36r37r38r39 */
so (JMPBUF_REGS_OFFSET)[$r0] = $r36r37r38r39
get $r32 = $lc
;;
/* Save r28r29r30r31 */
so (JMPBUF_REGS_OFFSET + 3 * QUAD_REG_SIZE) [$r0] = $r28r29r30r31
get $r33 = $le
;;
/* Save $cs and $ra */
sq JMPBUF_RA_CS_OFFSET[$r0] = $r40r41
get $r34 = $ls
;;
/* Save $lc, $le and $ls */
so JMPBUF_LC_LE_LS_OFFSET[$r0] = $r32r33r34r35
goto __sigjmp_save
;;
END(__sigsetjmp)
libc_hidden_def(__sigsetjmp)
|