summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2016-05-23 03:38:00 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2016-05-24 20:39:09 +0200
commit2559592659fe8225fc7d67fa5bc83a1589819054 (patch)
treedb0d5cbc4264a75600b920db4138c09418906159 /libc
parentb1fb0d0bf5d09bf9dbdbc320814bd087d4d26460 (diff)
microblaze: fix setjmp/longjmp
Sync mostly with GNU libc implementation of setjmp/longjmp. Just generate PIC compatible code, so no difference for static builds are made. Add sysdep.h with some handy assembly macros used inside setjmp.S/__longjmp.S. This unbreaks dynamic linker support, first test suite run only shows 10 errors, which doesn't look so bad.
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/microblaze/__longjmp.S92
-rw-r--r--libc/sysdeps/linux/microblaze/setjmp.S43
-rw-r--r--libc/sysdeps/linux/microblaze/sysdep.h25
3 files changed, 89 insertions, 71 deletions
diff --git a/libc/sysdeps/linux/microblaze/__longjmp.S b/libc/sysdeps/linux/microblaze/__longjmp.S
index c7fce3435..0e0e2f45e 100644
--- a/libc/sysdeps/linux/microblaze/__longjmp.S
+++ b/libc/sysdeps/linux/microblaze/__longjmp.S
@@ -1,45 +1,51 @@
-/*
- * libc/sysdeps/linux/microblaze/longjmp.S -- `longjmp' for microblaze
- *
- * Copyright (C) 2003 John Williams <jwilliams@itee.uq.edu.au>
- * Copyright (C) 2001 NEC Corporation
- * Copyright (C) 2001 Miles Bader <miles@gnu.org>
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License. See the file COPYING.LIB in the main
- * directory of this archive for more details.
- *
- * Written by Miles Bader <miles@gnu.org>
- */
-
-#include <libc-symbols.h>
-
- .text
- .globl C_SYMBOL_NAME(__longjmp)
- .align 4
-C_SYMBOL_NAME(__longjmp):
- /* load registers from memory to r5 (arg0) */
- lwi r1, r5, 0
- lwi r15, r5, 4
- lwi r2, r5, 8
- lwi r13, r5, 12
- lwi r18, r5, 16
- lwi r19, r5, 20
- lwi r20, r5, 24
- lwi r21, r5, 28
- lwi r22, r5, 32
- lwi r23, r5, 36
- lwi r24, r5, 40
- lwi r25, r5, 44
- lwi r26, r5, 48
- lwi r27, r5, 52
- lwi r28, r5, 56
- lwi r29, r5, 60
- lwi r30, r5, 64
- lwi r31, r5, 68
-
- addi r3, r0, 1 /* return val */
- rtsd r15, 8 /* normal return */
- nop
+/* Copyright (C) 1997-2016 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ENTRY(__longjmp)
+
+ lwi r1, r5, 0
+ lwi r15, r5, 4
+ lwi r2, r5, 8
+ lwi r13, r5, 12
+ lwi r18, r5, 16
+ lwi r19, r5, 20
+ lwi r20, r5, 24
+ lwi r21, r5, 28
+ lwi r22, r5, 32
+ lwi r23, r5, 36
+ lwi r24, r5, 40
+ lwi r25, r5, 44
+ lwi r26, r5, 48
+ lwi r27, r5, 52
+ lwi r28, r5, 56
+ lwi r29, r5, 60
+ lwi r30, r5, 64
+ lwi r31, r5, 68
+
+ addk r3,r6,r0
+ beqi r3,L(return_1)
+ rtsd r15,8
+ nop
+L(return_1):
+ rtsd r15,8
+ addik r3,r0,1 /* delay slot. */
+
+END(__longjmp)
libc_hidden_def(__longjmp)
diff --git a/libc/sysdeps/linux/microblaze/setjmp.S b/libc/sysdeps/linux/microblaze/setjmp.S
index 3c1d8a1dd..b40850cae 100644
--- a/libc/sysdeps/linux/microblaze/setjmp.S
+++ b/libc/sysdeps/linux/microblaze/setjmp.S
@@ -28,27 +28,21 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <libc-symbols.h>
+#include <sysdep.h>
- .text
- .globl C_SYMBOL_NAME(setjmp)
- .align 4
-C_SYMBOL_NAME(setjmp):
-#ifdef __PIC__
- brid 1f
-#else
- braid C_SYMBOL_NAME(__sigsetjmp)
-#endif
- addi r6, r0, 1 /* Save the signal mask. */
+ENTRY(_setjmp)
+ addik r6, r0, 0
+END(_setjmp)
+libc_hidden_def(_setjmp)
- .globl C_SYMBOL_NAME(_setjmp)
-C_SYMBOL_NAME(_setjmp):
- and r6, r0, r0 /* Don't save the signal mask. */
+ENTRY(setjmp)
+ brid 1f
+ addik r6, r0, 1
+END(setjmp)
+libc_hidden_def(setjmp)
- .globl C_SYMBOL_NAME(__sigsetjmp)
-C_SYMBOL_NAME(__sigsetjmp):
+ENTRY(__sigsetjmp)
1:
- /* Save registers relative to r5 (arg0)*/
swi r1, r5, 0 /* stack pointer */
swi r15, r5, 4 /* link register */
swi r2, r5, 8 /* SDA and SDA2 ptrs */
@@ -68,14 +62,7 @@ C_SYMBOL_NAME(__sigsetjmp):
swi r30, r5, 64
swi r31, r5, 68
- /* Make a tail call to __sigjmp_save; it takes the same args. */
-#ifdef __PIC__
- mfs r12,rpc
- addik r12,r12,_GLOBAL_OFFSET_TABLE_+8
- lwi r12,r12,__sigjmp_save@GOT
- brad r12
- nop
-#else
- braid C_SYMBOL_NAME(__sigjmp_save)
- nop
-#endif
+ bri __sigjmp_save
+
+END(__sigsetjmp)
+libc_hidden_def(__sigsetjmp)
diff --git a/libc/sysdeps/linux/microblaze/sysdep.h b/libc/sysdeps/linux/microblaze/sysdep.h
new file mode 100644
index 000000000..1f01a2a1d
--- /dev/null
+++ b/libc/sysdeps/linux/microblaze/sysdep.h
@@ -0,0 +1,25 @@
+#include <common/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+/* Syntactic details of assembler. */
+
+# define ALIGNARG(log2) log2
+# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* Define an entry point visible from C. */
+# define ENTRY(name) \
+ .globl C_SYMBOL_NAME(name); \
+ .type C_SYMBOL_NAME(name),@function; \
+ .align ALIGNARG(2); \
+ C_LABEL(name)
+
+# undef END
+# define END(name) ASM_SIZE_DIRECTIVE(name)
+
+/* Local label name for asm code. */
+# ifndef L
+# define L(name) $L##name
+# endif
+
+#endif