浏览代码

Patch from Martin Proulx <mproulx@okiok.com> to support
the i960 architecture.

Eric Andersen 22 年之前
父节点
当前提交
b34e006872

+ 219 - 0
extra/Configs/Config.i960

@@ -0,0 +1,219 @@
+# Library Configuration rules for uClibc
+#
+# This file contains rules which are shared between multiple Makefiles.  All
+# normal configuration options live in the file named "Config".  You probably
+# should not mess with this file unless you know what you are doing...  
+# 
+# Copyright (C) 2000 by Lineo, inc.
+# Copyright (C) 2000,2001 Erik Andersen <andersee@debian.org>
+#
+# 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
+#
+# Derived in part from the Linux-8086 C library, the GNU C Library, and several
+# other sundry sources.  Files within this library are copyright by their
+# respective copyright holders.
+
+NATIVE_CC = gcc
+
+# If you are running a cross compiler, you may want to set this
+# to something more interesting...  Target architecture is determined
+# by asking this compiler what arch it compiles stuff for.
+CROSS = i960-intel-coff-
+CC = $(CROSS)gcc
+AR = $(CROSS)ar
+LD = $(CROSS)ld
+NM = $(CROSS)nm
+STRIPTOOL = $(CROSS)strip
+#STRIPTOOL = /bin/true
+
+# Set the following to `true' to make a debuggable build, and `false' for
+# production builds.
+DODEBUG = false
+
+# Compiler warnings you want to see 
+WARNINGS=-Wall
+
+# Note that the kernel source you use to compile with should be the same as the
+# Linux kernel you run your apps on.  uClibc doesn't even try to achieve binary
+# compatibility across kernel versions.  So don't expect, for example, uClibc
+# compiled with Linux kernel 2.0.x to implement lchown properly, since 2.0.x
+# can't do that. Similarly, if you compile uClibc vs Linux 2.4.x kernel headers,
+# but then run on Linux 2.0.x, lchown will be compiled into uClibc, but won't
+# work at all.  You have been warned.
+KERNEL_SOURCE=/home/mproulx/uClinux/linux-2.0.x
+
+# Set this to `false' if your CPU doesn't have a memory management unit (MMU).
+# Set it to `true' otherwise.
+HAS_MMU = false
+
+# Set this to `false' if you don't have/need basic floating point support
+# support in libc (strtod, printf, scanf).  Set it to `true' otherwise.
+# If this is not true, then libm will not be built.
+HAS_FLOATING_POINT = false
+
+# Set to `true' if you want the math library to contain the full set
+# of C99 math library features.  Costs an extra 35k or so on x86. 
+DO_C99_MATH = false
+
+# Set this to `false' if you don't have/need "(unsigned) long long int" support.
+# Set it to `true' otherwise.
+# Affects *printf and *scanf functions.
+# Also omits strto(u)ll, and (u)lltostr from the library if `false'.
+HAS_LONG_LONG = true
+
+# Set this to 'false if you don't need shadow password support.
+HAS_SHADOW = false
+
+# Set this to `false' if you don't have/need locale support; `true' otherwise.
+# Note: Currently only affects the ctype functions.  You must also generate
+# a locale file for anything but the C locale.  See directory extra/locale for
+# a utility to do so.  Also see the following option.
+HAS_LOCALE = false
+
+# Set this to the path of your uClibc locale file directory.
+# Warning!  This must be different than the glibc locale directory to avoid
+# name conflicts, as the locale files are entirely different in format!
+LOCALE_DIR = "/usr/share/uClibc-locale/"
+
+# This specifies which malloc implementation is used.
+# "malloc-simple" is very, very small, but is also very, very dumb 
+# and does not try to make good use of memory or clean up after itself.
+#
+# "malloc" on the other hand is a bit bigger, but is pretty smart thereby
+# minimizing memory wastage and reusing already allocated memory.  This 
+# can be lots faster and safer IMHO.
+#
+# "malloc-930716" is from libc-5.3.12 and was/is the standard gnu malloc.
+# It is actually smaller than "malloc", at least on i386.  Right now, it
+# only works on i386 (and maybe m68k) because it needs sbrk.
+#MALLOC = malloc-simple
+MALLOC = malloc 
+#MALLOC = malloc-930716
+
+# Having brk allows one to use malloc-930716, which is an order
+# of magnitude faster then "malloc" for most allocations, but 
+# will do very bad things on MMU-less systems...
+EXCLUDE_BRK=true
+
+# If you want to collect common syscall code into one function, set to this to
+# `true'.  Set it to false otherwise.
+# On i386 this saves about than 2.8k over all syscalls.
+# The idea came from the implementation in dietlibc.
+# At present, only affects i386.
+UNIFIED_SYSCALL = false
+
+# If you want large file support (greater then 2 GiB) turn this on.
+# Do not enable this unless your kernel provides large file support.
+DOLFS = false
+
+# Posix regular expression code is really big -- 27k all by itself.
+# If you don't use regular expressions, turn this off and save space.
+# Of course, if you only staticly link, leave this on, since it will
+# only be included in your apps if you use regular expressions. 
+INCLUDE_REGEX=true
+
+# If you want to include RPC support, enable this.  RPC is almost never used 
+# for anything except NFS support, so unless you plan to use NFS, leave this
+# disabled.  This is off by default.
+INCLUDE_RPC = true
+
+# If you want to include support for the next version of the Internet
+# Protocol: IP version 6, enable this.  This is off by default.
+INCLUDE_IPV6 = false
+
+# If you want to include threads support, enable this.  The C library will
+# be compiled thread-safe, and the libpthread library will be built.
+INCLUDE_THREADS = false
+
+# If you want to support only Unix 98 PTYs enable this.  Some older
+# applications may need this disabled.  For most current programs, 
+# you can generally leave this true.
+UNIX98PTY_ONLY = false
+
+# Enable this if /dev/pts is on a devpts or devfs file system.  Both
+# these filesystems automatically manage permissions on the /dev/pts 
+# devices.  You may need to mount this fs on /dev/pts for this to work. 
+# This is true by default.
+ASSUME_DEVPTS = true
+
+
+# If you want to compile the library as PIC code, turn this on.
+# This is automagically enabled when HAVE_SHARED is true
+DOPIC = false
+
+#
+# ARCH_CFLAGS if your have something special to add to the CFLAGS
+#
+ARCH_CFLAGS  = -mrp
+#
+#
+# get this from elsewhere, maybe
+#
+OPTIMIZATION = -O2 $(DEBUG_CFLAGS)
+
+# This is a COFF compiler (ick), so disable all the cool stuff
+HAVE_ELF = false
+
+
+
+# Enable support for shared libraries?  If this is false, you can
+# ignore all the rest of the options in this file...
+HAVE_SHARED = false
+
+# uClibc has a native shared library loader for some architectures.
+BUILD_UCLIBC_LDSO=false
+
+# If you are using shared libraries, but do not want/have a native
+# uClibc shared library loader, please specify the name of your
+# system's shared library loader here...
+#SYSTEM_LDSO=/lib/ld-linux.so.2
+
+# When using shared libraries, this path is the location where the
+# shared library will be invoked.  This value will be compiled into
+# every binary compiled with uClibc.  
+#
+# BIG FAT WARNING:  
+# If you do not have a shared library loader with the correct name
+# sitting in the directory this points to, your binaries will not run.
+#SHARED_LIB_LOADER_PATH=$(DEVEL_PREFIX)/lib
+
+# DEVEL_PREFIX is the directory into which the uClibc development
+# environment will be installed.   The result will look something 
+# like the following:
+#   DEVEL_PREFIX/
+#	bin/            <contains gcc, ld, etc>
+#	lib/            <contains all runtime and static libs>
+#	include/        <Where all the header files go>
+# This value is used by the 'make install' Makefile target.  Since this
+# directory is compiled into the uclibc cross compiler spoofer, you
+# have to recompile if you change this value...
+DEVEL_PREFIX = /usr/local/cross-compilers/i960-intel-coff
+
+# SYSTEM_DEVEL_PREFIX is the directory prefix used when installing
+# usr/bin/arch-uclibc-gcc, usr/bin/arch-uclibc-ld, etc.   This is only
+# used by the 'make install' target, and is not compiled into anything.
+# This defaults to $DEVEL_PREFIX, but makers of .rpms and .debs will
+# want to set this to "/" instead.
+#SYSTEM_DEVEL_PREFIX = $(DEVEL_PREFIX)
+SYSTEM_DEVEL_PREFIX = /tmp/uclibc-trashed
+
+# If you want 'make install' to install everything under a temporary
+# directory, the define PREFIX during the install step,
+# i.e., 'make PREFIX=/var/tmp/uClibc install'.
+#PREFIX = $(TOPDIR)/_install
+
+# C defiend symbols prefix charactor
+C_SYMBOL_PREFIX = _
+

