This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

mips64 n32/n64 new files


This patch adds a number of small files needed to support n32 and n64.
I add a tentative port of INLINE_SYSCALL from o32 to n32 and n64 as
well, but it's #if 0'ed out since I haven't had a chance to actually
test it, and I'm not really confident it works.  Ok?

Index: ChangeLog
2003-03-14  Alexandre Oliva  <aoliva at redhat dot com>

	* sysdeps/mips/mips64/Implies: Move wordsize-64 to...
	* sysdeps/mips/mips64/n64/Implies: New file.
	* sysdeps/mips/mips64/n64/Makefile: New file.
	* sysdeps/mips/mips64/n64/el/bits/endian.h: New file.
	* sysdeps/mips/mips64/n32/Implies: New file.
	* sysdeps/mips/mips64/n32/Makefile: New file.
	* sysdeps/mips/mips64/n32/el/bits/endian.h: New file.
	* sysdeps/unix/mips/mips64/n32/sysdep.h: New file.
	* sysdeps/unix/mips/mips64/n64/sysdep.h: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/llseek.c: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/recv.c: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/send.c: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/syscall.S: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/umount.c: New file.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S: New file.

Index: sysdeps/mips/mips64/Implies
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/mips64/Implies,v
retrieving revision 1.3
diff -u -p -r1.3 Implies
--- sysdeps/mips/mips64/Implies 14 Jul 1999 00:29:21 -0000 1.3
+++ sysdeps/mips/mips64/Implies 15 Jan 2003 15:30:06 -0000
@@ -1,4 +1,3 @@
-wordsize-64
 # MIPS uses IEEE 754 floating point.
 ieee754/flt-32
 ieee754/dbl-64
