summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
author"Steven J. Hill" <sjhill@realitydiluted.com>2002-09-04 21:56:24 +0000
committer"Steven J. Hill" <sjhill@realitydiluted.com>2002-09-04 21:56:24 +0000
commita9b6db9b78d8c63eafde91be08f12c6fa0ba1311 (patch)
tree29454c0ad91c5f5ac7206f2b9d6c541cefc0ab61 /libc/sysdeps/linux
parent9613b6597870a299954fad327b0dfbda8cf8a91b (diff)
'syscall' now properly works for MIPS.
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/mips/Makefile2
-rw-r--r--libc/sysdeps/linux/mips/__uClibc_syscall.S45
-rw-r--r--libc/sysdeps/linux/mips/syscall.S55
3 files changed, 56 insertions, 46 deletions
diff --git a/libc/sysdeps/linux/mips/Makefile b/libc/sysdeps/linux/mips/Makefile
index f727d2b6e..95da2dded 100644
--- a/libc/sysdeps/linux/mips/Makefile
+++ b/libc/sysdeps/linux/mips/Makefile
@@ -30,7 +30,7 @@ TARGET_MACHINE_TYPE=$(shell $(CC) -dumpmachine)
CRT0=crt0.S
CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
-SSRC=bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S fork.S __uClibc_syscall.S
+SSRC=bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S fork.S syscall.S
SOBJS=$(patsubst %.S,%.o, $(SSRC))
CSRC=__longjmp.c brk.c vfork.c setjmp_aux.c _mmap.c pipe.c __syscall_error.c
diff --git a/libc/sysdeps/linux/mips/__uClibc_syscall.S b/libc/sysdeps/linux/mips/__uClibc_syscall.S
deleted file mode 100644
index 9993976d4..000000000
--- a/libc/sysdeps/linux/mips/__uClibc_syscall.S
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id: __uClibc_syscall.S,v 1.1 2002/08/09 13:43:21 andersen Exp $
- *
- * __uClibc_syscall.S - MIPS version.
- *
- * Derived from x86 implementation to reduce memory footprint
- * for syscalls.
- *
- * Mark Rustad, 03/21/2002
- * Copyright 2002 BRECIS Communications Corp.
- *
- * uClibc 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with uClibc; if not, write to the Free
- * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- */
-
- #include <sys/regdef.h>
-
- .text
- .align 4
- .globl __uClibc_syscall
- .ent __uClibc_syscall,0
- .type __uClibc_syscall,@function
-__uClibc_syscall:
- syscall
- .set noreorder
- beqz a3, 1f
- lui t3, %hi(errno)
- .set reorder
- negu a1, v0
- sw a1, %lo(errno)(t3)
- li v0, -1
-1:
- j ra
- .end __uClibc_syscall
-
-.Lsize:
- .size __uClibc_syscall,.Lsize-__uClibc_syscall
-
diff --git a/libc/sysdeps/linux/mips/syscall.S b/libc/sysdeps/linux/mips/syscall.S
new file mode 100644
index 000000000..c197a25c0
--- /dev/null
+++ b/libc/sysdeps/linux/mips/syscall.S
@@ -0,0 +1,55 @@
+/* Copyright (C) 1996, 1997 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <features.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+
+#ifdef PIC
+ .option pic2
+#endif
+.text
+.align 2
+.globl syscall
+.type syscall,@function
+.ent syscall
+syscall:
+ move v0, a0 /* Load system call number from first arg. */
+ move a0, a1 /* Move the next three args up a register. */
+ move a1, a2
+ move a2, a3
+ /* Load the remaining possible args (up to 11) from the stack. */
+#ifdef __mips64
+ ld t0,4*8(sp)
+ ld t1,5*8(sp)
+ ld t2,6*8(sp)
+ ld t3,7*8(sp)
+ ld t4,8*8(sp)
+ ld t5,9*8(sp)
+ ld t6,10*8(sp)
+#else
+ lw t0,4*4(sp)
+ lw t1,5*4(sp)
+ lw t2,6*4(sp)
+ lw t3,7*4(sp)
+ lw t4,8*4(sp)
+ lw t5,9*4(sp)
+ lw t6,10*4(sp)
+#endif
+ syscall /* Do the system call. */
+ j ra /* Return to caller. */