+ 4 - 0
libc/sysdeps/linux/i960/AUTHORS

@@ -0,0 +1,4 @@
+The initial support (inspired by what was done in an old i960 port of uC-libc):
+
+Martin Proulx <mproulx at okiok.com>
+http://www.okiok.com

+ 80 - 0
libc/sysdeps/linux/i960/Makefile

@@ -0,0 +1,80 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2000 by Lineo, inc.
+# Copyright (C) 2000,2001 Erik Andersen <andersen@uclibc.org>
+#
+# 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
+#
+# Derived in part from the Linux-8086 C library, the GNU C Library, and several
+# other sundry sources.  Files within this library are copyright by their
+# respective copyright holders.
+
+USE_CRT0_C=false
+
+TOPDIR=../../../../
+include $(TOPDIR)Rules.mak
+ASFLAGS=$(CFLAGS)
+
+ifeq ($(USE_CRT0_C),true)
+CRT0=crt0.c
+CRT0_OBJ=$(patsubst %.c,%.o, $(CRT0))
+else
+CRT0=crt0.S
+CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
+endif
+
+SSRC=clone.S _mmap.S setjmp.S vfork.S
+ifeq ($(UNIFIED_SYSCALL),true)
+	SSRC += __uClibc_syscall.S
+endif
+SOBJS=$(patsubst %.S,%.o, $(SSRC))
+
+CSRC=
+COBJS=$(patsubst %.c,%.o, $(CSRC))
+
+OBJS=$(SOBJS) $(COBJS)
+
+
+all: $(OBJS) $(LIBC)
+
+$(LIBC): ar-target 
+
+ar-target: $(OBJS) $(CRT0_OBJ)
+	$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
+	cp $(CRT0_OBJ) $(TOPDIR)lib/$(CRT0_OBJ)
+
+ifeq ($(USE_CRT0_C),true)
+$(CRT0_OBJ): %.o : %.c
+else
+$(CRT0_OBJ): %.o : %.S
+endif
+	$(CC) $(CFLAGS) -c $< -o $@
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(SOBJS): %.o : %.S
+	$(CC) $(CFLAGS) -c $< -o $@
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(COBJS): %.o : %.c
+	$(CC) $(CFLAGS) -c $< -o $@
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
+headers:
+
+
+clean:
+	rm -f *.[oa] *~ core
+	rm -f bits/syscall.h
+

