OSDN Git Service

Partial patch from Alexandre Oliva:
authorEric Andersen <andersen@codepoet.org>
Thu, 26 Aug 2004 23:36:04 +0000 (23:36 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 26 Aug 2004 23:36:04 +0000 (23:36 -0000)
- 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.

18 files changed:
libc/sysdeps/linux/frv/Makefile
libc/sysdeps/linux/frv/bits/elf-fdpic.h
libc/sysdeps/linux/frv/bits/kernel_stat.h
libc/sysdeps/linux/frv/bits/stat.h [new file with mode: 0644]
libc/sysdeps/linux/frv/bits/syscalls.h
libc/sysdeps/linux/frv/bits/uClibc_page.h [new file with mode: 0644]
libc/sysdeps/linux/frv/crt0.S
libc/sysdeps/linux/frv/crti.S
libc/sysdeps/linux/frv/crtn.S
libc/sysdeps/linux/frv/crtreloc.c
libc/sysdeps/linux/frv/fstat.c [new file with mode: 0644]
libc/sysdeps/linux/frv/fstat64.c [new file with mode: 0644]
libc/sysdeps/linux/frv/lstat.c [new file with mode: 0644]
libc/sysdeps/linux/frv/lstat64.c [new file with mode: 0644]
libc/sysdeps/linux/frv/stat.c [new file with mode: 0644]
libc/sysdeps/linux/frv/stat64.c [new file with mode: 0644]
libc/sysdeps/linux/frv/xstatconv.c [new file with mode: 0644]
libpthread/linuxthreads/sysdeps/frv/pt-machine.h

index 43752be..0c6978c 100644 (file)
@@ -32,6 +32,7 @@ SSRC=__longjmp.S setjmp.S clone.S vfork.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
 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))
 
 OBJS=$(SOBJS) $(COBJS)
index f47d949..0dbb54b 100644 (file)
@@ -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.
 
 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
 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,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 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
         can't convert it to an integer type beforehand.  */
       unsigned long offset = p - (void*)map->segs[c].p_vaddr;
