This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi, SH is also working with CVS + CACHEMAGIC_VERSION_NEW patch, though we need SH specific patches mainly for the newer gcc and binutils which change some features of our old experimental toolchains and the new calling convention of system calls. I'd like to append them. Besides, we've implemented "real" INLINE_SYSCALL, which results no needs for SH specific syscalls.list. kaz -- 2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp> Yutaka Niibe <gniibe@chroot.org> * linuxthreads/sysdeps/sh/pt-machine.h (testandset): Since the operand of TAS.B has restrictions, use register. * sysdeps/sh/dl-machine.h (elf_machine_rela): Handle in place relocation which is generated by new ld. * sysdeps/sh/elf/initfini.c (_init): Preseted __fpscr_values. * sysdeps/sh/elf/initfini.c (_fini): Delete an obsolete register prefix. * sysdeps/unix/sysv/linux/sh/Versions : Add __xstat64, __fxstat64, __lxstat64, alphasort64, glob64, readdir64, readdir64_r, scandir64 and versionsort64 as the 2.2-versioned symbols. * sysdeps/unix/sysv/linux/sh/bits/fcntl.h : New file. * sysdeps/unix/sysv/linux/sh/brk.c : Changes for the new system call calling convention of the kernel. * sysdeps/unix/sysv/linux/sh/pipe.S : Likewise. * sysdeps/unix/sysv/linux/sh/socket.S : Likewise. * sysdeps/unix/sysv/linux/sh/clone.S : Likewise. * sysdeps/unix/sysv/linux/sh/sysdep.h : Likewise. * sysdeps/unix/sysv/linux/sh/fcntl.c : New file. * sysdeps/unix/sysv/linux/sh/lockf64.c : New file. * sysdeps/unix/sysv/linux/sh/sys/user.h : Include the kernel header file and delete the definitions of struct user and user_fp. * sysdeps/unix/sysv/linux/sh/syscall.S : New file. * sysdeps/unix/sysv/linux/sh/syscalls.list : Remove entries for s_ioctl, s_ipc, s_llseek, s_chown, s_fchown, s_lchown, s_execve, rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueueinfo, rt_sigsuspend, rt_sigtimedwait, s_getcwd, s_getdents, s_getgroups, s_getpriority, s_getegid, s_geteuid, s_getuid, getresgid, getresuid, s_getrlimit, s_poll, s_pread64, s_ptrace, s_pwrite64, s_reboot, s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend, s_setfsgid, s_setfsuid, s_setgid, s_setgroups, s_setregid, s_setresgid, s_setresuid, s_setreuid, s_setuid, s_sysctl, s_ugetrlimit, s_ustat, sys_fstat, sys_lstat, sys_mknod, sys_readv, sys_stat, sys_writev and syscall. diff -urN /cvs/libc/linuxthreads/sysdeps/sh/pt-machine.h libc/linuxthreads/sysdeps/sh/pt-machine.h --- /cvs/libc/linuxthreads/sysdeps/sh/pt-machine.h Tue Jun 13 04:59:47 2000 +++ libc/linuxthreads/sysdeps/sh/pt-machine.h Sat Oct 21 22:04:51 2000 @@ -30,10 +30,10 @@ int ret; __asm__ __volatile__( - "tas.b %1\n\t" + "tas.b @%1\n\t" "movt %0" - : "=z" (ret), "=m" (*spinlock) - : /* "1" (*spinlock) */ + : "=z" (ret) + : "r" (spinlock) : "memory", "cc"); return ret; diff -urN /cvs/libc/sysdeps/sh/dl-machine.h libc/sysdeps/sh/dl-machine.h --- /cvs/libc/sysdeps/sh/dl-machine.h Sun Oct 22 00:52:01 2000 +++ libc/sysdeps/sh/dl-machine.h Tue Oct 24 05:26:34 2000 @@ -433,7 +439,12 @@ #ifndef RTLD_BOOTSTRAP if (map != &_dl_rtld_map) /* Already done in rtld itself. */ #endif - *reloc_addr = map->l_addr + reloc->r_addend; + { + if (reloc->r_addend) + *reloc_addr = map->l_addr + reloc->r_addend; + else + *reloc_addr += map->l_addr; + } } else if (ELF32_R_TYPE (reloc->r_info) != R_SH_NONE) { diff -urN /cvs/libc/sysdeps/sh/elf/initfini.c libc/sysdeps/sh/elf/initfini.c --- /cvs/libc/sysdeps/sh/elf/initfini.c Tue Jun 13 05:24:30 2000 +++ libc/sysdeps/sh/elf/initfini.c Fri Oct 20 22:26:37 2000 @@ -80,6 +80,12 @@ .L23: .long __gmon_start__ #endif + .data + .global __fpscr_values +__fpscr_values: + .long 0 + .long 0x80000 + .previous 1: ALIGN END_INIT @@ -114,7 +120,7 @@ .global _fini .type _fini,@function _fini: - mov.l r12,@-$r15 + mov.l r12,@-r15 mov.l r14,@-r15 sts.l pr,@-r15 #ifdef SHARED diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/Versions libc/sysdeps/unix/sysv/linux/sh/Versions --- /cvs/libc/sysdeps/unix/sysv/linux/sh/Versions Tue Jun 13 05:34:44 2000 +++ libc/sysdeps/unix/sysv/linux/sh/Versions Fri Oct 20 22:24:45 2000 @@ -1,6 +1,24 @@ libc { GLIBC_2.2 { + # functions used in other libraries + __xstat64; __fxstat64; __lxstat64; + + # a* + alphasort64; + + # g* + glob64; + # New rlimit interface getrlimit; setrlimit; getrlimit64; + + # r* + readdir64; readdir64_r; + + # s* + scandir64; + + # v* + versionsort64; } } diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/bits/fcntl.h libc/sysdeps/unix/sysv/linux/sh/bits/fcntl.h --- /cvs/libc/sysdeps/unix/sysv/linux/sh/bits/fcntl.h Thu Jan 1 09:00:00 1970 +++ libc/sysdeps/unix/sysv/linux/sh/bits/fcntl.h Fri Oct 20 22:24:45 2000 @@ -0,0 +1,155 @@ +/* O_*, F_*, FD_* bit values for Linux. + Copyright (C) 1995, 1996, 1997, 1998, 2000 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FCNTL_H +# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead." +#endif + + +#include <sys/types.h> + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 /* not fcntl */ +#define O_EXCL 0200 /* not fcntl */ +#define O_NOCTTY 0400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 010000 +#define O_FSYNC O_SYNC +#define O_ASYNC 020000 + +#ifdef __USE_GNU +# define O_DIRECT 040000 /* Direct disk access. */ +# define O_DIRECTORY 0200000 /* Must be a directory. */ +# define O_NOFOLLOW 0400000 /* Do not follow links. */ +#endif + +/* For now Linux has synchronisity options for data and read operations. + We define the symbols here but let them do the same as O_SYNC since + this is a superset. */ +#if defined __USE_POSIX199309 || defined __USE_UNIX98 +# define O_DSYNC O_SYNC /* Synchronize data. */ +# define O_RSYNC O_SYNC /* Synchronize read operations. */ +#endif + +#ifdef __USE_LARGEFILE64 +# define O_LARGEFILE 0100000 +#endif + +/* Values for the second argument to `fcntl'. */ +#define F_DUPFD 0 /* Duplicate file descriptor. */ +#define F_GETFD 1 /* Get file descriptor flags. */ +#define F_SETFD 2 /* Set file descriptor flags. */ +#define F_GETFL 3 /* Get file status flags. */ +#define F_SETFL 4 /* Set file status flags. */ +#ifndef __USE_FILE_OFFSET64 +# define F_GETLK 5 /* Get record locking info. */ +# define F_SETLK 6 /* Set record locking info (non-blocking). */ +# define F_SETLKW 7 /* Set record locking info (blocking). */ +#else +# define F_GETLK F_GETLK64 /* Get record locking info. */ +# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/ +# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */ +#endif +#define F_GETLK64 12 /* Get record locking info. */ +#define F_SETLK64 13 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 14 /* Set record locking info (blocking). */ + +#if defined __USE_BSD || defined __USE_XOPEN2K +# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */ +# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */ +#endif + +#ifdef __USE_GNU +# define F_SETSIG 10 /* Set number of signal to be sent. */ +# define F_GETSIG 11 /* Get number of signal to be sent. */ +#endif + +/* For F_[GET|SET]FL. */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */ +#define F_RDLCK 0 /* Read lock. */ +#define F_WRLCK 1 /* Write lock. */ +#define F_UNLCK 2 /* Remove lock. */ + +/* For old implementation of bsd flock(). */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +#ifdef __USE_BSD +/* Operations for bsd flock(), also used by the kernel implementation. */ +# define LOCK_SH 1 /* shared lock */ +# define LOCK_EX 2 /* exclusive lock */ +# define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +# define LOCK_UN 8 /* remove lock */ +#endif + +struct flock + { + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ +#ifndef __USE_FILE_OFFSET64 + __off_t l_start; /* Offset where the lock begins. */ + __off_t l_len; /* Size of the locked area; zero means until EOF. */ +#else + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ +#endif + __pid_t l_pid; /* Process holding the lock. */ + }; + +#ifdef __USE_LARGEFILE64 +struct flock64 + { + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ + __pid_t l_pid; /* Process holding the lock. */ + }; +#endif + +/* Define some more compatibility macros to be backward compatible with + BSD systems which did not managed to hide these kernel macros. */ +#ifdef __USE_BSD +# define FAPPEND O_APPEND +# define FFSYNC O_FSYNC +# define FASYNC O_ASYNC +# define FNONBLOCK O_NONBLOCK +# define FNDELAY O_NDELAY +#endif /* Use BSD. */ + +/* Advise to `posix_fadvise'. */ +#ifdef __USE_XOPEN2K +# define POSIX_FADV_NORMAL 0 /* No further special treatment. */ +# define POSIX_FADV_RANDOM 1 /* Expect random page references. */ +# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */ +# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */ +# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */ +#endif diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/brk.c libc/sysdeps/unix/sysv/linux/sh/brk.c --- /cvs/libc/sysdeps/unix/sysv/linux/sh/brk.c Tue Jun 13 05:35:02 2000 +++ libc/sysdeps/unix/sysv/linux/sh/brk.c Tue Oct 24 17:45:17 2000 @@ -28,14 +28,12 @@ __brk (void *addr) { void *newbrk; + register long r3 asm ("%r3") = SYS_ify (brk); + register long r4 asm ("%r4") = (long)addr; - asm ("mov %1, r4\n" - "mov %2, r0\n" - "trapa #0\n" /* do the system call */ - "mov r0, %0;" /* keep the return value */ - : "=r"(newbrk) - : "r"(addr), "i" (SYS_ify (brk)) - : "r0"); + asm volatile ("trapa #0x11" + : "=z"(newbrk) + : "r" (r3), "r" (r4)); __curbrk = newbrk; diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/clone.S libc/sysdeps/unix/sysv/linux/sh/clone.S --- /cvs/libc/sysdeps/unix/sysv/linux/sh/clone.S Tue Jun 13 05:35:28 2000 +++ libc/sysdeps/unix/sysv/linux/sh/clone.S Tue Oct 24 17:05:56 2000 @@ -61,8 +61,8 @@ /* do the system call */ mov r6, r4 - mov #+SYS_ify(clone), r0 - trapa #0 + mov #+SYS_ify(clone), r3 + trapa #0x12 mov r0, r1 mov #-12, r2 shad r2, r1 diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/fcntl.c libc/sysdeps/unix/sysv/linux/sh/fcntl.c --- /cvs/libc/sysdeps/unix/sysv/linux/sh/fcntl.c Thu Jan 1 09:00:00 1970 +++ libc/sysdeps/unix/sysv/linux/sh/fcntl.c Fri Oct 20 22:24:45 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fcntl.c> diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/lockf64.c libc/sysdeps/unix/sysv/linux/sh/lockf64.c --- /cvs/libc/sysdeps/unix/sysv/linux/sh/lockf64.c Thu Jan 1 09:00:00 1970 +++ libc/sysdeps/unix/sysv/linux/sh/lockf64.c Fri Oct 20 22:24:45 2000 @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lockf64.c> diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/pipe.S libc/sysdeps/unix/sysv/linux/sh/pipe.S --- /cvs/libc/sysdeps/unix/sysv/linux/sh/pipe.S Tue Jun 13 05:39:28 2000 +++ libc/sysdeps/unix/sysv/linux/sh/pipe.S Tue Oct 24 17:06:33 2000 @@ -19,8 +19,8 @@ #include <sysdep.h> ENTRY (__libc_pipe) - mov #+__NR_pipe, r0 - trapa #0 + mov #+__NR_pipe, r3 + trapa #0x10 mov r0, r3 mov #-12, r2 shad r2, r3 diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/socket.S libc/sysdeps/unix/sysv/linux/sh/socket.S --- /cvs/libc/sysdeps/unix/sysv/linux/sh/socket.S Tue Jun 13 05:40:49 2000 +++ libc/sysdeps/unix/sysv/linux/sh/socket.S Tue Oct 24 16:53:28 2000 @@ -66,8 +66,8 @@ /* Do the system call trap. */ mov #+P(SOCKOP_,socket), r4 mov r15, r5 - mov.l .L1,r0 - trapa #0 + mov.l .L1,r3 + trapa #0x12 /* Pop args off the stack */ P(POPARGS_,NARGS) diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/sys/user.h libc/sysdeps/unix/sysv/linux/sh/sys/user.h --- /cvs/libc/sysdeps/unix/sysv/linux/sh/sys/user.h Tue Jun 13 05:48:45 2000 +++ libc/sysdeps/unix/sysv/linux/sh/sys/user.h Fri Oct 20 22:24:45 2000 @@ -21,48 +21,6 @@ #include <features.h> -/* <sys/ptrace.h> and <linux/ptrace.h> both define the PTRACE_* macros. - This leads to compilation problems with programs which include both - user.h and ptrace.h (eg: GDB). Do not include <linux/ptrace.h> here. */ -#include <asm/ptrace.h> - -struct user_fp -{ - struct fp_reg - { - unsigned int sign1:1; - unsigned int unused:15; - unsigned int sign2:1; - unsigned int exponent:14; - unsigned int j:1; - unsigned int mantissa1:31; - unsigned int mantissa0:32; - } fpregs[8]; - unsigned int fpsr:32; - unsigned int fpcr:32; -}; - -struct user -{ - struct pt_regs regs; /* General registers */ - int u_fpvalid; /* True if math co-processor being used. */ - - unsigned long int u_tsize; /* Text segment size (pages). */ - unsigned long int u_dsize; /* Data segment size (pages). */ - unsigned long int u_ssize; /* Stack segment size (pages). */ - - unsigned long start_code; /* Starting virtual address of text. */ - unsigned long start_stack; /* Starting virtual address of stack. */ - - long int signal; /* Signal that caused the core dump. */ - int reserved; /* No longer used */ - struct pt_regs *u_ar0; /* help gdb to find the general registers. */ - - unsigned long magic; /* uniquely identify a core file */ - char u_comm[32]; /* User command that was responsible */ - int u_debugreg[8]; - struct user_fp u_fp; /* Floating point registers */ - struct user_fp_struct *u_fp0; /* help gdb to find the FP registers. */ -}; +#include <asm/user.h> #endif /* sys/user.h */ diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/syscall.S libc/sysdeps/unix/sysv/linux/sh/syscall.S --- /cvs/libc/sysdeps/unix/sysv/linux/sh/syscall.S Thu Jan 1 09:00:00 1970 +++ libc/sysdeps/unix/sysv/linux/sh/syscall.S Thu Sep 14 23:53:58 2000 @@ -0,0 +1,68 @@ +/* Copyright (C) 2000 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <sysdep.h> + +ENTRY (__syscall) + mov r4, r3 // syscall number + mov r5, r4 // p1 + mov r6, r5 // p2 + mov r7, r6 // p3 + mov.l @r15, r7 // p4 + mov.l @(4,r15), r0 // p5 + mov.l @(8,r15), r1 // p6 + mov.l @(12,r15), r2 // p7 + trapa #0x17 + mov r0, r1 + mov #-12, r2 + shad r2, r1 + not r1, r1 // r1=0 means r0 = -1 to -4095 + tst r1, r1 // i.e. error in linux + bf 1f + mov.l .L2, r1 +#ifdef SHARED + mov r0, r4 + mov.l r12, @-r15 + sts.l pr, @-r15 + mov.l 0f, r12 + mova 0f, r0 + add r0, r12 + mova .L2, r0 + add r0, r1 + jsr @r1 + nop + lds.l @r15+, pr + rts + mov.l @r15+, r12 + .align 2 +0: + .long _GLOBAL_OFFSET_TABLE_ +#else + jmp @r1 + mov r0, r4 +#endif +1: + rts + nop + + .align 2 +.L2: + .long PLTJMP(C_SYMBOL_NAME(__syscall_error)) +PSEUDO_END (__syscall) + +weak_alias (__syscall, syscall) diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/syscalls.list libc/sysdeps/unix/sysv/linux/sh/syscalls.list --- /cvs/libc/sysdeps/unix/sysv/linux/sh/syscalls.list Thu Aug 24 00:53:24 2000 +++ libc/sysdeps/unix/sysv/linux/sh/syscalls.list Fri Oct 20 22:24:45 2000 @@ -1,54 +1,2 @@ # File name Caller Syscall name # args Strong name Weak names -s_ioctl ioctl ioctl 3 __syscall_ioctl -s_ipc msgget ipc 5 __syscall_ipc -s_llseek llseek _llseek 5 __syscall__llseek -s_chown chown chown 3 __syscall_chown -s_fchown fchown fchown 3 __syscall_fchown -s_lchown lchown lchown 3 __syscall_lchown -s_execve execve execve 3 __syscall_execve -rt_sigaction - rt_sigaction 4 __syscall_rt_sigaction -rt_sigpending - rt_sigpending 2 __syscall_rt_sigpending -rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask -rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo -rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend -rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait -s_getcwd getcwd getcwd 2 __syscall_getcwd -s_getdents getdents getdents 3 __syscall_getdents -s_getgroups getgroups getgroups 2 __syscall_getgroups -s_getpriority getpriority getpriority 2 __syscall_getpriority -s_getegid getegid getegid 0 __syscall_getegid -s_geteuid geteuid geteuid 0 __syscall_geteuid -s_getuid getuid getuid 0 __syscall_getuid -getresgid - getresgid 3 getresgid -getresuid - getresuid 3 getresuid -s_getrlimit getrlimit getrlimit 2 __syscall_getrlimit -s_poll poll poll 3 __syscall_poll -s_pread64 pread64 pread 5 __syscall_pread -s_ptrace ptrace ptrace 4 __syscall_ptrace -s_pwrite64 pwrite64 pwrite 5 __syscall_pwrite -s_reboot reboot reboot 3 __syscall_reboot -s_setrlimit setrlimit setrlimit 2 __syscall_setrlimit -s_sigaction sigaction sigaction 3 __syscall_sigaction -s_sigpending sigpending sigpending 1 __syscall_sigpending -s_sigprocmask sigprocmask sigprocmask 3 __syscall_sigprocmask -s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend -s_setfsgid setfsgid setfsgid 1 __syscall_setfsgid -s_setfsuid setfsuid setfsuid 1 __syscall_setfsuid -s_setgid setgid setgid 1 __syscall_setgid -s_setgroups setgroups setgroups 2 __syscall_setgroups -s_setregid setregid setregid 2 __syscall_setregid -s_setresgid setresgid setresgid 3 __syscall_setresgid -s_setresuid setresuid setresuid 3 __syscall_setresuid -s_setreuid setreuid setreuid 2 __syscall_setreuid -s_setuid setuid setuid 1 __syscall_setuid -s_sysctl sysctl _sysctl 1 __syscall__sysctl -s_ugetrlimit getrlimit ugetrlimit 2 __syscall_ugetrlimit -s_ustat ustat ustat 2 __syscall_ustat -sys_fstat fxstat fstat 2 __syscall_fstat -sys_lstat lxstat lstat 2 __syscall_lstat -sys_mknod xmknod mknod 3 __syscall_mknod -sys_readv readv readv 3 __syscall_readv -sys_stat xstat stat 2 __syscall_stat -sys_writev writev writev 3 __syscall_writev -syscall - syscall 5 syscall diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/sysdep.h libc/sysdeps/unix/sysv/linux/sh/sysdep.h --- /cvs/libc/sysdeps/unix/sysv/linux/sh/sysdep.h Tue Jun 13 05:45:19 2000 +++ libc/sysdeps/unix/sysv/linux/sh/sysdep.h Tue Oct 24 17:44:57 2000 @@ -103,29 +103,105 @@ #define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ -#define SYSCALL_INST0 trapa #0 -#define SYSCALL_INST1 trapa #0 -#define SYSCALL_INST2 trapa #0 -#define SYSCALL_INST3 trapa #0 -#define SYSCALL_INST4 trapa #0 -#define SYSCALL_INST5 trapa #1 -#define SYSCALL_INST6 trapa #2 +#define SYSCALL_INST0 trapa #0x10 +#define SYSCALL_INST1 trapa #0x11 +#define SYSCALL_INST2 trapa #0x12 +#define SYSCALL_INST3 trapa #0x13 +#define SYSCALL_INST4 trapa #0x14 +#define SYSCALL_INST5 mov.l @(0,r15),r0; trapa #0x15 +#define SYSCALL_INST6 mov.l @(0,r15),r0; mov.l @(4,r15),r1; trapa #0x16 #undef DO_CALL -#define DO_CALL(args, syscall_name) \ - mov.l 1f,r0; \ - SYSCALL_INST##args; \ - bra 2f; \ - nop; \ - .align 2; \ - 1: .long SYS_ify(syscall_name); \ +#define DO_CALL(args, syscall_name) \ + mov.l 1f,r3; \ + SYSCALL_INST##args; \ + bra 2f; \ + nop; \ + .align 2; \ + 1: .long SYS_ify (syscall_name); \ 2: #else /* not __ASSEMBLER__ */ +#define SYSCALL_INST_STR0 "trapa #0x10\n\t" +#define SYSCALL_INST_STR1 "trapa #0x11\n\t" +#define SYSCALL_INST_STR2 "trapa #0x12\n\t" +#define SYSCALL_INST_STR3 "trapa #0x13\n\t" +#define SYSCALL_INST_STR4 "trapa #0x14\n\t" +#define SYSCALL_INST_STR5 "trapa #0x15\n\t" +#define SYSCALL_INST_STR6 "trapa #0x16\n\t" + +#define ASMFMT_0 +#define ASMFMT_1 \ + , "r" (r4) +#define ASMFMT_2 \ + , "r" (r4), "r" (r5) +#define ASMFMT_3 \ + , "r" (r4), "r" (r5), "r" (r6) +#define ASMFMT_4 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7) +#define ASMFMT_5 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0) +#define ASMFMT_6 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1) +#define ASMFMT_7 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1), "r" (r2) + +#define SUBSTITUTE_ARGS_0() +#define SUBSTITUTE_ARGS_1(arg1) \ + register long r4 asm ("%r4") = (long)(arg1) +#define SUBSTITUTE_ARGS_2(arg1, arg2) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2) +#define SUBSTITUTE_ARGS_3(arg1, arg2, arg3) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2); \ + register long r6 asm ("%r6") = (long)(arg3) +#define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2); \ + register long r6 asm ("%r6") = (long)(arg3); \ + register long r7 asm ("%r7") = (long)(arg4) +#define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2); \ + register long r6 asm ("%r6") = (long)(arg3); \ + register long r7 asm ("%r7") = (long)(arg4); \ + register long r0 asm ("%r0") = (long)(arg5) +#define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2); \ + register long r6 asm ("%r6") = (long)(arg3); \ + register long r7 asm ("%r7") = (long)(arg4); \ + register long r0 asm ("%r0") = (long)(arg5); \ + register long r1 asm ("%r1") = (long)(arg6) +#define SUBSTITUTE_ARGS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + register long r4 asm ("%r4") = (long)(arg1); \ + register long r5 asm ("%r5") = (long)(arg2); \ + register long r6 asm ("%r6") = (long)(arg3); \ + register long r7 asm ("%r7") = (long)(arg4); \ + register long r0 asm ("%r0") = (long)(arg5) \ + register long r1 asm ("%r1") = (long)(arg6); \ + register long r2 asm ("%r2") = (long)(arg7) + #undef INLINE_SYSCALL -#define INLINE_SYSCALL(name, nr, args...) \ - __syscall_##name(args) +#define INLINE_SYSCALL(name, nr, args...) \ + ({ \ + unsigned long resultvar; \ + register long r3 asm ("%r3") = SYS_ify (name); \ + SUBSTITUTE_ARGS_##nr(args); \ + \ + asm volatile (SYSCALL_INST_STR##nr \ + : "=z" (resultvar) \ + : "r" (r3) ASMFMT_##nr \ + : "memory"); \ + \ + if (resultvar >= 0xfffff001) \ + { \ + __set_errno (-resultvar); \ + resultvar = 0xffffffff; \ + } \ + (int) resultvar; }) #endif /* __ASSEMBLER__ */ diff -urN /cvs/libc/sysdeps/unix/sysv/linux/sh/vfork.S libc/sysdeps/unix/sysv/linux/sh/vfork.S --- /cvs/libc/sysdeps/unix/sysv/linux/sh/vfork.S Tue Jun 13 05:40:55 2000 +++ libc/sysdeps/unix/sysv/linux/sh/vfork.S Tue Oct 24 16:54:24 2000 @@ -28,8 +28,8 @@ ENTRY (__vfork) #ifdef __NR_vfork - mov #+__NR_vfork, r0 - trapa #0 + mov.w .L3, r3 + trapa #0x10 mov r0, r1 mov #-12, r2 shad r2, r1 @@ -63,6 +63,7 @@ #endif .L1: .word -ENOSYS +.L3: .word __NR_vfork 1: rts nop @@ -70,8 +71,8 @@ #endif /* If we don't have vfork, fork is close enough. */ - mov #+__NR_fork, r0 - trapa #0 + mov #+__NR_fork, r3 + trapa #0x10 mov r0, r1 mov #-12, r2 shad r2, r1
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |