aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/sh/sh3
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
commit0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch)
tree2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /sysdeps/sh/sh3
parent7d58530341304d403a6626d7f7a1913165fe2f32 (diff)
downloadglibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.bz2
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip
2.5-18.1
Diffstat (limited to 'sysdeps/sh/sh3')
-rw-r--r--sysdeps/sh/sh3/__longjmp.S23
-rw-r--r--sysdeps/sh/sh3/setjmp.S29
2 files changed, 41 insertions, 11 deletions
diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S
index cd78cfe516..c6d8a3214c 100644
--- a/sysdeps/sh/sh3/__longjmp.S
+++ b/sysdeps/sh/sh3/__longjmp.S
@@ -1,5 +1,5 @@
/* longjmp for SH.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2005, 2006 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
@@ -30,15 +30,28 @@ ENTRY (__longjmp)
mov.l @r4+, r10
mov.l @r4+, r11
mov.l @r4+, r12
- mov.l @r4+, r13
- mov.l @r4+, r14
- mov.l @r4+, r15
mov r5, r0 /* get the return value in place */
tst r0, r0
bf.s 1f
- lds.l @r4+, pr
+ mov.l @r4+, r13
mov #1,r0 /* can't let setjmp() return zero! */
1:
+#ifdef PTR_DEMANGLE
+ mov.l @r4+, r2
+ PTR_DEMANGLE (r2, r1)
+ mov r2, r14
+ mov.l @r4+, r2
+ PTR_DEMANGLE2 (r2, r1)
+ mov r2, r15
+ mov.l @r4+, r2
+ PTR_DEMANGLE2 (r2, r1)
+ lds r2, pr
+ mov #0, r1
+#else
+ mov.l @r4+, r14
+ mov.l @r4+, r15
+ lds.l @r4+, pr
+#endif
rts
ldc.l @r4+, gbr
END (__longjmp)
diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S
index 819543a08c..d04e4b851f 100644
--- a/sysdeps/sh/sh3/setjmp.S
+++ b/sysdeps/sh/sh3/setjmp.S
@@ -1,5 +1,5 @@
/* setjmp for SH3.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2005, 2006 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
@@ -18,17 +18,28 @@
02111-1307 USA. */
#include <sysdep.h>
-#define _SETJMP_H
-#define _ASM
-#include <bits/setjmp.h>
+#include <jmpbuf-offsets.h>
ENTRY (__sigsetjmp)
/* Save registers */
add #(JB_SIZE - 4 * 5), r4
stc.l gbr, @-r4
+#ifdef PTR_MANGLE
+ sts pr, r2
+ PTR_MANGLE (r2, r1)
+ mov.l r2, @-r4
+ mov r15, r2
+ PTR_MANGLE2 (r2, r1)
+ mov.l r2, @-r4
+ mov r14, r2
+ PTR_MANGLE2 (r2, r1)
+ mov.l r2, @-r4
+ mov #0, r1
+#else
sts.l pr, @-r4
mov.l r15, @-r4
mov.l r14, @-r4
+#endif
mov.l r13, @-r4
mov.l r12, @-r4
mov.l r11, @-r4
@@ -36,8 +47,13 @@ ENTRY (__sigsetjmp)
mov.l r9, @-r4
mov.l r8, @-r4
+#if defined NOT_IN_libc && defined IS_IN_rtld
+ /* In ld.so we never save the signal mask. */
+ rts
+ mov #0, r0
+#else
/* Make a tail call to __sigjmp_save; it takes the same args. */
-#ifdef SHARED
+# ifdef SHARED
mov.l 1f, r1
mova 1f, r0
bra 2f
@@ -53,12 +69,13 @@ ENTRY (__sigsetjmp)
.align 2
.L1:
.long C_SYMBOL_NAME(__sigjmp_save@GOT)
-#else
+# else
mov.l .L1, r1
jmp @r1
nop
.align 2
.L1:
.long C_SYMBOL_NAME(__sigjmp_save)
+# endif
#endif
END (__sigsetjmp)