Browse Source

Partial patch from Alexandre Oliva:

- adjust licensing terms of sources for crt*.o

- change the stat ABI to speed it up, matching changes in the kernel

- assorted bug-fixes, improvements and updates in the FR-V port

etc.
Eric Andersen 21 years ago
parent
commit
11e165ebcd

+ 1 - 0
libc/sysdeps/linux/frv/Makefile

@@ -32,6 +32,7 @@ SSRC=__longjmp.S setjmp.S clone.S vfork.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
 
 CSRC=mmap.c sysdep.c syscall.c brk.c sbrk.c __init_brk.c dl-iterate-phdr.c
 CSRC=mmap.c sysdep.c syscall.c brk.c sbrk.c __init_brk.c dl-iterate-phdr.c
+CSRC+=xstatconv.c stat.c stat64.c fstat.c fstat64.c lstat.c lstat64.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 
 OBJS=$(SOBJS) $(COBJS)
 OBJS=$(SOBJS) $(COBJS)

+ 18 - 7
libc/sysdeps/linux/frv/bits/elf-fdpic.h

@@ -1,4 +1,4 @@
-/* Copyright 2003 Free Software Foundation, Inc.
+/* Copyright 2003, 2004 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 This file is part of the GNU C Library.
 
 
 The GNU C Library is free software; you can redistribute it and/or
 The GNU C Library is free software; you can redistribute it and/or
@@ -6,6 +6,15 @@ 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
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.
 License, or (at your option) any later version.
 
 
+In addition to the permissions in the GNU Lesser General Public
+License, the Free Software Foundation gives you unlimited
+permission to link the compiled version of this file with other
+programs, and to distribute those programs without any restriction
+coming from the use of this file.  (The GNU Lesser General Public
+License restrictions do apply in other respects; for example, they
+cover modification of the file, and distribution when not linked
+into another program.)
+
 The GNU C Library is distributed in the hope that it will be useful,
 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
@@ -84,12 +93,14 @@ __reloc_pointer (void *p,
 	 above, but we want to use the carry in the comparison, so we
 	 above, but we want to use the carry in the comparison, so we
 	 can't convert it to an integer type beforehand.  */
 	 can't convert it to an integer type beforehand.  */
       unsigned long offset = p - (void*)map->segs[c].p_vaddr;
       unsigned long offset = p - (void*)map->segs[c].p_vaddr;
-      /* We explicitly refrain from checking for one-past-the-end.
+      /* We only check for one-past-the-end for the last segment,
-	 Zero-sized objects aren't legal, and it's expected that array
+	 assumed to be the data segment, because other cases are
-	 addresses will be relocated before the addend that would make
+	 ambiguous in the absence of padding between segments, and
-	 it one-past-the-end is added.  This gives us a reasonable speed
+	 rofixup already serves as padding between text and data.
-	 up, and we couldn't possibly disambiguate all cases anyway.  */
+	 Unfortunately, unless we special-case the last segment, we
-      if (offset < map->segs[c].p_memsz)
+	 fail to relocate the _end symbol.  */
+      if (offset < map->segs[c].p_memsz
+	  || (offset == map->segs[c].p_memsz && c + 1 == map->nsegs))
 	return (char*)map->segs[c].addr + offset;
 	return (char*)map->segs[c].addr + offset;
     }
     }
 	     
 	     

+ 63 - 36
libc/sysdeps/linux/frv/bits/kernel_stat.h

