179 lines
5.2 KiB
Diff
179 lines
5.2 KiB
Diff
commit 738ee53f0ce5e39b9b7a6777f5d3057afbaac498
|
|
Author: John David Anglin <danglin@gcc.gnu.org>
|
|
Date: Tue Mar 15 23:12:37 2022 +0000
|
|
|
|
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.
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/hppa/swapcontext.S b/sysdeps/unix/sysv/linux/hppa/swapcontext.S
|
|
new file mode 100644
|
|
index 0000000000000000..94b164dc6375563e
|
|
--- /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 1664f68c7b9982e8..0000000000000000
|
|
--- 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)
|