Browse Source

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.
Waldemar Brodkorb 8 years ago
parent
commit
2559592659

+ 49 - 43
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)

+ 15 - 28
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)

+ 25 - 0
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