summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/microblaze
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/microblaze')
-rw-r--r--libc/sysdeps/linux/microblaze/bits/uClibc_page.h2
-rw-r--r--libc/sysdeps/linux/microblaze/setjmp.S32
-rw-r--r--libc/sysdeps/linux/microblaze/vfork.S7
3 files changed, 40 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/microblaze/bits/uClibc_page.h b/libc/sysdeps/linux/microblaze/bits/uClibc_page.h
index 8fc81ae32..41b042262 100644
--- a/libc/sysdeps/linux/microblaze/bits/uClibc_page.h
+++ b/libc/sysdeps/linux/microblaze/bits/uClibc_page.h
@@ -31,7 +31,9 @@
#elif defined(CONFIG_MICROBLAZE_4K_PAGES)
#define PAGE_SHIFT 12
#else
+#if !defined(CONFIG_MMU)
#warning Missing CONFIG_MICROBLAZE_nnK_PAGES, assuming 4K
+#endif
#define PAGE_SHIFT 12
#endif
diff --git a/libc/sysdeps/linux/microblaze/setjmp.S b/libc/sysdeps/linux/microblaze/setjmp.S
index 7acb9ea5d..d01c74555 100644
--- a/libc/sysdeps/linux/microblaze/setjmp.S
+++ b/libc/sysdeps/linux/microblaze/setjmp.S
@@ -10,7 +10,24 @@
* directory of this archive for more details.
*
* Written by Miles Bader <miles@gnu.org>
- */
+ *
+ * PIC code based on glibc 2.3.6 */
+
+/*
+ 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
#define _SETJMP_H
#define _ASM
@@ -22,7 +39,11 @@
.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. */
.globl C_SYMBOL_NAME(_setjmp)
@@ -31,6 +52,7 @@ C_SYMBOL_NAME(_setjmp):
.globl C_SYMBOL_NAME(__sigsetjmp)
C_SYMBOL_NAME(__sigsetjmp):
+1:
/* Save registers relative to r5 (arg0)*/
swi r1, r5, 0 /* stack pointer */
swi r15, r5, 4 /* link register */
@@ -52,5 +74,13 @@ C_SYMBOL_NAME(__sigsetjmp):
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
diff --git a/libc/sysdeps/linux/microblaze/vfork.S b/libc/sysdeps/linux/microblaze/vfork.S
index c4b4dbf2f..57db5e543 100644
--- a/libc/sysdeps/linux/microblaze/vfork.S
+++ b/libc/sysdeps/linux/microblaze/vfork.S
@@ -36,7 +36,14 @@ __vfork:
blti r4, 1f /* is r3 < -125? */
bri 2f /* normal return */
1: sub r3, r3, r0 /* r3 = -r3 */
+#ifdef __PIC__
+ mfs r3,rpc
+ addik r3,r3,_GLOBAL_OFFSET_TABLE_+8
+ lwi r3,r3,C_SYMBOL_NAME(errno)@GOT
+ sw r3, r0, r3
+#else
swi r3, r0, C_SYMBOL_NAME(errno);
+#endif
/* state restore etc */
2: rtsd r15, 8 /* error return */
nop