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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
https://sourceware.org/git/?p=glibc.git;a=patch;h=738ee53f0ce5e39b9b7a6777f5d3057afbaac498
https://sourceware.org/git/?p=glibc.git;a=patch;h=d53b9cc391c72a1011ea8fe7a9f70dc5060a0db2
From 738ee53f0ce5e39b9b7a6777f5d3057afbaac498 Mon Sep 17 00:00:00 2001
From: John David Anglin <danglin@gcc.gnu.org>
Date: Tue, 15 Mar 2022 23:12:37 +0000
Subject: [PATCH] hppa: Implement swapcontext in assembler (bug 28960)
When swapcontext.c is compiled without -g, the following error occurs:
Error: CFI instruction used without previous .cfi_startproc
Fix by converting swapcontext routine to assembler.
---
sysdeps/unix/sysv/linux/hppa/swapcontext.S | 72 +++++++++++++++++++
sysdeps/unix/sysv/linux/hppa/swapcontext.c | 83 ----------------------
2 files changed, 72 insertions(+), 83 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/hppa/swapcontext.S
delete mode 100644 sysdeps/unix/sysv/linux/hppa/swapcontext.c
diff --git a/sysdeps/unix/sysv/linux/hppa/swapcontext.S b/sysdeps/unix/sysv/linux/hppa/swapcontext.S
new file mode 100644
index 0000000000..94b164dc63
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/swapcontext.S
@@ -0,0 +1,72 @@
+/* Swap to new context.
+ Copyright (C) 2008-2022 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include "ucontext_i.h"
+
+ .text
+ENTRY(__swapcontext)
+
+ /* Copy rp to ret0 (r28). */
+ copy %rp,%ret0
+
+ /* Create a frame. */
+ ldo 64(%sp),%sp
+ .cfi_def_cfa_offset -64
+
+ /* Save the current machine context to oucp. */
+ bl __getcontext,%rp
+
+ /* Copy oucp to register ret1 (r29). __getcontext saves and
+ restores it on a normal return. It is restored from oR29
+ on reactivation. */
+ copy %r26,%ret1
+
+ /* Pop frame. */
+ ldo -64(%sp),%sp
+ .cfi_def_cfa_offset 0
+
+ /* Load return pointer from oR28. */
+ ldw oR28(%ret1),%rp
+
+ /* Return if error. */
+ or,= %r0,%ret0,%r0
+ bv,n %r0(%rp)
+
+ /* Load sc_sar flag. */
+ ldb oSAR(%ret1),%r20
+
+ /* Return if oucp context has been reactivated. */
+ or,= %r0,%r20,%r0
+ bv,n %r0(%rp)
+
+ /* Mark sc_sar flag. */
+ ldi 1,%r20
+ stb %r20,oSAR(%ret1)
+
+ /* Activate the machine context in ucp. */
+ bl __setcontext,%rp
+ ldw oR25(%ret1),%r26
+
+ /* Load return pointer. */
+ ldw oR28(%ret1),%rp
+ bv,n %r0(%rp)
+
+PSEUDO_END(__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/hppa/swapcontext.c b/sysdeps/unix/sysv/linux/hppa/swapcontext.c
deleted file mode 100644
index 1664f68c7b..0000000000
--- a/sysdeps/unix/sysv/linux/hppa/swapcontext.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Swap to new context.
- Copyright (C) 2008-2021 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Helge Deller <deller@gmx.de>, 2008.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <ucontext.h>
-#include "ucontext_i.h"
-
-extern int __getcontext (ucontext_t *ucp);
-extern int __setcontext (const ucontext_t *ucp);
-
-int
-__swapcontext (ucontext_t *oucp, const ucontext_t *ucp)
-{
- /* Save rp for debugger. */
- asm ("stw %rp,-20(%sp)");
- asm (".cfi_offset 2, -20");
-
- /* Copy rp to ret0 (r28). */
- asm ("copy %rp,%ret0");
-
- /* Create a frame. */
- asm ("ldo 64(%sp),%sp");
- asm (".cfi_def_cfa_offset -64");
-
- /* Save the current machine context to oucp. */
- asm ("bl __getcontext,%rp");
-
- /* Copy oucp to register ret1 (r29). __getcontext saves and restores it
- on a normal return. It is restored from oR29 on reactivation. */
- asm ("copy %r26,%ret1");
-
- /* Pop frame. */
- asm ("ldo -64(%sp),%sp");
- asm (".cfi_def_cfa_offset 0");
-
- /* Load return pointer from oR28. */
- asm ("ldw %0(%%ret1),%%rp" : : "i" (oR28));
-
- /* Return if error. */
- asm ("or,= %r0,%ret0,%r0");
- asm ("bv,n %r0(%rp)");
-
- /* Load sc_sar flag. */
- asm ("ldb %0(%%ret1),%%r20" : : "i" (oSAR));
-
- /* Return if oucp context has been reactivated. */
- asm ("or,= %r0,%r20,%r0");
- asm ("bv,n %r0(%rp)");
-
- /* Mark sc_sar flag. */
- asm ("1: ldi 1,%r20");
- asm ("stb %%r20,%0(%%ret1)" : : "i" (oSAR));
-
- /* Activate the machine context in ucp. */
- asm ("bl __setcontext,%rp");
- asm ("ldw %0(%%ret1),%%r26" : : "i" (oR25));
-
- /* Load return pointer. */
- asm ("ldw %0(%%ret1),%%rp" : : "i" (oR28));
-
- /* A successful call to setcontext does not return. */
- asm ("bv,n %r0(%rp)");
-
- /* Make gcc happy. */
- return 0;
-}
-
-weak_alias (__swapcontext, swapcontext)
--
2.27.0
From d53b9cc391c72a1011ea8fe7a9f70dc5060a0db2 Mon Sep 17 00:00:00 2001
From: John David Anglin <danglin@gcc.gnu.org>
Date: Tue, 15 Mar 2022 23:04:39 +0000
Subject: [PATCH] hppa: Use END instead of PSEUDO_END in swapcontext.S
(cherry picked from commit 7a5c440102d4ec7fafd9bbd98eca9bd90ecaaafd)
---
sysdeps/unix/sysv/linux/hppa/swapcontext.S | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sysdeps/unix/sysv/linux/hppa/swapcontext.S b/sysdeps/unix/sysv/linux/hppa/swapcontext.S
index 94b164dc63..fbc22586d1 100644
--- a/sysdeps/unix/sysv/linux/hppa/swapcontext.S
+++ b/sysdeps/unix/sysv/linux/hppa/swapcontext.S
@@ -67,6 +67,6 @@ ENTRY(__swapcontext)
ldw oR28(%ret1),%rp
bv,n %r0(%rp)
-PSEUDO_END(__swapcontext)
+END(__swapcontext)
weak_alias (__swapcontext, swapcontext)
--
2.27.0
|