summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/sh
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2006-10-23 04:20:20 +0000
committerPaul Mundt <lethal@linux-sh.org>2006-10-23 04:20:20 +0000
commit0b508dd647e667c92820ddfc82eb5f95b19d2db1 (patch)
tree882e403d52d6a21249c00a7b8b451e9c7eec9239 /libc/sysdeps/linux/sh
parent44b161a8c584a50d77d63ad553e78991c7dc3617 (diff)
Merge SH-2 trapa fixups from Mark.
2006-10-16 Mark Shinwell <shinwell@codesourcery.com> * libc/sysdeps/linux/sh/vfork.S: Use __SH_SYSCALL_TRAP_BASE. Also use __CONFIG_SH2__ rather than __sh2__, for consistency. * libc/sysdeps/linux/sh/syscall.c: Use __SH_SYSCALL_TRAP_BASE. * libc/sysdeps/linux/sh/bits/uClibc_arch_features.h: Use __CONFIG_SH2__ rather than __sh2__, for consistency. * libc/sysdeps/linux/sh/bits/syscalls.h (__SH_SYSCALL_TRAP_BASE): New. Use instead of hard-coded trap numbers in the various __NR_<name> macros. * libc/sysdeps/linux/sh/clone.S: Use __SH_SYSCALL_TRAP_BASE. Also use __CONFIG_SH2__ rather than __sh2__, for consistency. * libc/sysdeps/linux/sh/crti.S: Disable GOT-related code if __HAVE_SHARED__ is not set. * libc/sysdeps/linux/sh/pipe.c (pipe): Use __SH_SYSCALL_TRAP_BASE.
Diffstat (limited to 'libc/sysdeps/linux/sh')
-rw-r--r--libc/sysdeps/linux/sh/bits/syscalls.h47
-rw-r--r--libc/sysdeps/linux/sh/bits/uClibc_arch_features.h4
-rw-r--r--libc/sysdeps/linux/sh/clone.S6
-rw-r--r--libc/sysdeps/linux/sh/crti.S22
-rw-r--r--libc/sysdeps/linux/sh/mmap.c4
-rw-r--r--libc/sysdeps/linux/sh/pipe.c5
-rw-r--r--libc/sysdeps/linux/sh/syscall.c6
-rw-r--r--libc/sysdeps/linux/sh/vfork.S9
8 files changed, 61 insertions, 42 deletions
diff --git a/libc/sysdeps/linux/sh/bits/syscalls.h b/libc/sysdeps/linux/sh/bits/syscalls.h
index 83b20f63e..f953ed3e8 100644
--- a/libc/sysdeps/linux/sh/bits/syscalls.h
+++ b/libc/sysdeps/linux/sh/bits/syscalls.h
@@ -4,6 +4,13 @@
# error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
#endif
+/* The Linux kernel uses different trap numbers on sh-2. */
+#ifdef __CONFIG_SH2__
+# define __SH_SYSCALL_TRAP_BASE 0x20
+#else
+# define __SH_SYSCALL_TRAP_BASE 0x10
+#endif
+
/* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
* header files. It also defines the traditional `SYS_<name>' macros for older
* programs. */
@@ -33,9 +40,9 @@ do { \
type name(void) \
{ \
register long __sc0 __asm__ ("r3") = __NR_##name; \
-__asm__ __volatile__ ("trapa #0x10" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0) \
+ : "i" (__SH_SYSCALL_TRAP_BASE), "0" (__sc0) \
: "memory" ); \
__syscall_return(type,__sc0); \
}
@@ -45,9 +52,9 @@ type name(type1 arg1) \
{ \
register long __sc0 __asm__ ("r3") = __NR_##name; \
register long __sc4 __asm__ ("r4") = (long) arg1; \
-__asm__ __volatile__ ("trapa #0x11" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4) \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 1), "0" (__sc0), "r" (__sc4) \
: "memory"); \
__syscall_return(type,__sc0); \
}
@@ -58,9 +65,10 @@ type name(type1 arg1,type2 arg2) \
register long __sc0 __asm__ ("r3") = __NR_##name; \
register long __sc4 __asm__ ("r4") = (long) arg1; \
register long __sc5 __asm__ ("r5") = (long) arg2; \
-__asm__ __volatile__ ("trapa #0x12" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5) \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 2), "0" (__sc0), "r" (__sc4), \
+ "r" (__sc5) \
: "memory"); \
__syscall_return(type,__sc0); \
}
@@ -72,9 +80,10 @@ register long __sc0 __asm__ ("r3") = __NR_##name; \
register long __sc4 __asm__ ("r4") = (long) arg1; \
register long __sc5 __asm__ ("r5") = (long) arg2; \
register long __sc6 __asm__ ("r6") = (long) arg3; \
-__asm__ __volatile__ ("trapa #0x13" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6) \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 3), "0" (__sc0), "r" (__sc4), \
+ "r" (__sc5), "r" (__sc6) \
: "memory"); \
__syscall_return(type,__sc0); \
}
@@ -87,9 +96,10 @@ register long __sc4 __asm__ ("r4") = (long) arg1; \
register long __sc5 __asm__ ("r5") = (long) arg2; \
register long __sc6 __asm__ ("r6") = (long) arg3; \
register long __sc7 __asm__ ("r7") = (long) arg4; \
-__asm__ __volatile__ ("trapa #0x14" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 4), "0" (__sc0), "r" (__sc4), \
+ "r" (__sc5), "r" (__sc6), \
"r" (__sc7) \
: "memory" ); \
__syscall_return(type,__sc0); \
@@ -104,18 +114,19 @@ register long __sc5 __asm__ ("r5") = (long) arg2; \
register long __sc6 __asm__ ("r6") = (long) arg3; \
register long __sc7 __asm__ ("r7") = (long) arg4; \
register long __sc0 __asm__ ("r0") = (long) arg5; \
-__asm__ __volatile__ ("trapa #0x15" \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), "r" (__sc7), \
- "r" (__sc3) \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 5), "0" (__sc0), "r" (__sc4), \
+ "r" (__sc5), "r" (__sc6), "r" (__sc7), "r" (__sc3) \
: "memory" ); \
__syscall_return(type,__sc0); \
}
-/* Add in _syscall6 which is not in the kernel header */
#ifndef __SH_SYSCALL6_TRAPA
-# define __SH_SYSCALL6_TRAPA "0x16"
+#define __SH_SYSCALL6_TRAPA __SH_SYSCALL_TRAP_BASE + 6
#endif
+
+/* Add in _syscall6 which is not in the kernel header */
#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \
{ \
@@ -126,10 +137,10 @@ register long __sc6 __asm__ ("r6") = (long) arg3; \
register long __sc7 __asm__ ("r7") = (long) arg4; \
register long __sc0 __asm__ ("r0") = (long) arg5; \
register long __sc1 __asm__ ("r1") = (long) arg6; \
-__asm__ __volatile__ ("trapa #" __SH_SYSCALL6_TRAPA \
+__asm__ __volatile__ ("trapa %1" \
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), "r" (__sc7), \
- "r" (__sc3), "r" (__sc1) \
+ : "i" (__SH_SYSCALL6_TRAPA), "0" (__sc0), "r" (__sc4), \
+ "r" (__sc5), "r" (__sc6), "r" (__sc7), "r" (__sc3), "r" (__sc1) \
: "memory" ); \
__syscall_return(type,__sc0); \
}
diff --git a/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h b/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h
index 7b9a0efbb..e2b480e75 100644
--- a/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h
+++ b/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h
@@ -6,9 +6,9 @@
#define _BITS_UCLIBC_ARCH_FEATURES_H
/* instruction used when calling abort() to kill yourself */
-#if defined(__sh2__)
+#if defined(__CONFIG_SH2__)
# define __UCLIBC_ABORT_INSTRUCTION__ "trapa #32"
-#else /* defined(__sh__) */
+#else
# define __UCLIBC_ABORT_INSTRUCTION__ "trapa #0xff"
#endif
diff --git a/libc/sysdeps/linux/sh/clone.S b/libc/sysdeps/linux/sh/clone.S
index 1806313e0..6999f9490 100644
--- a/libc/sysdeps/linux/sh/clone.S
+++ b/libc/sysdeps/linux/sh/clone.S
@@ -23,6 +23,8 @@
#include <asm/unistd.h>
#define _ERRNO_H 1
#include <bits/errno.h>
+#define _SYSCALL_H
+#include <bits/syscalls.h>
#ifdef __HAVE_SHARED__
@@ -59,9 +61,9 @@ clone:
/* do the system call */
mov r6, r4
- trapa #0x12
+ trapa #(__SH_SYSCALL_TRAP_BASE + 2)
mov r0, r1
-#ifdef __sh2__
+#ifdef __CONFIG_SH2__
// 12 arithmetic shifts for the crappy sh2, because shad doesn't exist!
shar r1
shar r1
diff --git a/libc/sysdeps/linux/sh/crti.S b/libc/sysdeps/linux/sh/crti.S
index 349613ab1..43ba28583 100644
--- a/libc/sysdeps/linux/sh/crti.S
+++ b/libc/sysdeps/linux/sh/crti.S
@@ -8,20 +8,21 @@
.type _init, @function
_init:
mov.l r12,@-r15
- mova .L6,r0
mov.l r14,@-r15
sts.l pr,@-r15
+#ifndef __HAVE_SHARED__
+ mova .L6,r0
mov.l .L6,r12
- mov r15,r14
add r0,r12
-
-
-
+#endif
+ mov r15,r14
bra 1f
nop
.align 2
+#ifndef __HAVE_SHARED__
.L6:
.long _GLOBAL_OFFSET_TABLE_
+#endif
1:
.section .fini
@@ -31,19 +32,22 @@ _init:
.type _fini, @function
_fini:
mov.l r12,@-r15
- mova .L11,r0
mov.l r14,@-r15
sts.l pr,@-r15
- mov.l .L11,r12
mov r15,r14
+#ifndef __HAVE_SHARED__
+ mov.l .L11,r12
+ mova .L11,r0
add r0,r12
-
-
+#endif
+
bra 1f
nop
.align 2
+#ifndef __HAVE_SHARED__
.L11:
.long _GLOBAL_OFFSET_TABLE_
+#endif
1:
.ident "GCC: (GNU) 3.3.2"
diff --git a/libc/sysdeps/linux/sh/mmap.c b/libc/sysdeps/linux/sh/mmap.c
index 6bc45e939..e711b0ff8 100644
--- a/libc/sysdeps/linux/sh/mmap.c
+++ b/libc/sysdeps/linux/sh/mmap.c
@@ -26,9 +26,7 @@
libc_hidden_proto(mmap)
#ifdef HIOS
-# define __SH_SYSCALL6_TRAPA "0x2E"
-#else
-# define __SH_SYSCALL6_TRAPA "0x15"
+# define __SH_SYSCALL6_TRAPA 0x2E
#endif
#include <sys/syscall.h>
diff --git a/libc/sysdeps/linux/sh/pipe.c b/libc/sysdeps/linux/sh/pipe.c
index 167db8903..432a5bc03 100644
--- a/libc/sysdeps/linux/sh/pipe.c
+++ b/libc/sysdeps/linux/sh/pipe.c
@@ -20,12 +20,13 @@ int pipe(int *fd)
__asm__ __volatile__ (
"mov %2, r3;"
"mov %3, r4;"
- "trapa #0x13;"
+ "trapa %4;"
"mov r1, %1;"
: "=z" (__res),
"=r" ((long) __res2)
: "r" ((long) __NR_pipe),
- "r" ((long) fd)
+ "r" ((long) fd),
+ "i" (__SH_SYSCALL_TRAP_BASE + 3)
: "cc", "memory", "r1", "r3", "r4");
if ((unsigned long)(__res) >= (unsigned long)(-125)) {
int __err = -(__res);
diff --git a/libc/sysdeps/linux/sh/syscall.c b/libc/sysdeps/linux/sh/syscall.c
index 5369cd5e4..ba187c9b7 100644
--- a/libc/sysdeps/linux/sh/syscall.c
+++ b/libc/sysdeps/linux/sh/syscall.c
@@ -16,9 +16,11 @@ register long __sc6 __asm__ ("r6") = (long) arg3;
register long __sc7 __asm__ ("r7") = (long) arg4;
register long __sc0 __asm__ ("r0") = (long) arg5;
register long __sc1 __asm__ ("r1") = (long) arg6;
-__asm__ __volatile__ ("trapa #0x16" \
+__asm__ __volatile__ (
+ "trapa %1"
: "=z" (__sc0) \
- : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), "r" (__sc7), \
+ : "i" (__SH_SYSCALL_TRAP_BASE + 6),
+ "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), "r" (__sc7), \
"r" (__sc3), "r" (__sc1) \
: "memory" );
__syscall_return(long,__sc0);
diff --git a/libc/sysdeps/linux/sh/vfork.S b/libc/sysdeps/linux/sh/vfork.S
index d9840946f..b8872e1e8 100644
--- a/libc/sysdeps/linux/sh/vfork.S
+++ b/libc/sysdeps/linux/sh/vfork.S
@@ -25,6 +25,7 @@
#include <bits/sysnum.h>
#define _ERRNO_H 1
#include <bits/errno.h>
+#include <bits/syscalls.h>
/* Clone the calling process, but without copying the whole address space.
The calling process is suspended until the new process exits or is
@@ -39,9 +40,9 @@
__vfork:
mov.w .L2, r3
- trapa #0x10
+ trapa #__SH_SYSCALL_TRAP_BASE
mov r0, r1
-#ifdef __sh2__
+#ifdef __CONFIG_SH2__
// 12 arithmetic shifts for the crappy sh2, because shad doesn't exist!
shar r1
shar r1
@@ -70,9 +71,9 @@ __vfork:
/* If we don't have vfork, use fork. */
mov.w .L3, r3
- trapa #0x10
+ trapa #__SH_SYSCALL_TRAP_BASE
mov r0, r1
-#ifdef __sh2__
+#ifdef __CONFIG_SH2__
// 12 arithmetic shifts for the crappy sh2, because shad doesn't exist!
shar r1
shar r1