@@ -6,52 +6,79 @@
  * different opinion on the subject... */
  * different opinion on the subject... */
 
 
 struct kernel_stat {
 struct kernel_stat {
+	unsigned char __pad1[6];
 	unsigned short st_dev;
 	unsigned short st_dev;
-	unsigned short __pad1;
+
+	unsigned long __pad2;
 	unsigned long st_ino;
 	unsigned long st_ino;
+
+	unsigned short __pad3;
 	unsigned short st_mode;
 	unsigned short st_mode;
+	unsigned short __pad4;
 	unsigned short st_nlink;
 	unsigned short st_nlink;
+
+	unsigned short __pad5;
 	unsigned short st_uid;
 	unsigned short st_uid;
+	unsigned short __pad6;
 	unsigned short st_gid;
 	unsigned short st_gid;
+
+	unsigned char __pad7[6];
 	unsigned short st_rdev;
 	unsigned short st_rdev;
-	unsigned short __pad2;
+
-	unsigned long  st_size;
+	unsigned long __pad8;
-	unsigned long  st_blksize;
+	unsigned long st_size;
-	unsigned long  st_blocks;
+
-	unsigned long  st_atime;
+	unsigned long __pad9;		/* align 64-bit st_blocks to 2-word */
-	unsigned long  __unused1;
+	unsigned long st_blksize;
-	unsigned long  st_mtime;
+
-	unsigned long  __unused2;
+	unsigned long __pad10;	/* future possible st_blocks high bits */
-	unsigned long  st_ctime;
+	unsigned long st_blocks;	/* Number 512-byte blocks allocated. */
-	unsigned long  __unused3;
+
-	unsigned long  __unused4;
+	unsigned long __unused1;
-	unsigned long  __unused5;
+	unsigned long st_atime;
+
+	unsigned long __unused2;
+	unsigned long st_mtime;
+
+	unsigned long __unused3;
+	unsigned long st_ctime;
+
+	unsigned long long __unused4;
 };
 };
 
 
 struct kernel_stat64 {
 struct kernel_stat64 {
-	unsigned char	__pad0[6];
+	unsigned char __pad1[6];
-	unsigned short	st_dev;
+	unsigned short st_dev;
-	unsigned char	__pad1[2];
+
-#define _HAVE_STAT64___ST_INO
+	unsigned long long st_ino;
-	unsigned long	__st_ino;
+
-	unsigned int	st_mode;
+	unsigned int st_mode;
-	unsigned int	st_nlink;
+	unsigned int st_nlink;
-	unsigned long	st_uid;
+
-	unsigned long	st_gid;
+	unsigned long st_uid;
-	unsigned char	__pad2[6];
+	unsigned long st_gid;
-	unsigned short	st_rdev;
+
-	unsigned char	__pad3[2];
+	unsigned char __pad2[6];
-	long long	st_size;
+	unsigned short st_rdev;
-	unsigned long	st_blksize;
+
-	unsigned long	__pad4;		/* future possible st_blocks high bits */
+	long long st_size;
-	unsigned long	st_blocks;	/* Number 512-byte blocks allocated. */
+
-	unsigned long	st_atime;
+	unsigned long __pad3;		/* align 64-bit st_blocks to 2-word */
-	unsigned long	__pad5;
+	unsigned long st_blksize;
-	unsigned long	st_mtime;
+
-	unsigned long	__pad6;
+	unsigned long __pad4;		/* future possible st_blocks high bits */
-	unsigned long	st_ctime;
+	unsigned long st_blocks;	/* Number 512-byte blocks allocated. */
-	unsigned long	__pad7;		/* will be high 32 bits of ctime someday */
+
-	unsigned long long	st_ino;
+	unsigned long __unused1;
+	unsigned long st_atime;
+
+	unsigned long __unused2;
+	unsigned long st_mtime;
+
+	unsigned long __unused3;	/* will be high 32 bits of ctime someday */
+	unsigned long st_ctime;
+
+	unsigned long long __unused4;
 };
 };
 
 
 #endif	/*  _BITS_STAT_STRUCT_H */
 #endif	/*  _BITS_STAT_STRUCT_H */

+ 154 - 0
libc/sysdeps/linux/frv/bits/stat.h

