diff options
Diffstat (limited to 'libc/sysdeps/linux/bfin/syscall.c')
-rw-r--r-- | libc/sysdeps/linux/bfin/syscall.c | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/libc/sysdeps/linux/bfin/syscall.c b/libc/sysdeps/linux/bfin/syscall.c index 15881b46b..1db873874 100644 --- a/libc/sysdeps/linux/bfin/syscall.c +++ b/libc/sysdeps/linux/bfin/syscall.c @@ -1,10 +1,22 @@ /* vi: set sw=4 ts=4: */ /* syscall for blackfin/uClibc * - * Copyright (C) 2004 by Analog Devices Inc. - * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * Copyright (C) 2004-2006 by Analog Devices Inc. + * Copyright (C) 2002 by Erik Andersen <andersen@uclibc.org> * - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <features.h> @@ -12,26 +24,34 @@ #include <sys/types.h> #include <sys/syscall.h> -long syscall(long sysnum, long a, long b, long c, long d, long e) +long syscall(long sysnum, long a, long b, long c, long d, long e, long f) { int _r0 = 0; - __asm__ volatile( - "p0 = %1;" /*SysCall Number*/ - "r0 = %2;" - "r1 = %3;" - "r2 = %4;" - "r3 = %6;" - "r4 = %5;" - "excpt 0;" /*Call the System Call*/ - "%0 = r0;" /*Store the result of syscall*/ - : "=r"(_r0) - : "r"(sysnum), "r"(a), "r"(b), - "r"(c), "r"(d), "r"(e) - : "memory"); - if(_r0 >=(unsigned long) -4095) { - (*__errno_location())=(-_r0); - _r0=(unsigned long) -1; - } - return (long) _r0; + __asm__ __volatile__ ( + "R5 = %7;" + "R4 = %6;" + "R3 = %5;" + "R2 = %4;" + "R1 = %3;" + "R0 = %2;" + "P0 = %1;" + "excpt 0;" + "%0 = R0;" + : "=r" (_r0) + : "rm" (sysnum), + "rm" (a), + "rm" (b), + "rm" (c), + "rm" (d), + "rm" (e), + "rm" (f) + : "memory","CC","R0","R1","R2","R3","R4","R5","P0"); + + if (_r0 >= (unsigned long) -4095) { + (*__errno_location()) = (-_r0); + _r0 = (unsigned long) -1; + } + + return (long)_r0; } |