+ 72 - 0
libc/sysdeps/linux/i960/README

@@ -0,0 +1,72 @@
+Overview
+---------------------------------------------------------------------------
+
+This is the README file for the i960 support in uClibc.
+
+This has been tested with gcc 2.95.3 and i960-intel-coff target.
+
+There is no support at all to compile with the intel CTOOLS, as this would
+have required too many changes to uClibc.  So you won't see any support 
+in the asm files for position independent data or code.
+
+Quirks needed
+---------------------------------------------------------------------------
+
+prepended underscore
+--------------------
+
+As the i960 compiler prepends an underscore to symbols, it is critical that
+the Config file define C_SYMBOL_PREFIX as
+    C_SYMBOL_PREFIX = _
+to make sure that underscores are applied to symbol names when needed.
+
+
+__va_copy in va-i960.h
+----------------------
+
+When compiled with gcc-2.95, the __va_copy macro in va-i960.h seems to be broken
+and it has to be modified in order for uClibc to compile correctly.
+
+Change:
+
+#define __va_copy(dest, src) (dest) = (src)
+
+To:
+
+#define __va_copy(dest, src)  dest[0] = src[0]; dest[1] = src[1]
+
+
+gcc integration
+---------------------------------------------------------------------------
+
+I'm personnaly not using the gcc-uClibc wrapper.
+I've preferred modifying the specs file so that the i960-intel-coff compiler
+directly compiles with uClibc.
+
+First, compile and install the standard i960-intel-coff compiler, which is meant
+to be used with newlib.
+
+Then, compile uClibc, installing over the newlib include files and libraries.
+
+Update the specs file with the included specs.uclinux.gcc-2.95.i960-intel-coff
+
+This specs file always build relocatable objects, which has the disadvantage
+of not letting you know if the link is missing any symbols.
+
+coff2flt
+---------------------------------------------------------------------------
+
+In order to run the executables under uClinux, fully relocatable binaries 
+need to be built using coff2flt.
+
+We have built a working coff2flt that works with the i960 and the current version
+of binfmt_flat with uClinux.
+
+Contact Martin Proulx <mproulx at okiok.com> for further informations.
+
+
+
+
+
+Check: 
+    _mmap.S: besoin???

+ 52 - 0
libc/sysdeps/linux/i960/_mmap.S

@@ -0,0 +1,52 @@
+#
+# __mmap.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd.  http://www.okiok.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.,
+# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
+#
+
+#include <sys/syscall.h>
+
+/* This is a plain system call.  The 6 arguments are already set up correctly */
+/* void  *  mmap(void  *start,  size_t length, int prot , int flags, int fd, off_t offset) */
+     
+           
+        .globl _mmap
+_mmap:  
+        mov     g13, r3
+        ldconst __NR_mmap, g13
+        calls   0
+        mov     r3, g13
+
+        /* We now need to check if the return value is a small negative integer.                    */
+        /* This is somewhat tricky as the return code (normally an address) is an                   */
+        /* unsigned type, or an ordinal in i960 assembler.                                          */
+        /* We'll use the fact that, integers from -256 to -1 are ordinals 0xFFFFFF00 to 0xFFFFFFFF. */
+        /* So by checking that the return address is in the top range of the ordinals, we'll        */
+        /* in fact be checking if it's not an encoded negated erro code.                            */
+
+        /* The range -256 to -1 should be enough since that in uClinux 2.0.39, there are            */
+        /* 124 system calls for the i960.                                                           */
+        
+        ldconst 0xFFFFFF00, r3  /* This is the integer's -256 representation */
+        cmpobl  g0, r3, 1f      /* Something smaller than this means it's out of the range, and a valid address */
+        subi    g0, 0, r3       /* If it's an errno, save its negated (now positive) value in _errno. */
+        st      r3, _errno      
+        subi    1, 0, g0        /* And return -1. */
+1:
+        ret

+ 15 - 0
libc/sysdeps/linux/i960/bits/endian.h

@@ -0,0 +1,15 @@
+/* This file should define __BYTE_ORDER as appropriate for the machine
+   in question.  See string/endian.h for how to define it.
+
+   If only the stub bits/endian.h applies to a particular configuration,
+   bytesex.h is generated by running a program on the host machine.
+   So if cross-compiling to a machine with a different byte order,
+   the bits/endian.h file for that machine must exist.  */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+

+ 179 - 0
libc/sysdeps/linux/i960/bits/fcntl.h