@@ -0,0 +1,154 @@
+/* Copyright (C) 1992,95,96,97,98,99,2000,2001, 2004 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 _SYS_STAT_H
+# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
+#endif
+
+#ifndef _BITS_STAT_H
+#define _BITS_STAT_H
+
+/* Versions of the `struct stat' data structure.  */
+#define _STAT_VER_KERNEL	0
+#define _STAT_VER_LINUX		0
+#define _STAT_VER		_STAT_VER_LINUX	/* The one defined below.  */
+
+/* Versions of the `xmknod' interface.  */
+#define _MKNOD_VER_LINUX	1
+#define _MKNOD_VER_SVR4		2
+#define _MKNOD_VER		_MKNOD_VER_LINUX /* The bits defined below.  */
+
+struct stat
+{
+    __dev_t st_dev;			/* Device.  */
+
+#ifndef __USE_FILE_OFFSET64
+    unsigned long __pad1;
+    __ino_t st_ino;			/* File serial number.	*/
+#else
+    __ino64_t st_ino;			/* File serial number.	*/
+#endif
+
+    __mode_t st_mode;			/* File mode.  */
+    __nlink_t st_nlink;			/* Link count.  */
+
+    __uid_t st_uid;			/* User ID of the file's owner.	*/
+    __gid_t st_gid;			/* Group ID of the file's group.*/
+
+    __dev_t st_rdev;			/* Device number, if device.  */
+
+#ifndef __USE_FILE_OFFSET64
+    unsigned long __pad2;
+    __off_t st_size;			/* Size of file, in bytes.  */
+
+    unsigned long __pad3;
+#else
+    __off64_t st_size;			/* Size of file, in bytes.  */
+
+    unsigned long __pad1;
+#endif
+    __blksize_t st_blksize;		/* Optimal block size for I/O.  */
+
+#ifndef __USE_FILE_OFFSET64
+    unsigned long __pad4;
+    __blkcnt_t st_blocks;		/* Number 512-byte blocks allocated. */
+#else
+    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
+#endif
+
+    unsigned long int __unused1;
+    __time_t st_atime;			/* Time of last access.  */
+
+    unsigned long int __unused2;
+    __time_t st_mtime;			/* Time of last modification.  */
+
+    unsigned long int __unused3;
+    __time_t st_ctime;			/* Time of last status change.  */
+
+    unsigned long long __unused4;
+};
+
+#ifdef __USE_LARGEFILE64
+struct stat64
+{
+    __dev_t st_dev;			/* Device.  */
+
+    __ino64_t st_ino;			/* File serial number.	*/
+
+    __mode_t st_mode;			/* File mode.  */
+    __nlink_t st_nlink;			/* Link count.  */
+
+    __uid_t st_uid;			/* User ID of the file's owner.	*/
+    __gid_t st_gid;			/* Group ID of the file's group.*/
+
+    __dev_t st_rdev;			/* Device number, if device.  */
+
+    __off64_t st_size;			/* Size of file, in bytes.  */
+
+    unsigned long __pad1;
+    __blksize_t st_blksize;		/* Optimal block size for I/O.  */
+
+    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
+
+    unsigned long int __unused1;
+    __time_t st_atime;			/* Time of last access.  */
+
+    unsigned long int __unused2;
+    __time_t st_mtime;			/* Time of last modification.  */
+
+    unsigned long int __unused3;
+    __time_t st_ctime;			/* Time of last status change.  */
+
+    unsigned long long __unused4;
+};
+#endif
+
+
+/* Tell code we have these members.  */
+#define	_STATBUF_ST_BLKSIZE
+#define _STATBUF_ST_RDEV
+
+/* Encoding of the file mode.  */
+
+#define	__S_IFMT	0170000	/* These bits determine file type.  */
+
+/* File types.  */
+#define	__S_IFDIR	0040000	/* Directory.  */
+#define	__S_IFCHR	0020000	/* Character device.  */
+#define	__S_IFBLK	0060000	/* Block device.  */
+#define	__S_IFREG	0100000	/* Regular file.  */
+#define	__S_IFIFO	0010000	/* FIFO.  */
+#define	__S_IFLNK	0120000	/* Symbolic link.  */
+#define	__S_IFSOCK	0140000	/* Socket.  */
+
+/* POSIX.1b objects.  Note that these macros always evaluate to zero.  But
+   they do it by enforcing the correct use of the macros.  */
+#define __S_TYPEISMQ(buf)  ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
+
+/* Protection bits.  */
+
+#define	__S_ISUID	04000	/* Set user ID on execution.  */
+#define	__S_ISGID	02000	/* Set group ID on execution.  */
+#define	__S_ISVTX	01000	/* Save swapped text after use (sticky).  */
+#define	__S_IREAD	0400	/* Read by owner.  */
+#define	__S_IWRITE	0200	/* Write by owner.  */
+#define	__S_IEXEC	0100	/* Execute by owner.  */
+
+#endif	/* _BITS_STAT_H */

+ 5 - 4
libc/sysdeps/linux/frv/bits/syscalls.h

@@ -9,9 +9,6 @@
  * programs.  */
  * programs.  */
 #include <bits/sysnum.h>
 #include <bits/sysnum.h>
 
 
-#ifndef __set_errno
-# define __set_errno(val) ((*__errno_location ()) = (val))
-#endif
 #ifndef SYS_ify
 #ifndef SYS_ify
 # define SYS_ify(syscall_name)  (__NR_##syscall_name)
 # define SYS_ify(syscall_name)  (__NR_##syscall_name)
 #endif
 #endif