Index: sysdeps/mips/mips64/n64/Implies
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n64/Implies	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,4 @@
+mips/mips64
+mips
+wordsize-64
+ieee754/ldbl-128
Index: sysdeps/mips/mips64/n64/Makefile
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n64/Makefile	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,2 @@
+# `long double' is a distinct type we support.
+long-double-fcts = yes
Index: sysdeps/mips/mips64/n64/el/bits/endian.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n64/el/bits/endian.h	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,8 @@
+/* The MIPS architecture has selectable endianness.
+   This file is for a machine using little-endian mode.  */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
Index: sysdeps/mips/mips64/n32/Implies
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n32/Implies	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,4 @@
+mips/mips64
+mips
+wordsize-32
+ieee754/ldbl-128
Index: sysdeps/mips/mips64/n32/Makefile
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n32/Makefile	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,2 @@
+# `long double' is a distinct type we support.
+long-double-fcts = yes
Index: sysdeps/mips/mips64/n32/el/bits/endian.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/mips/mips64/n32/el/bits/endian.h	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,8 @@
+/* The MIPS architecture has selectable endianness.
+   This file is for a machine using little-endian mode.  */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
Index: sysdeps/unix/mips/mips64/n32/sysdep.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/mips/mips64/n32/sysdep.h	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,58 @@
+/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003
+	Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva at redhat dot com>.
+
+   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 <sysdeps/unix/mips/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+# undef PSEUDO
+/* Note that while it's better structurally, going back to call __syscall_error
+   can make things confusing if you're debugging---it looks like it's jumping
+   backwards into the previous fn.  */
+#ifdef __PIC__
+#define PSEUDO(name, syscall_name, args) \
+  .align 2;								      \
+  99:;									      \
+  .set noat;								      \
+  .cpsetup t9, $1, name;						      \
+  .set at;								      \
+  la t9,__syscall_error;						      \
+  .cpreturn;								      \
+  jr t9;								      \
+  ENTRY(name)								      \
+  li v0, SYS_ify(syscall_name);						      \
+  syscall;								      \
+  bne a3, zero, 99b;							      \
+L(syse1):
+#else
+#define PSEUDO(name, syscall_name, args) \
+  .set noreorder;							      \
+  .align 2;								      \
+  99: j __syscall_error;						      \
+  ENTRY(name)								      \
+  .set noreorder;							      \
+  li v0, SYS_ify(syscall_name);						      \
+  syscall;								      \
+  .set reorder;								      \
+  bne a3, zero, 99b;							      \
+L(syse1):
+#endif
+
+#endif
Index: sysdeps/unix/mips/mips64/n64/sysdep.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/mips/mips64/n64/sysdep.h	2003-01-15 12:28:31.000000000 -0200
@@ -0,0 +1,58 @@
+/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003
+	Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva at redhat dot com>.
+
+   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 <sysdeps/unix/mips/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+# undef PSEUDO
+/* Note that while it's better structurally, going back to call __syscall_error
+   can make things confusing if you're debugging---it looks like it's jumping
+   backwards into the previous fn.  */
+#ifdef __PIC__
+#define PSEUDO(name, syscall_name, args) \
+  .align 2;								      \
+  99:;									      \
+  .set noat;								      \
+  .cpsetup t9, $1, name;						      \
+  .set at;								      \
+  dla t9,__syscall_error;						      \
+  .cpreturn;								      \
+  jr t9;								      \
+  ENTRY(name)								      \
+  li v0, SYS_ify(syscall_name);						      \
+  syscall;								      \
+  bne a3, zero, 99b;							      \
+L(syse1):
+#else
+#define PSEUDO(name, syscall_name, args) \
+  .set noreorder;							      \
+  .align 2;								      \
+  99: j __syscall_error;						      \
+  ENTRY(name)								      \
+  .set noreorder;							      \
+  li v0, SYS_ify(syscall_name);						      \
+  syscall;								      \
+  .set reorder;								      \
+  bne a3, zero, 99b;							      \
+L(syse1):
+#endif
+
+#endif
Index: sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2003-01-15 13:12:08.000000000 -0200
@@ -0,0 +1,263 @@
+/* Copyright (C) 2000, 2002, 2003 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.  */
+
+#ifndef _LINUX_MIPS_SYSDEP_H
+#define _LINUX_MIPS_SYSDEP_H 1
+
+/* There is some commonality.  */
+#include <sysdeps/unix/mips/mips64/n32/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+	/usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+#undef SYS_ify
+#ifdef __STDC__
+# define SYS_ify(syscall_name)	__NR_N32_##syscall_name
+#else
+# define SYS_ify(syscall_name)	__NR_N32_/**/syscall_name
+#endif
+
+
+#ifndef __ASSEMBLER__
+#if 0 /* untested */
+/* Define a macro which expands into the inline wrapper code for a system
+   call.  */
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                               \
+  ({ INTERNAL_SYSCALL_DECL(err);					\
+     long result_var = INTERNAL_SYSCALL (name, err, nr, args);      	\
+     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )  		\
+       {                                                                \
+         __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));      	\
+         result_var = -1L;                               		\
+       }                                                                \
+     result_var; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) long err
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err)   ((long) (err))
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err)     (val)
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args)
+
+#define internal_syscall0(name, err, dummy...) 				\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a3 asm("$7"); 					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %2\t\t\t# " #name "\n\t"				\
+	"syscall\n\t" 							\
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "i" (SYS_ify(name))						\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall1(name, err, arg1) 				\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a3 asm("$7"); 				\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %3\t\t\t# " #name "\n\t"				\
+	"syscall\n\t" 							\
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "i" (SYS_ify(name)) 				\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall2(name, err, arg1, arg2) 			\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a3 asm("$7"); 				\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %4\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "i" (SYS_ify(name))			\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall3(name, err, arg1, arg2, arg3) 			\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7"); 				\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) 		\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) 	\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	register long long __a4 asm("$8") = (long long) arg5; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a4) 							\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	register long long __a4 asm("$8") = (long long) arg5; 		\
+	register long long __a5 asm("$9") = (long long) arg6; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a5), "r" (__a6)					\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2"); 				\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	register long long __a4 asm("$8") = (long long) arg5; 		\
+	register long long __a5 asm("$9") = (long long) arg6; 		\
+	register long long __a6 asm("$10") = (long long) arg7; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a5), "r" (__a6), "r" (__a7)				\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
+#endif /* untested */
+#endif /* __ASSEMBLER__ */
+
+#endif /* linux/mips/sysdep.h */
Index: sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1 @@
+/* glob64 is in glob.c */
Index: sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2003-01-15 13:10:49.000000000 -0200
@@ -0,0 +1,263 @@
+/* Copyright (C) 2000, 2002, 2003 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.  */
+
+#ifndef _LINUX_MIPS_SYSDEP_H
+#define _LINUX_MIPS_SYSDEP_H 1
+
+/* There is some commonality.  */
+#include <sysdeps/unix/mips/mips64/n64/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+	/usr/include/asm/unistd.h
+   of the kernel.  But these symbols do not follow the SYS_* syntax
+   so we have to redefine the `SYS_ify' macro here.  */
+#undef SYS_ify
+#ifdef __STDC__
+# define SYS_ify(syscall_name)	__NR_N64_##syscall_name
+#else
+# define SYS_ify(syscall_name)	__NR_N64_/**/syscall_name
+#endif
+
+
+#ifndef __ASSEMBLER__
+#if 0 /* untested */
+/* Define a macro which expands into the inline wrapper code for a system
+   call.  */
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                               \
+  ({ INTERNAL_SYSCALL_DECL(err);					\
+     long result_var = INTERNAL_SYSCALL (name, err, nr, args);      	\
+     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )  		\
+       {                                                                \
+         __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));      	\
+         result_var = -1L;                               		\
+       }                                                                \
+     result_var; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) long err
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err)   ((long) (err))
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err)     (val)
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args)
+
+#define internal_syscall0(name, err, dummy...) 				\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a3 asm("$7"); 					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %2\t\t\t# " #name "\n\t"				\
+	"syscall\n\t" 							\
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "i" (SYS_ify(name))						\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall1(name, err, arg1) 				\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a3 asm("$7"); 					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %3\t\t\t# " #name "\n\t"				\
+	"syscall\n\t" 							\
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "i" (SYS_ify(name)) 				\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall2(name, err, arg1, arg2) 			\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a3 asm("$7"); 					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %4\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "i" (SYS_ify(name))			\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall3(name, err, arg1, arg2, arg3) 			\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7"); 					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) 		\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) 	\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	register long __a4 asm("$8") = (long) arg5; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a4) 							\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	register long __a4 asm("$8") = (long) arg5; 			\
+	register long __a5 asm("$9") = (long) arg6; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a5), "r" (__a6)					\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2"); 					\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	register long __a4 asm("$8") = (long) arg5; 			\
+	register long __a5 asm("$9") = (long) arg6; 			\
+	register long __a6 asm("$10") = (long) arg7; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	"li\t$2, %5\t\t\t# " #name "\n\t" 				\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
+	  "r" (__a5), "r" (__a6), "r" (__a7)				\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
+#endif /* untested */
+#endif /* __ASSEMBLER__ */
+
+#endif /* linux/mips/sysdep.h */
Index: sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001, 2002, 2003 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 <sysdeps/generic/ldconfig.h>
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
+  { "/lib32/ld.so.1", FLAG_ELF_LIBC6 }, \
+  { "/lib64/ld.so.1", FLAG_ELF_LIBC6 },
+#define SYSDEP_KNOWN_LIBRARY_NAMES \
+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
+  { "libm.so.6", FLAG_ELF_LIBC6 },
Index: sysdeps/unix/sysv/linux/mips/mips64/llseek.c
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/llseek.c	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1 @@
+/* lseek() is 64-bit capable already.  */
Index: sysdeps/unix/sysv/linux/mips/mips64/recv.c
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/recv.c	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1,34 @@
+/* Copyright (C) 2001, 2003 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 <errno.h>
+#include <sys/socket.h>
+#include <sysdep.h>
+
+/* Read N bytes into BUF from socket FD.
+   Returns the number read or -1 for errors.  */
+
+ssize_t
+__libc_recv (int fd, void *buf, size_t n, int flags)
+{
+
+  return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
+}
+
+weak_alias (__libc_recv, __recv)
+weak_alias (__recv, recv)
Index: sysdeps/unix/sysv/linux/mips/mips64/send.c
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/send.c	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1,32 @@
+/* Copyright (C) 2001, 2002, 2003 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 <errno.h>
+#include <sys/socket.h>
+#include <sysdep.h>
+
+/* Send N bytes of BUF to socket FD.  Returns the number sent or -1.  */
+ssize_t
+__libc_send (int fd, const void *buf, size_t n, int flags)
+{
+  return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, NULL);
+}
+
+weak_alias (__libc_send, __send)
+libc_hidden_weak (__send)
+weak_alias (__send, send)
Index: sysdeps/unix/sysv/linux/mips/mips64/syscall.S
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/syscall.S	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1,53 @@
+/* Copyright (C) 2001, 2002, 2003 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 <sysdep.h>
+
+#include <sys/asm.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/x86-64/sysdep.h for
+   more information about the value -4095 used below.  */
+
+/* Usage: long syscall (syscall_number, arg1, arg2, arg3, arg4, arg5)
+   We need to do some arg shifting, the syscall_number will be in
+   rax.  */
+
+
+	.text
+ENTRY (syscall)
+	move v0, a0		/* Syscall number -> v0 */
+	move a0, a1		/* shift arg1 - arg7.  */
+	move a1, a2
+	move a2, a3
+	move a3, a4
+	move a4, a5
+	move a5, a6
+	move a6, a7
+
+	syscall			/* Do the system call.  */
+	bne a3, zero, L(error)
+
+	ret
+
+L(error):
+	.cpsetup t9, a0, syscall
+	PTR_LA t9,__syscall_error
+	.cprestore
+	jr t9
+
+PSEUDO_END (syscall)
Index: sysdeps/unix/sysv/linux/mips/mips64/syscalls.list
--- /dev/null	2002-10-04 15:48:04.000000000 -0300
+++ sysdeps/unix/sysv/linux/mips/mips64/syscalls.list	2003-01-15 12:28:59.000000000 -0200
@@ -0,0 +1,20 @@
+# File name	Caller	Syscall name	Args	Strong name	Weak names
+
+lseek		-	lseek		i:iii	__libc_lseek	__lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64
+
+# proper socket implementations:
+recvfrom	-	recvfrom	i:ibniBN __libc_recvfrom __recvfrom recvfrom __syscall_recvfrom
+sendto		-	sendto		i:ibnibn __libc_sendto	__sendto sendto __syscall_sendto
+
+# semaphore and shm system calls
+msgctl		-	msgctl		i:iip	__msgctl	msgctl
+msgget		-	msgget		i:ii	__msgget	msgget
+msgrcv		-	msgrcv		i:ibnii	__msgrcv	msgrcv
+msgsnd		-	msgsnd		i:ibni	__msgsnd	msgsnd
+shmat		-	shmat		i:ipi	__shmat		shmat
+shmctl		-	shmctl		i:iip	__shmctl	shmctl
+shmdt		-	shmdt		i:s	__shmdt		shmdt
+shmget		-	shmget		i:iii	__shmget	shmget
+semop		-	semop		i:ipi	__semop		semop
+semget		-	semget		i:iii	__semget	semget
+semctl		-	semctl		i:iiii	__semctl	semctl
Index: sysdeps/unix/sysv/linux/mipx/mips64/umount.c
--- /dev/null	2003-01-30 08:24:37.000000000 -0200
+++ sysdeps/unix/sysv/linux/mips/mips64/umount.c	2002-10-14 12:33:13.000000000 -0300
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/hppa/umount.c>
Index: sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S
===================================================================
RCS file: ioctl.S
diff -N ioctl.S
--- /dev/null	Thu Aug 24 02:00:32 2000
+++ sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S Thu Jan 16 08:10:29 2003
@@ -0,0 +1,43 @@
+/* Copyright 2003 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 <sysdep.h>
+
+#include <sys/asm.h>
+
+/* Sign-extend the ioctl number, since the kernel wants it as a
+   sign-extended 32-bit value, but our prototype is that of a long.  */
+
+	.text
+ENTRY (__ioctl)
+	li v0, __NR_ioctl
+	dsll a1,a1,32
+	dsra a1,a1,32
+	syscall			/* Do the system call.  */
+	bne a3, zero, L(error)
+	ret
+
+L(error):
+	.cpsetup t9, a0, __ioctl
+	PTR_LA t9,__syscall_error
+	.cprestore
+	jr t9
+
+PSEUDO_END (__ioctl)
+
+weak_alias (__ioctl, ioctl)
-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist                Professional serial bug killer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]