@@ -0,0 +1,179 @@
+/* O_*, F_*, FD_* bit values for Linux.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000 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	_FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+   located on an ext2 file system */
+#define O_ACCMODE	   0003
+#define O_RDONLY	     00
+#define O_WRONLY	     01
+#define O_RDWR		     02
+#define O_CREAT		   0100	/* not fcntl */
+#define O_EXCL		   0200	/* not fcntl */
+#define O_NOCTTY	   0400	/* not fcntl */
+#define O_TRUNC		  01000	/* not fcntl */
+#define O_APPEND	  02000
+#define O_NONBLOCK	  04000
+#define O_NDELAY	O_NONBLOCK
+#define O_SYNC		 010000
+#define O_FSYNC		 O_SYNC
+#define O_ASYNC		 020000
+
+#ifdef __USE_GNU
+# define O_DIRECT	 040000	/* Direct disk access.	*/
+# define O_DIRECTORY	0200000	/* Must be a directory.	 */
+# define O_NOFOLLOW	0400000	/* Do not follow links.	 */
+#endif
+
+/* For now Linux has synchronisity options for data and read operations.
+   We define the symbols here but let them do the same as O_SYNC since
+   this is a superset.	*/
+#if defined __USE_POSIX199309 || defined __USE_UNIX98
+# define O_DSYNC	O_SYNC	/* Synchronize data.  */
+# define O_RSYNC	O_SYNC	/* Synchronize read operations.	 */
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define O_LARGEFILE	0100000
+#endif
+
+/* Values for the second argument to `fcntl'.  */
+#define F_DUPFD		0	/* Duplicate file descriptor.  */
+#define F_GETFD		1	/* Get file descriptor flags.  */
+#define F_SETFD		2	/* Set file descriptor flags.  */
+#define F_GETFL		3	/* Get file status flags.  */
+#define F_SETFL		4	/* Set file status flags.  */
+#ifndef __USE_FILE_OFFSET64
+# define F_GETLK	5	/* Get record locking info.  */
+# define F_SETLK	6	/* Set record locking info (non-blocking).  */
+# define F_SETLKW	7	/* Set record locking info (blocking).	*/
+#else
+# define F_GETLK	F_GETLK64  /* Get record locking info.	*/
+# define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
+# define F_SETLKW	F_SETLKW64 /* Set record locking info (blocking).  */
+#endif
+#define F_GETLK64	12	/* Get record locking info.  */
+#define F_SETLK64	13	/* Set record locking info (non-blocking).  */
+#define F_SETLKW64	14	/* Set record locking info (blocking).	*/
+
+#if defined __USE_BSD || defined __USE_XOPEN2K
+# define F_SETOWN	8	/* Get owner of socket (receiver of SIGIO).  */
+# define F_GETOWN	9	/* Set owner of socket (receiver of SIGIO).  */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETSIG	10	/* Set number of signal to be sent.  */
+# define F_GETSIG	11	/* Get number of signal to be sent.  */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETLEASE	1024	/* Set a lease.	 */
+# define F_GETLEASE	1025	/* Enquire what lease is active.  */
+# define F_NOTIFY	1026	/* Request notfications on a directory.	 */
+#endif
+
+/* For F_[GET|SET]FL.  */
+#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
+
+/* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
+#define F_RDLCK		0	/* Read lock.  */
+#define F_WRLCK		1	/* Write lock.	*/
+#define F_UNLCK		2	/* Remove lock.	 */
+
+/* For old implementation of bsd flock().  */
+#define F_EXLCK		4	/* or 3 */
+#define F_SHLCK		8	/* or 4 */
+
+#ifdef __USE_BSD
+/* Operations for bsd flock(), also used by the kernel implementation.	*/
+# define LOCK_SH	1	/* shared lock */
+# define LOCK_EX	2	/* exclusive lock */
+# define LOCK_NB	4	/* or'd with one of the above to prevent
+				   blocking */
+# define LOCK_UN	8	/* remove lock */
+#endif
+
+#ifdef __USE_GNU
+# define LOCK_MAND	32	/* This is a mandatory flock:	*/
+# define LOCK_READ	64	/* ... which allows concurrent read operations.	 */
+# define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */
+# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.	 */
+#endif
+
+#ifdef __USE_GNU
+/* Types of directory notifications that may be requested with F_NOTIFY.  */
+# define DN_ACCESS	0x00000001	/* File accessed.  */
+# define DN_MODIFY	0x00000002	/* File modified.  */
+# define DN_CREATE	0x00000004	/* File created.  */
+# define DN_DELETE	0x00000008	/* File removed.  */
+# define DN_RENAME	0x00000010	/* File renamed.  */
+# define DN_ATTRIB	0x00000020	/* File changed attibutes.  */
+# define DN_MULTISHOT	0x80000000	/* Don't remove notifier.  */
+#endif
+
+struct flock
+  {
+    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/
+    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
+#ifndef __USE_FILE_OFFSET64
+    __off_t l_start;	/* Offset where the lock begins.  */
+    __off_t l_len;	/* Size of the locked area; zero means until EOF.  */
+#else
+    __off64_t l_start;	/* Offset where the lock begins.  */
+    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
+#endif
+    __pid_t l_pid;	/* Process holding the lock.  */
+  };
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+  {
+    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/
+    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
+    __off64_t l_start;	/* Offset where the lock begins.  */
+    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
+    __pid_t l_pid;	/* Process holding the lock.  */
+  };
+#endif
+
+/* Define some more compatibility macros to be backward compatible with
+   BSD systems which did not managed to hide these kernel macros.  */
+#ifdef	__USE_BSD
+# define FAPPEND	O_APPEND
+# define FFSYNC		O_FSYNC
+# define FASYNC		O_ASYNC
+# define FNONBLOCK	O_NONBLOCK
+# define FNDELAY	O_NDELAY
+#endif /* Use BSD.  */
+
+/* Advise to `posix_fadvise'.  */
+#ifdef __USE_XOPEN2K
+# define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
+# define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
+# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.	 */
+# define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
+# define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
+# define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
+#endif

+ 93 - 0
libc/sysdeps/linux/i960/bits/mman.h