@@ -19,7 +16,7 @@
 #ifndef __ASSEMBLER__
 #ifndef __ASSEMBLER__
 
 
 /* user-visible error numbers are in the range -1 - -4095: see <asm-frv/errno.h> */
 /* user-visible error numbers are in the range -1 - -4095: see <asm-frv/errno.h> */
-#ifdef _LIBC
+#if defined _LIBC && !defined __set_errno
 # define __syscall_return(type, res) \
 # define __syscall_return(type, res) \
 do { \
 do { \
         unsigned long __sr2 = (res);		    			    \
         unsigned long __sr2 = (res);		    			    \
@@ -43,6 +40,10 @@ do { \
 } while (0)
 } while (0)
 #endif
 #endif
 
 
+#ifndef __set_errno
+# define __set_errno(val) ((*__errno_location ()) = (val))
+#endif
+
 /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
 /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
 
 
 #define _syscall0(type,name) \
 #define _syscall0(type,name) \

+ 32 - 0
libc/sysdeps/linux/frv/bits/uClibc_page.h

@@ -0,0 +1,32 @@
+/*  Copyright (C) 2004     Erik Andersen
+ *
+ *  This 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.
+ *
+ *  This 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 this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Supply an architecture specific value for PAGE_SIZE and friends.  */
+
+#ifndef _UCLIBC_PAGE_H
+#define _UCLIBC_PAGE_H
+
+/* PAGE_SHIFT determines the page size -- in this case 4096 */
+#define PAGE_SHIFT	(14)
+#ifndef __ASSEMBLY__
+#define PAGE_SIZE	(1UL << PAGE_SHIFT)
+#else
+#define PAGE_SIZE	(1 << PAGE_SHIFT)
+#endif
+#define PAGE_MASK	(~(PAGE_SIZE-1))
+
+#endif /* _UCLIBC_PAGE_H */

+ 18 - 8
libc/sysdeps/linux/frv/crt0.S

@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 2003, 2004 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 This file is part of the GNU C Library.
 
 
 The GNU C Library is free software; you can redistribute it and/or
 The GNU C Library is free software; you can redistribute it and/or
@@ -11,6 +11,15 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Library General Public License for more details.
 Library General Public License for more details.
 
 
+In addition to the permissions in the GNU Lesser General Public
+License, the Free Software Foundation gives you unlimited
+permission to link the compiled version of this file with other
+programs, and to distribute those programs without any restriction
+coming from the use of this file.  (The GNU Lesser General Public
+License restrictions do apply in other respects; for example, they
+cover modification of the file, and distribution when not linked
+into another program.)
+
 You should have received a copy of the GNU Lesser General Public
 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; see the file COPYING.LIB.  If
 License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
@@ -43,11 +52,12 @@ Cambridge, MA 02139, USA.  */
 	.weak	_fini
 	.weak	_fini
 	.type	__uClibc_start_main,%function
 	.type	__uClibc_start_main,%function
 #endif
 #endif
-/* Stick in a dummy reference to main(), so that if an application
- * is linking when the main() function is in a static library (.a)
- * we can be sure that main() actually gets linked in */
-	.type	main,%function
 _start:
 _start:
+	/* Make sure the stack pointer is properly aligned.  Save the
+	   original value in gr21 such that we can get to arguments and
+	   such from there.  */
+	mov.p	sp, gr21
+	andi	sp, #-8, sp
 	/* At program start-up, gr16 contains a pointer to a memory
 	/* At program start-up, gr16 contains a pointer to a memory
 	   map, that we use to relocate addresses.  */
 	   map, that we use to relocate addresses.  */
 	call	.Lcall
 	call	.Lcall
@@ -74,10 +84,10 @@ _start:
 	the last entry, relocated.  */
 	the last entry, relocated.  */
 
 
 	/* Prepare arguments for uClibc main.  */
 	/* Prepare arguments for uClibc main.  */
-	ld	@(sp, gr0), gr8
+	ld	@(gr21, gr0), gr8
 	slli	gr8, #2, gr10
 	slli	gr8, #2, gr10
-	add	sp, gr10, gr10
+	add	gr21, gr10, gr10
-	addi.p	sp, #4, gr9
+	addi.p	gr21, #4, gr9
 	addi	gr10, #8, gr10
 	addi	gr10, #8, gr10
 
 
 	/* Set up an invalid (NULL return address, NULL frame pointer)
 	/* Set up an invalid (NULL return address, NULL frame pointer)

+ 10 - 1
libc/sysdeps/linux/frv/crti.S

@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 This file is part of the GNU C Library.
 
 
 The GNU C Library is free software; you can redistribute it and/or
 The GNU C Library is free software; you can redistribute it and/or
@@ -6,6 +6,15 @@ 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
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.
 License, or (at your option) any later version.
 
 
+In addition to the permissions in the GNU Lesser General Public
+License, the Free Software Foundation gives you unlimited
+permission to link the compiled version of this file with other
+programs, and to distribute those programs without any restriction
+coming from the use of this file.  (The GNU Lesser General Public
+License restrictions do apply in other respects; for example, they
+cover modification of the file, and distribution when not linked
+into another program.)
+
 The GNU C Library is distributed in the hope that it will be useful,
 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

+ 10 - 1
libc/sysdeps/linux/frv/crtn.S

@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 This file is part of the GNU C Library.
 
 
 The GNU C Library is free software; you can redistribute it and/or
 The GNU C Library is free software; you can redistribute it and/or
@@ -6,6 +6,15 @@ 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
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.
 License, or (at your option) any later version.
 
 
+In addition to the permissions in the GNU Lesser General Public
+License, the Free Software Foundation gives you unlimited
+permission to link the compiled version of this file with other
+programs, and to distribute those programs without any restriction
+coming from the use of this file.  (The GNU Lesser General Public
+License restrictions do apply in other respects; for example, they
+cover modification of the file, and distribution when not linked
+into another program.)
+
 The GNU C Library is distributed in the hope that it will be useful,
 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

+ 9 - 0
libc/sysdeps/linux/frv/crtreloc.c

@@ -7,6 +7,15 @@ 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
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.
 License, or (at your option) any later version.
 
 
+In addition to the permissions in the GNU Lesser General Public
+License, the Free Software Foundation gives you unlimited
+permission to link the compiled version of this file with other
+programs, and to distribute those programs without any restriction
+coming from the use of this file.  (The GNU Lesser General Public
+License restrictions do apply in other respects; for example, they
+cover modification of the file, and distribution when not linked
+into another program.)
+
 The GNU C Library is distributed in the hope that it will be useful,
 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

+ 45 - 0
libc/sysdeps/linux/frv/fstat.c

@@ -0,0 +1,45 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#define __NR___syscall_fstat __NR_fstat
+_syscall2(int, __syscall_fstat, int, fd, struct stat *, buf);
+strong_alias(__syscall_fstat, fstat)

+ 47 - 0
libc/sysdeps/linux/frv/fstat64.c

@@ -0,0 +1,47 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#if defined __UCLIBC_HAS_LFS__
+#define __NR___syscall_fstat64 __NR_fstat64
+_syscall2(int, __syscall_fstat64, int, fd, struct stat64 *, buf);
+strong_alias(__syscall_fstat64, fstat64)
+#endif

+ 45 - 0
libc/sysdeps/linux/frv/lstat.c

@@ -0,0 +1,45 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#define __NR___syscall_lstat __NR_lstat
+_syscall2(int, __syscall_lstat, const char *, file_name, struct stat *, buf);
+strong_alias(__syscall_lstat, lstat)

+ 47 - 0
libc/sysdeps/linux/frv/lstat64.c

@@ -0,0 +1,47 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#if defined __UCLIBC_HAS_LFS__
+#define __NR___syscall_lstat64 __NR_lstat64
+_syscall2(int, __syscall_lstat64, const char *, file_name, struct stat64 *, buf);
+strong_alias(__syscall_lstat64, lstat64)
+#endif

+ 45 - 0
libc/sysdeps/linux/frv/stat.c

@@ -0,0 +1,45 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#define __NR___syscall_stat __NR_stat
+_syscall2(int, __syscall_stat, const char *, file_name, struct stat *, buf);
+strong_alias(__syscall_stat, stat)

+ 47 - 0
libc/sysdeps/linux/frv/stat64.c

@@ -0,0 +1,47 @@
+/*
+ * Syscalls for uClibc
+ *
+ * Copyright (C) 2001-2003 by Erik Andersen
+ * Extracted from ../common/syscalls.c by Erik Andersen <andersen@codpoet.org>
+ * Adapted to FR-V by Alexandre Oliva <aoliva@redhat.com>
+ *
+ * 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
+ *
+ */
+
+#define _GNU_SOURCE
+#define _LARGEFILE64_SOURCE
+#include <features.h>
+#undef __OPTIMIZE__
+/* We absolutely do _NOT_ want interfaces silently
+ *  *  * renamed under us or very bad things will happen... */
+#ifdef __USE_FILE_OFFSET64
+# undef __USE_FILE_OFFSET64
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <endian.h>
+
+#include <unistd.h>
+#define _SYS_STAT_H
+#include <bits/stat.h>
+
+#if defined __UCLIBC_HAS_LFS__
+#define __NR___syscall_stat64 __NR_stat64
+_syscall2(int, __syscall_stat64, const char *, file_name, struct stat64 *, buf);
+strong_alias(__syscall_stat64, stat64)
+#endif

+ 1 - 0
libc/sysdeps/linux/frv/xstatconv.c

@@ -0,0 +1 @@
+/* We don't need any of this.  */

+ 38 - 18
libpthread/linuxthreads/sysdeps/frv/pt-machine.h

@@ -1,6 +1,6 @@
 /* Machine-dependent pthreads configuration and inline functions.
 /* Machine-dependent pthreads configuration and inline functions.
-   ARM version.
+   FR-V version.
-   Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2004  Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    This file is part of the GNU C Library.
    Contributed by Alexandre Oliva <aoliva@redhat.com>
    Contributed by Alexandre Oliva <aoliva@redhat.com>
 
 
@@ -15,34 +15,54 @@
    Lesser General Public License for more details.
    Lesser General Public License for more details.
 
 
    You should have received a copy of the GNU Lesser General Public
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   License along with the GNU C Library; see the file COPYING.LIB.  If
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   not, write to the Free Software Foundation, Inc.,
-   Boston, MA 02111-1307, USA.  */
+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
 #ifndef _PT_MACHINE_H
 #ifndef _PT_MACHINE_H
 #define _PT_MACHINE_H   1
 #define _PT_MACHINE_H   1
 
 
+#ifndef __ASSEMBLER__
+
 #ifndef PT_EI
 #ifndef PT_EI
-# define PT_EI extern inline
+# define PT_EI extern inline __attribute__ ((always_inline))
 #endif
 #endif
 
 
-/* Get some notion of the current stack.  Need not be exactly the top
-   of the stack, just something somewhere in the current frame.  */
-#define CURRENT_STACK_FRAME  __builtin_frame_address (0)
-
-
-extern long int testandset (int *spinlock);
-
 /* Spinlock implementation; required.  */
 /* Spinlock implementation; required.  */
 PT_EI long int
 PT_EI long int
 testandset (int *spinlock)
 testandset (int *spinlock)
 {
 {
-  register long int ret = 1;
+  int i = 1;
+  asm ("swap%I0 %M0, %1" : "+m"(*(volatile int *)spinlock), "+r"(i));
+  return i;
+}
 
 
-  __asm__ __volatile__("swap%I1\t%M1,%0"
+/* We want the OS to assign stack addresses.  */
-		       : "+r"(ret), "+m"(*spinlock));
+#define FLOATING_STACKS 1
 
 
-  return ret;
+/* This symbol is defined by the ABI as the stack size requested by
-}
+   the main program.  */
+extern char __stacksize;
+#define ARCH_STACK_MAX_SIZE ((unsigned long)&__stacksize)
+
+/* Memory barrier; default is to do nothing */
+#define MEMORY_BARRIER() __asm__ __volatile__("membar" : : : "memory")
+/* Write barrier.  */
+#define WRITE_MEMORY_BARRIER() __asm__ __volatile__("membar" : : : "memory")
+
+/* Return the thread descriptor for the current thread.  */
+register struct _pthread_descr_struct *THREAD_SELF asm ("gr29");
+#define THREAD_SELF THREAD_SELF
+
+/* Initialize the thread-unique value.  */
+#define INIT_THREAD_SELF(descr, nr) \
+  (THREAD_SELF = descr)
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  stack_pointer
+register char * stack_pointer __asm__ ("sp");
+
+#endif
 
 
 #endif /* pt-machine.h */
 #endif /* pt-machine.h */