From 0b508dd647e667c92820ddfc82eb5f95b19d2db1 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Mon, 23 Oct 2006 04:20:20 +0000 Subject: Merge SH-2 trapa fixups from Mark. 2006-10-16 Mark Shinwell * 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_ 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. --- libc/sysdeps/linux/sh/bits/syscalls.h | 47 ++++++++++++++--------- libc/sysdeps/linux/sh/bits/uClibc_arch_features.h | 4 +- libc/sysdeps/linux/sh/clone.S | 6 ++- libc/sysdeps/linux/sh/crti.S | 22 ++++++----- libc/sysdeps/linux/sh/mmap.c | 4 +- libc/sysdeps/linux/sh/pipe.c | 5 ++- libc/sysdeps/linux/sh/syscall.c | 6 ++- libc/sysdeps/linux/sh/vfork.S | 9 +++-- 8 files changed, 61 insertions(+), 42 deletions(-) (limited to 'libc') 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 directly; include 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_' syscall numbers taken from the Linux kernel * header files. It also defines the traditional `SYS_' 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 #define _ERRNO_H 1 #include +#define _SYSCALL_H +#include #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 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 #define _ERRNO_H 1 #include +#include /* 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 -- cgit v1.2.3