summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/csky/setjmp.S
blob: fb4b156c467d45eec7e4c5bb706287e3a8e87cb8 (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
60
61
62
/*
 * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd.
 *
 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
 * in this tarball.
 */

#include <sysdep.h>

ENTRY(__sigsetjmp)
	stw     sp, (a0, 0)
	stw     lr, (a0, 4)

	stw     l0, (a0, 8)
	stw     l1, (a0, 12)
	stw     l2, (a0, 16)
	stw     l3, (a0, 20)
	stw     l4, (a0, 24)
	stw     l5, (a0, 28)

#ifdef __CSKYABIV2__
	stw	l6, (a0, 32)
        stw	l7, (a0, 36)
        stw	l8, (a0, 40)
        stw	l9, (a0, 44)

        stw	r26, (a0, 48)
        stw	r27, (a0, 52)
        stw	gb,  (a0, 56)
        stw	r29, (a0, 60)
        stw	r30, (a0, 64)
        stw	tls, (a0, 68)
#else
	stw     gb, (a0, 32)
#endif

	subi	sp, 8
	stw	lr, (sp, 0)
	stw     gb, (sp, 4)
	__GET_GB
	__JSR(__sigjmp_save)
	ldw     gb, (sp, 4)
	ldw	lr, (sp, 0)
	addi	sp, 8
	rts
END(__sigsetjmp)

/* 
 * Support bsd-setjmp and bsd-_setjmp with tail-call method.
 * Use br to keep the lr-reg, we must return to the Caller not setjmp.
 * And we will rts by __sigsetjmp.
 */
ENTRY(setjmp)
	movi	a1, 1
	br	__sigsetjmp
END(setjmp)

ENTRY(_setjmp)
	movi	a1, 0
	br	__sigsetjmp
END(_setjmp)