@@ -0,0 +1,93 @@
+/* Definitions for POSIX memory map interface.  Linux/i960 version.
+   Copyright (C) 1997, 2000 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_MMAN_H
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+/* The following definitions basically come from the kernel headers.
+   But the kernel header is not namespace clean.  */
+
+
+/* Protections are chosen from these bits, OR'd together.  The
+   implementation does not necessarily support PROT_EXEC or PROT_WRITE
+   without PROT_READ.  The only guarantees are that no writing will be
+   allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ	0x1		/* Page can be read.  */
+#define PROT_WRITE	0x2		/* Page can be written.  */
+#define PROT_EXEC	0x4		/* Page can be executed.  */
+#define PROT_NONE	0x0		/* Page can not be accessed.  */
+
+/* Sharing types (must choose one and only one of these).  */
+#define MAP_SHARED	0x01		/* Share changes.  */
+#define MAP_PRIVATE	0x02		/* Changes are private.  */
+#ifdef __USE_MISC
+# define MAP_TYPE	0x0f		/* Mask for type of mapping.  */
+#endif
+
+/* Other flags.  */
+#define MAP_FIXED	0x10		/* Interpret addr exactly.  */
+#ifdef __USE_MISC
+# define MAP_FILE	0
+# define MAP_ANONYMOUS	0x20		/* Don't use a file.  */
+# define MAP_ANON	MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific.  */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN	0x0100		/* Stack-like segment.  */
+# define MAP_DENYWRITE	0x0800		/* ETXTBSY */
+# define MAP_EXECUTABLE	0x1000		/* Mark it as an executable.  */
+# define MAP_LOCKED	0x2000		/* Lock the mapping.  */
+# define MAP_NORESERVE	0x4000		/* Don't check for reservations.  */
+#endif
+
+/* Flags to `msync'.  */
+#define MS_ASYNC	1		/* Sync memory asynchronously.  */
+#define MS_SYNC		4		/* Synchronous memory sync.  */
+#define MS_INVALIDATE	2		/* Invalidate the caches.  */
+
+/* Flags for `mlockall'.  */
+#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */
+#define MCL_FUTURE	2		/* Lock all additions to address
+					   space.  */
+
+/* Flags for `mremap'.  */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE	1
+#endif
+
+/* Advice to `madvise'.  */
+#ifdef __USE_BSD
+# define MADV_NORMAL	 0	/* No further special treatment.  */
+# define MADV_RANDOM	 1	/* Expect random page references.  */
+# define MADV_SEQUENTIAL 2	/* Expect sequential page references.  */
+# define MADV_WILLNEED	 3	/* Will need these pages.  */
+# define MADV_DONTNEED	 4	/* Don't need these pages.  */
+#endif
+
+/* The POSIX people had to invent similar names for the same things.  */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL	0 /* No further special treatment.  */
+# define POSIX_MADV_RANDOM	1 /* Expect random page references.  */
+# define POSIX_MADV_SEQUENTIAL	2 /* Expect sequential page references.  */
+# define POSIX_MADV_WILLNEED	3 /* Will need these pages.  */
+# define POSIX_MADV_DONTNEED	4 /* Don't need these pages.  */
+#endif

+ 33 - 0
libc/sysdeps/linux/i960/bits/setjmp.h

@@ -0,0 +1,33 @@
+/* Define the machine-dependent type `jmp_buf'.  i960 version.  */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+/*
+ * assume that every single local and global register
+ * must be saved.
+ *
+ * ___SAVEREGS is the number of quads to save.
+ *
+ * Using the structure will guarantee quad-word alignment for the
+ * jmp_buf type.
+ */
+
+#define ___SAVEREGS 8
+
+typedef struct __jmp_buf__ {
+  long _q0;
+  long _q1;
+  long _q2;
+  long _q3;
+} __attribute__ ((aligned (16))) __jmp_buf[___SAVEREGS] ;
+
+/* I have not yet figured out what this should be for the i960... */
+
+#if 0
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+  ((void *) (address) < (jmpbuf)[0].__sp)
+#endif

+ 10 - 0
libc/sysdeps/linux/i960/bits/syscalls.h

@@ -0,0 +1,10 @@
+/*
+ * nothing needed here until we want pthread support or similar
+ */
+
+#include <features.h>
+/* Do something very evil for now.  Until we include our out syscall
+ * macros, short circuit bits/syscall.h  and use asm/unistd.h instead */
+#define _BITS_SYSCALL_H
+#include <asm/unistd.h>
+

+ 19 - 0
libc/sysdeps/linux/i960/bits/wordsize.h

@@ -0,0 +1,19 @@
+/* Copyright (C) 1999 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.  */
+
+#define __WORDSIZE	32

+ 62 - 0
libc/sysdeps/linux/i960/clone.S

@@ -0,0 +1,62 @@
+#
+# clone.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd.  http://www.okiok.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.,
+# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
+#
+
+#include <sys/syscall.h>        
+#include <bits/errno.h>
+        
+/* clone is even more special than fork as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+        
+/* int _clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+        .globl __clone
+__clone: 
+        /* set up new stack image in regs r4-r7; argument will be in r3 in child.  */
+        ldconst 0, r4                   /* pfp == 0 */
+        addo    16, g1, r5              /* sp == newfp + 16 */
+        mov     g0, r6                  /* rip == fnc */
+        mov     g2, r7
+        stq     r4, (g1)
+
+        addo    sp, 4, sp
+        st      g10, -4(sp)
+        mov     sp, g10
+        ldconst __NR_clone, g13
+        calls   0
+
+        /* Do the system call */
+        cmpibg  0, g0, syscall_error    /* if < 0, error */
+        be      thread_start            /* if == 0, we're the child */
+        ret                             /* we're the parent */
+
+syscall_error:
+        not     g0, r3
+        callx   ___errno_location
+        st      r3, (g0)
+        ret
+
+thread_start:
+        # our new pfp is in g1; here we go
+        flushreg
+        mov     g1, pfp
+        flushreg
+        ret

+ 49 - 0
libc/sysdeps/linux/i960/crt0.S

