1/* Copyright (C) 2004-2022 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library. If not, see
16 <https://www.gnu.org/licenses/>. */
17
18#include <sysdep.h>
19#include <ucontext-offsets.h>
20
21
22ENTRY(__makecontext)
23 ldgp $29, 0($27)
24#ifdef PROF
25 .set noat
26 lda AT, _mcount
27 jsr AT, (AT), _mcount
28 .set at
29#endif
30 .prologue 1
31
32 /* Compute top of stack, including arguments. */
33 ldq $1, UC_STACK+SS_SP($16)
34 ldq $2, UC_STACK+SS_SIZE($16)
35 addq $1, $2, $8
36 subq $18, 6, $1
37 cmovlt $1, 0, $1
38 s8addq $1, 0, $2
39 subq $8, $2, $8
40
41 /* Copy all parameters. Switch statement header here. */
42 ldah $3, $jumptable($29) !gprelhigh
43 cmple $18, 6, $1
44 mov $18, $2
45 cmoveq $1, 7, $2
46 s4addq $2, $3, $3
47 ldl $4, $jumptable($3) !gprellow
48 addq $4, $29, $4
49 jmp $31, ($4), $args1
50
51 .section .rodata
52 .align 2
53$jumptable:
54 .gprel32 $args0
55 .gprel32 $args1
56 .gprel32 $args2
57 .gprel32 $args3
58 .gprel32 $args4
59 .gprel32 $args5
60 .gprel32 $args6
61 .gprel32 $argsN
62 .text
63
64 /* Here we process arguments 7 through N. This is a straight
65 stack-to-stack copy. */
66 .align 4
67$argsN:
68 subq $18, 6, $1
69 lda $2, 0($8)
70 lda $3, 3*8($30)
71 .align 4
721:
73 ldq $0, 0($3)
74 subq $1, 1, $1
75 lda $3, 8($3)
76 stq $0, 0($2)
77 lda $2, 8($2)
78 bne $1, 1b
79
80 /* Here we process arguments 6 through 0. This involves
81 copying into the register save areas of the ucontext. */
82 .align 4
83$args6:
84 ldq $0, 2*8($30)
85 stq $0, UC_SIGCTX+SC_REGS+21*8($16)
86 unop
87 stq $0, UC_SIGCTX+SC_FPREGS+21*8($16)
88$args5:
89 ldq $0, 1*8($30)
90 stq $0, UC_SIGCTX+SC_REGS+20*8($16)
91 unop
92 stq $0, UC_SIGCTX+SC_FPREGS+20*8($16)
93$args4:
94 ldq $0, 0*8($30)
95 stq $0, UC_SIGCTX+SC_REGS+19*8($16)
96 unop
97 stq $0, UC_SIGCTX+SC_FPREGS+19*8($16)
98$args3:
99 unop
100 stq $21, UC_SIGCTX+SC_REGS+18*8($16)
101 unop
102 stt $f21, UC_SIGCTX+SC_FPREGS+18*8($16)
103$args2:
104 unop
105 stq $20, UC_SIGCTX+SC_REGS+17*8($16)
106 unop
107 stt $f20, UC_SIGCTX+SC_FPREGS+17*8($16)
108$args1:
109 unop
110 stq $19, UC_SIGCTX+SC_REGS+16*8($16)
111 unop
112 stt $f19, UC_SIGCTX+SC_FPREGS+16*8($16)
113$args0:
114
115 /* Set up the registers ready to invoke __startcontext.
116 We seed $27 with the target function address, and $9
117 with the link from ucp. */
118 ldah $0, __startcontext($29) !gprelhigh
119 ldq $1, UC_LINK($16)
120 lda $0, __startcontext($0) !gprellow
121 stq $17, UC_SIGCTX+SC_REGS+27*8($16)
122 stq $8, UC_SIGCTX+SC_REGS+30*8($16)
123 stq $0, UC_SIGCTX+SC_PC($16)
124 stq $1, UC_SIGCTX+SC_REGS+9*8($16)
125
126 /* No return value from makecontext. */
127 ret
128
129END(__makecontext)
130weak_alias (__makecontext, makecontext)
131
132/* This function is where a new makecontext "thread" begins life.
133 We have already set up $27 for calling the target function, and
134 we've set $9 to the UC_LINK of the parent context.
135
136 If the function returns, we either jump to the linked context
137 (if non-null) or exit. */
138
139 .align 4
140 .ent __startcontext
141__startcontext:
142 .frame $31, 0, $31, 0
143 .prologue 0
144
145 jsr $26, ($27), 0
146 ldgp $29, 0($26)
147 mov $9, $16
148 beq $9, 1f
149
150#ifdef PIC
151 bsr $26, __setcontext !samegp
1521: mov $31, $16
153 bsr $26, HIDDEN_JUMPTARGET(exit) !samegp
154#else
155 jsr $26, __setcontext
156 ldgp $29, 0($26)
1571: mov $31, $16
158 jsr $26, HIDDEN_JUMPTARGET(exit)
159#endif
160
161 halt
162
163 .end __startcontext
164

source code of glibc/sysdeps/unix/sysv/linux/alpha/makecontext.S