1/* Set saved user context to current context.  C-SKY ABIV2 version.
2   Copyright (C) 2018-2022 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4
5   The GNU C Library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
10   The GNU C Library is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with the GNU C Library.  If not, see
17   <https://www.gnu.org/licenses/>.  */
18
19#include <sysdep.h>
20
21#include "ucontext_i.h"
22
23/* int setcontext (const ucontext_t *ucp) */
24
25ENTRY (__setcontext)
26	mov	t0, a0
27	subi	sp, 8
28	stw	a0, (sp, 0)
29
30	/* Set sigmask.  */
31	movi	a0, SIG_SETMASK
32	addi	a1, t0, UCONTEXT_SIGMASK
33	movi	a2, 0
34
35	/* Do sigprocmask syscall.  */
36#ifdef __PIC__
37	subi	sp, 8
38	stw	gb, (sp, 0)
39	grs	gb, .Lgetpc1
40.Lgetpc1:
41	lrw	a3, .Lgetpc1@GOTPC
42	addu	gb, gb, a3
43	lrw	a3, __sigprocmask@PLT
44	ldr.w	a3, (gb, a3 << 0)
45	jsr	a3
46	ldw	gb, (sp, 0)
47	addi	sp, 8
48#else
49	jsri	__sigprocmask
50#endif /* __PIC__ */
51
52	ldw	t0, (sp, 0)
53	addi	sp, 8
54	/* Set r0-r11. Load a0-a3, for makecontext requires.  */
55	addi	t1, t0, MCONTEXT_CSKY_A0
56	ldm	r0-r11, (t1)
57	ldw	sp, (t0, MCONTEXT_CSKY_SP)	/* Load sp.  */
58	ldw	r15, (t0, MCONTEXT_CSKY_LR)	/* Load lr.  */
59	ldw	t0, (t0, MCONTEXT_CSKY_PC)	/* Load start addr.  */
60	jmp	t0
61END (setcontext)
62weak_alias (__setcontext, setcontext)
63
64ENTRY (__startcontext)
65	.cfi_label .Ldummy
66	cfi_undefined (lr)
67	mov	a0, r9
68	cmpnei	r9, 0	/* r9 was set in makecontext.  */
69	bf	1f	/* null, then exit.  */
70
71	/* Call setcontext.  */
72#ifdef __PIC__
73	grs	t1, .Lgetpc2
74.Lgetpc2:
75	lrw	t0, .Lgetpc2@GOTPC
76	addu	t1, t1, t0
77	lrw	t0, __setcontext@GOT
78	ldr.w	t0, (t1, t0 << 0)
79#else
80	lrw	t0, __setcontext
81#endif
82	jsr	t0
83
841:
85	/* Call _exit.  */
86#ifdef __PIC__
87	grs	t1, .Lgetpc3
88.Lgetpc3:
89	lrw	t0, .Lgetpc3@GOTPC
90	addu	t1, t1, t0
91	lrw	t0, _exit@GOT
92	ldr.w	t0, (t1, t0 << 0)
93#else
94	lrw	t0, _exit
95#endif
96	jsr	t0
97
98END (__startcontext)
99