@@ -0,0 +1,49 @@
+#
+# clone.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd.  http://www.okiok.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.,
+# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+/*
+ *        
+ * The behavior in this file is tightly coupled with how the linux kernel sets things up
+ * on the stack before calling us.
+ *
+ * Currently fs/binfmt_flat.c (for STACK_GROWS_UP) and arch/i960/kernel/process.c
+ * build things so that a pointer to argc is left in g13 by start_thread().
+ *
+ * ^
+ * |                        <- sp somewhere around here, after being aligned.
+ * |        
+ * |envp    -> envp[0]
+ * |argv    -> argv[0]
+ * |argc                    <- g13
+ *
+ * A complete picture of how things are set up can be seen in the comments of
+ * create_flat_tables_stack_grows_up in fs/binfmt_flat.c
+ *
+ * I believe having to use this register could probably be avoided.
+ *        
+ */
+        
+        .globl  start
+start:
+        mov     g13, r3
+        ldt     (r3), g0
+        callx   ___uClibc_main
+        
+/* We might want to add some instruction so that it crashes if main returns */

+ 124 - 0
libc/sysdeps/linux/i960/setjmp.S

@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * 
+ * Copyright (c) 1993 Intel Corporation
+ * 
+ * Intel hereby grants you permission to copy, modify, and distribute this
+ * software and its documentation.  Intel grants this permission provided
+ * that the above copyright notice appears in all copies and that both the
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  In addition, Intel grants this permission provided that
+ * you prominently mark as "not part of the original" any modifications
+ * made to this software or documentation, and that the name of Intel
+ * Corporation not be used in advertising or publicity pertaining to
+ * distribution of the software or the documentation without specific,
+ * written prior permission.
+ * 
+ * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR
+ * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY
+ * OR FITNESS FOR A PARTICULAR PURPOSE.  Intel makes no guarantee or
+ * representations regarding the use of, or the results of the use of,
+ * the software and documentation in terms of correctness, accuracy,
+ * reliability, currentness, or otherwise; and you rely on the software,
+ * documentation and results solely at your own risk.
+ *
+ * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS,
+ * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES
+ * OF ANY KIND.  IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM
+ * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER.
+ * 
+ ******************************************************************************/
+
+/***************************************************************************
+ *
+ * Modified from the original in order to fit with 
+ * uClibc's setjmp, _setjmp, __sigsetjmp and ___sigjmp_save.
+ *
+ *
+ * int setjmp (jmp_buf __env)  is the BSD style setjmp function.
+ * It simply calls __sigsetjmp(env, 1)
+ *
+ * int _setjmp (jmp_buf __env) is the posix style setjmp function.
+ * It simply calls __sigsetjmp(env, 0)
+ * This is the one normally used.
+ *
+ ***************************************************************************/
+
+        .text 
+        .align  4
+        .globl _setjmp
+        .globl __setjmp
+        
+_setjmp:
+        mov 1, g1   /* __sigsetjmp(env, 1) */
+        bx __sigsetjmp
+
+__setjmp:
+        mov 0, g1   /* __sigsetjmp(env, 0) */
+        bx __sigsetjmp     
+
+        
+/******************************************************************************/
+/*                                                                            */
+/*      setjmp(), longjmp()                                                   */
+/*                                                                            */
+/******************************************************************************/
+	.file "setjmp.S"
+	.text
+	/* .link_pix */
+
+	.align	4
+	.globl	__sigsetjmp
+__sigsetjmp:
+	flushreg
+	andnot	0xf,pfp,g2	/* get pfp, mask out return status bits */
+	st	g2, 0x58(g0)	/* save fp of caller*/
+   /* save globals not killed by the calling convention */
+	stq	g8, 0x40(g0)	/* save g8-g11*/
+	st	g12, 0x50(g0)	/* save g12*/
+	st	g14, 0x54(g0)	/* save g14*/
+   /* save previous frame local registers */
+	ldq	(g2), g4	/* get previous frame pfp, sp, rip, r3 */
+	stq	g4, (g0)	/* save pfp, sp, rip, r3 */
+	ldq	0x10(g2), g4	/* get previous frame r4-r7 */
+	stq	g4, 0x10(g0)	/* save r4-r7 */
+	ldq	0x20(g2), g4	/* get previous frame r8-r11 */
+	stq	g4, 0x20(g0)	/* save r8-r11 */
+	ldq	0x30(g2), g4	/* get previous frame r12-r15 */
+	stq	g4, 0x30(g0)	/* save r12-r15 */
+
+        bx ___sigjmp_save   
+
+   /*
+    * fake a return to the place that called the corresponding __sigsetjmp
+   */
+	.align	4
+	.globl	___longjmp
+___longjmp:
+	call	0f		/* ensure there is at least one stack frame */
+
+0:
+	flushreg		/* do this before swapping stack */
+	ld	0x58(g0), pfp	/* get fp of caller of setjmp */
+   /* restore local registers 
+    * the following code modifies the frame of the function which originally 
+    *  called setjmp.
+    */
+	ldq	(g0), g4	/* get pfp, sp, rip, r3 */
+	stq	g4, (pfp)	/* restore pfp, sp, rip, r3 */
+	ldq	0x10(g0), g4	/* get r4-r7 */
+	stq	g4, 0x10(pfp)	/* restore r4-r7 */
+	ldq	0x20(g0), g4	/* get r8-r11 */
+	stq	g4, 0x20(pfp)	/* restore r8-r11 */
+	ldq	0x30(g0), g4	/* get r12-r15 */
+	stq	g4, 0x30(pfp)	/* restore r12-r15 */
+   /* restore global registers */
+	ldq	0x40(g0), g8	/* get old g8-g11 values */
+	ld	0x50(g0), g12	/* get old g12 value */
+	ld	0x54(g0), g14	/* get old g14 value */
+
+	mov	g1, g0		/* get return value */
+	cmpo	g0, 0		/* make sure it is not zero */
+	bne	0f
+	mov	1, g0		/* return 1 by default */
+0:
+	ret			/* return to caller of __sigsetjmp */

