summaryrefslogtreecommitdiffstats
path: root/usr/klibc/arch/riscv64/setjmp.S
blob: 66e009efa890e000ac72711d36f4584014f3dd28 (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
/*
 * arch/riscv64/setjmp.S
 *
 * setjmp/longjmp for the RISC-V (RV64) architecture
 *
 * The jmp_buf is assumed to contain the following, in order:
 *	pc (ra)
 *	s0..s11
 *	sp
 */

#include <machine/asm.h>

ENTRY(setjmp)
	sd	ra, 0(a0)
	sd	s0, 8(a0)
	sd	s1, 16(a0)
	sd	s2, 24(a0)
	sd	s3, 32(a0)
	sd	s4, 40(a0)
	sd	s5, 48(a0)
	sd	s6, 56(a0)
	sd	s7, 64(a0)
	sd	s8, 72(a0)
	sd	s9, 80(a0)
	sd	s10, 88(a0)
	sd	s11, 96(a0)
	sd	sp, 104(a0)
	mv	a0, zero
	jr	ra
END(setjmp)

ENTRY(longjmp)
	ld	ra, 0(a0)
	ld	s0, 8(a0)
	ld	s1, 16(a0)
	ld	s2, 24(a0)
	ld	s3, 32(a0)
	ld	s4, 40(a0)
	ld	s5, 48(a0)
	ld	s6, 56(a0)
	ld	s7, 64(a0)
	ld	s8, 72(a0)
	ld	s9, 80(a0)
	ld	s10, 88(a0)
	ld	s11, 96(a0)
	ld	sp, 104(a0)
	mv	a0, a1
	jr	ra
END(longjmp)