svn commit: trunk/uClibc/libc/sysdeps/linux/sh: bits
lethal at uclibc.org
lethal at uclibc.org
Mon Oct 23 04:20:21 UTC 2006
Author: lethal
Date: 2006-10-22 21:20:20 -0700 (Sun, 22 Oct 2006)
New Revision: 16426
Log:
Merge SH-2 trapa fixups from Mark.
2006-10-16 Mark Shinwell <shinwell at 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.
Modified:
trunk/uClibc/libc/sysdeps/linux/sh/bits/syscalls.h
trunk/uClibc/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h
trunk/uClibc/libc/sysdeps/linux/sh/clone.S
trunk/uClibc/libc/sysdeps/linux/sh/crti.S
trunk/uClibc/libc/sysdeps/linux/sh/mmap.c
trunk/uClibc/libc/sysdeps/linux/sh/pipe.c
trunk/uClibc/libc/sysdeps/linux/sh/syscall.c
trunk/uClibc/libc/sysdeps/linux/sh/vfork.S
Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/sh/bits/syscalls.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/bits/syscalls.h 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/bits/syscalls.h 2006-10-23 04:20:20 UTC (rev 16426)
@@ -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 @@
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 @@
{ \
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 @@
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 __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 __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 __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 __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); \
}
Modified: trunk/uClibc/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h 2006-10-23 04:20:20 UTC (rev 16426)
@@ -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
Modified: trunk/uClibc/libc/sysdeps/linux/sh/clone.S
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/clone.S 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/clone.S 2006-10-23 04:20:20 UTC (rev 16426)
@@ -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 @@
/* 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
Modified: trunk/uClibc/libc/sysdeps/linux/sh/crti.S
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/crti.S 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/crti.S 2006-10-23 04:20:20 UTC (rev 16426)
@@ -8,20 +8,21 @@
.type _init, @function
_init:
mov.l r12, at -r15
- mova .L6,r0
mov.l r14, at -r15
sts.l pr, at -r15
+#ifndef __HAVE_SHARED__
+ mova .L6,r0
mov.l .L6,r12
+ add r0,r12
+#endif
mov r15,r14
- add r0,r12
-
-
-
bra 1f
nop
.align 2
+#ifndef __HAVE_SHARED__
.L6:
.long _GLOBAL_OFFSET_TABLE_
+#endif
1:
.section .fini
@@ -31,19 +32,22 @@
.type _fini, @function
_fini:
mov.l r12, at -r15
- mova .L11,r0
mov.l r14, at -r15
sts.l pr, at -r15
+ mov r15,r14
+#ifndef __HAVE_SHARED__
mov.l .L11,r12
- mov r15,r14
+ 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"
Modified: trunk/uClibc/libc/sysdeps/linux/sh/mmap.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/mmap.c 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/mmap.c 2006-10-23 04:20:20 UTC (rev 16426)
@@ -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>
Modified: trunk/uClibc/libc/sysdeps/linux/sh/pipe.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/pipe.c 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/pipe.c 2006-10-23 04:20:20 UTC (rev 16426)
@@ -20,12 +20,13 @@
__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);
Modified: trunk/uClibc/libc/sysdeps/linux/sh/syscall.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/syscall.c 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/syscall.c 2006-10-23 04:20:20 UTC (rev 16426)
@@ -16,9 +16,11 @@
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);
Modified: trunk/uClibc/libc/sysdeps/linux/sh/vfork.S
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/vfork.S 2006-10-23 02:11:22 UTC (rev 16425)
+++ trunk/uClibc/libc/sysdeps/linux/sh/vfork.S 2006-10-23 04:20:20 UTC (rev 16426)
@@ -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 @@
/* 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
More information about the uClibc-cvs
mailing list