-      /* We explicitly refrain from checking for one-past-the-end.
-        Zero-sized objects aren't legal, and it's expected that array
-        addresses will be relocated before the addend that would make
-        it one-past-the-end is added.  This gives us a reasonable speed
-        up, and we couldn't possibly disambiguate all cases anyway.  */
-      if (offset < map->segs[c].p_memsz)
+      /* We only check for one-past-the-end for the last segment,
+        assumed to be the data segment, because other cases are
+        ambiguous in the absence of padding between segments, and
+        rofixup already serves as padding between text and data.
+        Unfortunately, unless we special-case the last segment, we
+        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;
     }
             
index c6fc953..c6d6141 100644 (file)
@@ -6,52 +6,79 @@
  * different opinion on the subject... */
 
 struct kernel_stat {
+       unsigned char __pad1[6];
        unsigned short st_dev;
-       unsigned short __pad1;
+
+       unsigned long __pad2;
        unsigned long st_ino;
+
+       unsigned short __pad3;
        unsigned short st_mode;
+       unsigned short __pad4;
        unsigned short st_nlink;
+
+       unsigned short __pad5;
        unsigned short st_uid;
+       unsigned short __pad6;
        unsigned short st_gid;
+
+       unsigned char __pad7[6];
        unsigned short st_rdev;
-       unsigned short __pad2;
-       unsigned long  st_size;
-       unsigned long  st_blksize;
-       unsigned long  st_blocks;
-       unsigned long  st_atime;
-       unsigned long  __unused1;
-       unsigned long  st_mtime;
-       unsigned long  __unused2;
-       unsigned long  st_ctime;
-       unsigned long  __unused3;
-       unsigned long  __unused4;
-       unsigned long  __unused5;
+
+       unsigned long __pad8;
+       unsigned long st_size;
+
+       unsigned long __pad9;           /* align 64-bit st_blocks to 2-word */
+       unsigned long st_blksize;
+
+       unsigned long __pad10;  /* future possible st_blocks high bits */
+       unsigned long st_blocks;        /* Number 512-byte blocks allocated. */
+
+       unsigned long __unused1;
+       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 {
-       unsigned char   __pad0[6];
-       unsigned short  st_dev;
-       unsigned char   __pad1[2];
-#define _HAVE_STAT64___ST_INO
-       unsigned long   __st_ino;
-       unsigned int    st_mode;
-       unsigned int    st_nlink;
-       unsigned long   st_uid;
-       unsigned long   st_gid;
-       unsigned char   __pad2[6];
-       unsigned short  st_rdev;
-       unsigned char   __pad3[2];
-       long long       st_size;
-       unsigned long   st_blksize;
-       unsigned long   __pad4;         /* future possible st_blocks high bits */
-       unsigned long   st_blocks;      /* Number 512-byte blocks allocated. */
-       unsigned long   st_atime;
-       unsigned long   __pad5;
-       unsigned long   st_mtime;
-       unsigned long   __pad6;
-       unsigned long   st_ctime;
-       unsigned long   __pad7;         /* will be high 32 bits of ctime someday */
-       unsigned long long      st_ino;
+       unsigned char __pad1[6];
+       unsigned short st_dev;
+
+       unsigned long long st_ino;
+
+       unsigned int st_mode;
+       unsigned int st_nlink;
+
+       unsigned long st_uid;
+       unsigned long st_gid;
+
+       unsigned char __pad2[6];
+       unsigned short st_rdev;
+
+       long long st_size;
+
+       unsigned long __pad3;           /* align 64-bit st_blocks to 2-word */
+       unsigned long st_blksize;
+
+       unsigned long __pad4;           /* future possible st_blocks high bits */
+       unsigned long st_blocks;        /* Number 512-byte blocks allocated. */
+
+       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 */
diff --git a/libc/sysdeps/linux/frv/bits/stat.h b/libc/sysdeps/linux/frv/bits/stat.h
new file mode 100644 (file)
index 0000000..ae5f059
--- /dev/null
@@ -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 */
index 44dba86..23219d6 100644 (file)
@@ -9,9 +9,6 @@
  * programs.  */
 #include <bits/sysnum.h>
 
-#ifndef __set_errno
-# define __set_errno(val) ((*__errno_location ()) = (val))
-#endif
 #ifndef SYS_ify
 # define SYS_ify(syscall_name)  (__NR_##syscall_name)
 #endif
@@ -19,7 +16,7 @@
 #ifndef __ASSEMBLER__
 
 /* 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) \
 do { \
         unsigned long __sr2 = (res);                                       \
@@ -43,6 +40,10 @@ do { \
 } while (0)
 #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. */
 
 #define _syscall0(type,name) \
diff --git a/libc/sysdeps/linux/frv/bits/uClibc_page.h b/libc/sysdeps/linux/frv/bits/uClibc_page.h
new file mode 100644 (file)
index 0000000..51a6e15
--- /dev/null
@@ -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 */
index 2bed693..a1d07bb 100644 (file)
@@ -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.
 
 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
 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
 License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
@@ -43,11 +52,12 @@ Cambridge, MA 02139, USA.  */
        .weak   _fini
        .type   __uClibc_start_main,%function
 #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:
+       /* 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
           map, that we use to relocate addresses.  */
        call    .Lcall
@@ -74,10 +84,10 @@ _start:
        the last entry, relocated.  */
 
        /* Prepare arguments for uClibc main.  */
-       ld      @(sp, gr0), gr8
+       ld      @(gr21, gr0), gr8
        slli    gr8, #2, gr10
-       add     sp, gr10, gr10
-       addi.p  sp, #4, gr9
+       add     gr21, gr10, gr10
+       addi.p  gr21, #4, gr9
        addi    gr10, #8, gr10
 
        /* Set up an invalid (NULL return address, NULL frame pointer)
index 715ce4a..1788524 100644 (file)
@@ -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.
 
 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
 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,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
index b495bbe..1d58c02 100644 (file)
@@ -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.
 
 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
 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,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
index 32e9ee7..8d20e96 100644 (file)
@@ -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
 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,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
diff --git a/libc/sysdeps/linux/frv/fstat.c b/libc/sysdeps/linux/frv/fstat.c
new file mode 100644 (file)
index 0000000..106f3ee
--- /dev/null
@@ -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)
diff --git a/libc/sysdeps/linux/frv/fstat64.c b/libc/sysdeps/linux/frv/fstat64.c
new file mode 100644 (file)
index 0000000..0f031f5
--- /dev/null
@@ -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
diff --git a/libc/sysdeps/linux/frv/lstat.c b/libc/sysdeps/linux/frv/lstat.c
new file mode 100644 (file)
index 0000000..01d76a2
--- /dev/null
@@ -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)
diff --git a/libc/sysdeps/linux/frv/lstat64.c b/libc/sysdeps/linux/frv/lstat64.c
new file mode 100644 (file)
index 0000000..a6a7c0d
--- /dev/null
@@ -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
diff --git a/libc/sysdeps/linux/frv/stat.c b/libc/sysdeps/linux/frv/stat.c
new file mode 100644 (file)
index 0000000..730435d
--- /dev/null
@@ -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)
diff --git a/libc/sysdeps/linux/frv/stat64.c b/libc/sysdeps/linux/frv/stat64.c
new file mode 100644 (file)
index 0000000..79f7e42
--- /dev/null
@@ -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
diff --git a/libc/sysdeps/linux/frv/xstatconv.c b/libc/sysdeps/linux/frv/xstatconv.c
new file mode 100644 (file)
index 0000000..d7948c0
--- /dev/null
@@ -0,0 +1 @@
+/* We don't need any of this.  */
index 0679280..64df5ff 100644 (file)
@@ -1,6 +1,6 @@
 /* Machine-dependent pthreads configuration and inline functions.
-   ARM version.
-   Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+   FR-V version.
+   Copyright (C) 2004  Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Alexandre Oliva <aoliva@redhat.com>
 
    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; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   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 _PT_MACHINE_H
 #define _PT_MACHINE_H   1
 
+#ifndef __ASSEMBLER__
+
 #ifndef PT_EI
-# define PT_EI extern inline
+# define PT_EI extern inline __attribute__ ((always_inline))
 #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.  */
 PT_EI long int
 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"
-                      : "+r"(ret), "+m"(*spinlock));
+/* We want the OS to assign stack addresses.  */
+#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 */