+ 64 - 0
libc/sysdeps/linux/i960/specs.uclinux.gcc-2.95.i960-intel-coff

@@ -0,0 +1,64 @@
+*asm:
+%{mka:-AKA}%{mkb:-AKB}%{msa:-ASA}%{msb:-ASB}	%{mmc:-AMC}%{mca:-ACA}%{mcc:-ACC}%{mcf:-ACF}        %{mja:-AJX}%{mjd:-AJX}%{mjf:-AJX}%{mrp:-AJX}	%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-AKB}}}}}}}}}}}}	%{mlink-relax:-linkrelax}
+
+*asm_final:
+
+
+*cpp:
+%{mic*:-D__i960			%{mka:-D__i960KA}%{mkb:-D__i960KB}			%{mja:-D__i960JA}%{mjd:-D__i960JD}%{mjf:-D__i960JF}			%{mrp:-D__i960RP}			%{msa:-D__i960SA}%{msb:-D__i960SB}			%{mmc:-D__i960MC}			%{mca:-D__i960CA}%{mcc:-D__i960CC}			%{mcf:-D__i960CF}}	%{mka:-D__i960KA__ -D__i960_KA__}	%{mkb:-D__i960KB__ -D__i960_KB__}	%{msa:-D__i960SA__ -D__i960_SA__}	%{msb:-D__i960SB__ -D__i960_SB__}	%{mmc:-D__i960MC__ -D__i960_MC__}	%{mca:-D__i960CA__ -D__i960_CA__}	%{mcc:-D__i960CC__ -D__i960_CC__}	%{mcf:-D__i960CF__ -D__i960_CF__}	%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:		%{!mcc:%{!mcf:-D__i960_KB -D__i960KB__ %{mic*:-D__i960KB}}}}}}}}}	%{mlong-double-64:-D__LONG_DOUBLE_64__}
+
+*cc1:
+%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:%{!mcc:%{!mcf:%{!mja:%{!mjd:%{!mjf:%{!mrp:-mka}}}}}}}}}}}}	 %{!gs*:%{!gc*:%{mbout:%{g*:-gstabs}}		       %{mcoff:%{g*:-gcoff}}		       %{!mbout:%{!mcoff:%{g*:-gstabs}}}}}
+
+*cc1plus:
+
+
+*endfile:
+crtn.o%s
+
+*link:
+%{mka:-AKA}%{mkb:-AKB}%{msa:-ASA}%{msb:-ASB}	%{mmc:-AMC}%{mca:-ACA}%{mcc:-ACC}%{mcf:-ACF}        %{mja:-AJX}%{mjd:-AJX}%{mjf:-AJX}%{mrp:-AJX}	%{mbout:-Fbout}%{mcoff:-Fcoff}	%{mlink-relax:-relax} -r -d
+
+*lib:
+-lc -lgcc
+
+*libgcc:
+
+
+*startfile:
+%{!shared:%{pg:pgcrt0%O%s}%{!pg:%{p:pcrt0%O%s}%{!p:crt0%O%s}}} crti.o%s
+
+*switches_need_spaces:
+
+
+*signed_char:
+%{!fsigned-char:%{!mic*:-D__CHAR_UNSIGNED__}}
+
+*predefines:
+-Di960 -Di80960 -DI960 -DI80960 -Acpu(i960) -Amachine(i960) -Dunix -Dlinux -Asystem(posix) -D__linux__ -D__uClinux__ -DEMBED
+
+*cross_compile:
+1
+
+*version:
+2.95.3
+
+*multilib:
+. !mnumerics !msoft-float !mlong-double-64;float mnumerics !msoft-float !mlong-double-64;soft-float !mnumerics msoft-float !mlong-double-64;ld64 !mnumerics !msoft-float mlong-double-64;float/ld64 mnumerics !msoft-float mlong-double-64;soft-float/ld64 !mnumerics msoft-float mlong-double-64;
+
+*multilib_defaults:
+mnumerics
+
+*multilib_extra:
+
+
+*multilib_matches:
+msb mnumerics;msc mnumerics;mkb mnumerics;mkc mnumerics;mmc mnumerics;mcb mnumerics;mcc mnumerics;mjf mnumerics;msa msoft-float;mka msoft-float;mca msoft-float;mcf msoft-float;mnumerics mnumerics;msoft-float msoft-float;mlong-double-64 mlong-double-64;
+
+*linker:
+collect2
+
+*link_command:
+%{!fsyntax-only:  %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} 			%{r} %{s} %{t} %{u*} %{x} %{z} %{Z}			%{!A:%{!nostdlib:%{!nostartfiles:%S}}}			%{static:} %{L*} %D %o			%{!nostdlib:%{!nodefaultlibs:%G %L %G}}			%{!A:%{!nostdlib:%{!nostartfiles:%E}}}			%{T*}			
+ }}}}}}
+

+ 126 - 0
libc/sysdeps/linux/i960/sys/procfs.h

@@ -0,0 +1,126 @@
+/* Copyright (C) 1996, 1997, 1999, 2000, 2001 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_PROCFS_H
+#define _SYS_PROCFS_H	1
+
+/* This is somewhat modelled after the file of the same name on SVR4
+   systems.  It provides a definition of the core file format for ELF
+   used on Linux.  It doesn't have anything to do with the /proc file
+   system, even though Linux has one.
+
+   Anyway, the whole purpose of this file is for GDB and GDB only.
+   Don't read too much into it.  Don't use it for anything other than
+   GDB unless you know what you are doing.  */
+
+#include <features.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/user.h>
+
+__BEGIN_DECLS
+
+/* Type for a general-purpose register.  */
+typedef unsigned long elf_greg_t;
+
+/* And the whole bunch of them.  We could have used `struct
+   user_regs_struct' directly in the typedef, but tradition says that
+   the register set is an array, which does have some peculiar
+   semantics, so leave it that way.  */
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+/* Register set for the floating-point registers.  */
+typedef struct user_m68kfp_struct elf_fpregset_t;
+
+
+/* Signal info.  */
+struct elf_siginfo
+  {
+    int si_signo;			/* Signal number.  */
+    int si_code;			/* Extra code.  */
+    int si_errno;			/* Errno.  */
+  };
+
+
+/* Definitions to generate Intel SVR4-like core files.  These mostly
+   have the same names as the SVR4 types with "elf_" tacked on the
+   front to prevent clashes with Linux definitions, and the typedef
+   forms have been avoided.  This is mostly like the SVR4 structure,
+   but more Linuxy, with things that Linux does not support and which
+   GDB doesn't really use excluded.  */
+
+struct elf_prstatus
+  {
+    struct elf_siginfo pr_info;		/* Info associated with signal.  */
+    short int pr_cursig;		/* Current signal.  */
+    unsigned long int pr_sigpend;	/* Set of pending signals.  */
+    unsigned long int pr_sighold;	/* Set of held signals.  */
+    __pid_t pr_pid;
+    __pid_t pr_ppid;
+    __pid_t pr_pgrp;
+    __pid_t pr_sid;
+    struct timeval pr_utime;		/* User time.  */
+    struct timeval pr_stime;		/* System time.  */
+    struct timeval pr_cutime;		/* Cumulative user time.  */
+    struct timeval pr_cstime;		/* Cumulative system time.  */
+    elf_gregset_t pr_reg;		/* GP registers.  */
+    int pr_fpvalid;			/* True if math copro being used.  */
+  };
+
+
+#define ELF_PRARGSZ     (80)    /* Number of chars for args.  */
+
+struct elf_prpsinfo
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    unsigned long int pr_flag;		/* Flags.  */
+    unsigned short int pr_uid;
+    unsigned short int pr_gid;
+    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+    /* Lots missing */
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+
+/* The rest of this file provides the types for emulation of the
+   Solaris <proc_service.h> interfaces that should be implemented by
+   users of libthread_db.  */
+
+/* Addresses.  */
+typedef void *psaddr_t;
+
+/* Register sets.  Linux has different names.  */
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+
+/* We don't have any differences between processes and threads,
+   therefore have only one PID type.  */
+typedef __pid_t lwpid_t;
+
+/* Process status and info.  In the end we do provide typedefs for them.  */
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+__END_DECLS
+
+#endif	/* sys/procfs.h */

+ 76 - 0
libc/sysdeps/linux/i960/sys/ucontext.h

@@ -0,0 +1,76 @@
+/* Copyright (C) 1997, 1998, 2000 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.  */
+
+/* Don't rely on this, the interface is currently messed up and may need to
+   be broken to be fixed.  */
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H	1
+
+#include <features.h>
+#include <signal.h>
+
+/* We need the signal context definitions even if they are not used
+   included in <signal.h>.  */
+#include <bits/sigcontext.h>
+
+
+/* Type for general register.  */
+typedef unsigned long int greg_t;
+
+/* Number of general registers.  */
+#define NGREG	32 /* 16 global and 16 local */
+
+/* Container for all general registers.  */
+/* gregset_t must be an array.  The below declared array corresponds to:
+typedef struct gregset {
+	greg_t	g_regs[32];
+	greg_t	g_hi;
+	greg_t	g_lo;
+	greg_t	g_pad[3];
+} gregset_t;  */
+typedef greg_t gregset_t[NGREG];
+
+/* Container for all FPU registers.  */
+typedef struct fpregset {
+    /* No floating point registers on most i960 */
+
+    /* Otherwise, signal the missing implementation */
+#if defined(__i960SB) || defined(__i960KB)
+#error Floating point support is not yet implemented for the i960 platform.
+#endif
+} fpregset_t;
+
+
+/* Context to describe whole processor state.  */
+typedef struct
+  {
+    gregset_t gregs;
+    fpregset_t fpregs;
+  } mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext
+  {
+    unsigned long int uc_flags;
+    struct ucontext *uc_link;
+    stack_t uc_stack;
+    mcontext_t uc_mcontext;
+    __sigset_t uc_sigmask;
+  } ucontext_t;
+
+#endif /* sys/ucontext.h */

+ 40 - 0
libc/sysdeps/linux/i960/vfork.S

@@ -0,0 +1,40 @@
+#
+# clone.S, part of the i960 support for the uClibc library.
+#
+# Copyright (C) 2002 by Okiok Data Ltd.  http://www.okiok.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.,
+# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
+#
+
+#include <sys/syscall.h>
+        
+#ifndef __NR_vfork
+#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
+#endif
+     
+        .globl _vfork
+_vfork: 
+        mov         g13, r3
+        ldconst     __NR_vfork, g13
+        calls       0
+        mov         r3, g13
+        cmpible     0, g0, 1f
+        subo        g0, 0, r3
+        st          r3, _errno
+1:      
+        ret
+